I just learn call assembly code in C code, as below:
caller.c:
#include <stdio.h>
#include <string.h>
void main(void)
{
    char buf[50];
    int a, b, res;
    char *mystr = "calculating...\n";
    char *emsg  = "Error in adding\n";
    a = 5; b = 10;
    mywrite(1, mystr, strlen(mystr));
    if (myadd(a, b, &res))
    {    
        sprintf(buf, "the result is %d\n", res);
        mywrite(1, buf, strlen(buf));
    }   
    else
    {        
        mywrite(1, emsg, strlen(emsg));
    }
} 
callee.s:
.code32
SYSWRITE = 4
.global mywrite, myadd
.text
mywrite:
    pushl %ebp
    movl  %esp, %ebp
    pushl %ebx
    movl  8(%ebp), %ebx
    movl  12(%ebp), %ecx
    movl  16(%ebp), %edx
    movl  $SYSWRITE, %eax
    int   $0x80
    popl   %ebx
    movl  %ebp, %esp
    popl  %ebp
    ret
myadd:
    pushl %ebp
    movl  %esp, %ebp
    movl  8(%ebp), %eax
    movl  12(%ebp), %edx
    xorl  %ecx, %ecx
    addl  %eax, %edx
    jo    1f
    movl  16(%ebp), %eax
    movl  %edx, (%eax)
    incl  %ecx
1:  movl  %ecx, %eax
    movl  %ebp, %esp
    popl  %ebp
    ret
Then I compile:
as -o callee.o callee.s
gcc -o caller caller.c callee.o
But when run caller:  ./caller, I got this 
Segmentation fault (core dumped)
How to fix it?
 
    