从C语言到汇编(三)函数实现之栈帧

本文详细介绍了X86架构下,C语言函数如何利用栈帧处理参数和局部变量。通过sum函数及main函数的汇编代码示例,展示了函数开始时的`pushl %ebp ; movl %esp,%ebp`和结束时的`leave ; ret`指令,解释了参数传递、栈帧建立与销毁的过程,揭示了函数调用的内部机制。" 133029459,19673579,理解JavaScript:启用与网页编程实践,"['javascript', '前端开发', '编程语言', '网页交互', 'HTML嵌入']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

X86下C语言函数使用栈帧来实现传入参数和处理局部变量的。
每个函数开始前都将执行

pushl %ebp
movl %esp,%ebp

结束时都将执行

leave
ret

以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

首先,main函数在开始处执行pushl %ebp movl %esp,%ebp

然后subl $12,%esp movl $12,-8(%ebp) movl $24,-12(%ebp)

传入sum函数的参数 pushl -12(%ebp) pushl -8(%ebp)

执行call sum
程序流程调到sum函数处执行
pushl %ebp movl %esp,%ebp

leave ,leave等于movl %ebp,%esp popl %ebp
ret 从函数中返回,到addl $8,%esp这一指令。
addl $8,%esp
函数栈帧返回到main的状态。

以上就是一次调用函数的过程,我们可以看出函数调用是如何借助于栈帧完成函数调用的。
用到的指令

指令描述
call label过程调用
call *operand过程调用
leave为返回准备栈
ret从过程调用中返回
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值