从C语言到汇编(三)函数实现之参数传递和函数返回值

以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。

发布了185 篇原创文章 · 获赞 18 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/pk_20140716/article/details/103177828