以sum函数为例
int sum(int a,int b)
{
return a+b;
}
它的汇编代码
.text
.global sum
sum:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%eax
addl 12(%ebp),%eax
leave
ret
然后是main函数
int main(void)
{
int a;
int b=12;
int c=24;
a=sum(b,c);
return 0;
}
汇编代码为
.text
.global main
main:
pushl %ebp
movl %esp,%ebp
subl $12,%esp
movl $12,-8(%ebp)
movl $24,-12(%ebp)
pushl -12(%ebp)
pushl -8(%ebp)
call sum
addl $8,%esp
movl %eax,-4(%ebp)
movl $0,%eax
leave
ret
首先看sum函数有两个参数,所以main函数中 pushl -12(%ebp) pushl -8(%ebp) 传入了两个参数。参数传递完成后执行call sum调用sum函数。调用完成后,执行addl $8,%esp 清理栈帧。由于sum函数返回值为int型,所以执行movl %eax,-4(%ebp)将返回值传入给main函数的a变量。
另外如果参数为char ,short,unsigned char ,unsigned short 类型,它们将扩张为int 类型,传入。
返回参数可以是char,short,unsigned char ,unsigned short 类型。
char lower(char a)
{
return a+32;
}
int main(void)
{
char a='A';
char b;
b=lower(a);
return 0;
}
main函数
.text
.global main
main:
pushl %ebp
movl %esp,%ebp
subl $2,%esp
movl $'A',-1(%ebp)
movsbl -1(%ebp),%eax
pushl %eax
call lower
addl $4,%esp
movb %al,-1(%ebp)
movl $0,%eax
leave
ret
lower函数
.text
.global lower
lower:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%eax
movsbl %al,%eax
addl $32,%eax
leave
ret
从代码中可以发现调用的函数,如果有参数,则第一个参数在8(%ebp)处,第二个在12(%ebp)中,以此类推。
返回值一般放入%eax中。如果返回值是char,则只用%al,如果返回值是short,则只用%ax。