函数的调用及堆栈

Inter汇编语言是从右往左读 AT&T是从左往右读
ebp栈底指针 esp 栈顶指针 存放内存地址
这里写图片描述
下面我们来看这段代码中的函数调用过程:
每一条指令的地址是虚拟地址,存放在PC寄存器中。
mov是赋值 lea是赋地址
这里写图片描述
这里写图片描述
1)Push ebp 压栈 栈底内存的地址,存放调用main函数的栈底地址,而不是main函数的栈底,是调用方的栈底。
2)mov ebp esp 调用方的栈顶指针指向栈底
3)sub esp 4Ch esp -= 4Ch 给当前函数开辟栈帧
4) lea edi dword[ebp-4Ch] 将栈顶地址放入寄存器edi
5)rep stos -> for循环 从esp处往ebp方向拷贝,拷贝13h次,拷贝的是0CCCCCCCh
这里写图片描述
先将b的值放入eax寄存器 入栈
再将a的值放入ecx寄存器 入栈
Call 是进行函数的调用 在执行完函数之后需要执行call的下一条指令,所以要提前将其下一条指令0x40109A地址入栈
进入子函数栈帧:
这里写图片描述
将main函数ebp栈底入栈,保存栈底,以便到时返回栈帧。然后初始化栈帧,赋值为0xcccccccc
这里写图片描述
实参入栈的内存是被调用的形参的内存,实参的入栈就是给形参开辟内存,形参变量的内存在调用方的栈帧中。
通过寄存器将temp中的值带回,不产生临时量;
C语言返回值时:
当小于等于四个字节 ,通过eax寄存器带回
当大于等于4字节小于等于8字节,将通过两个寄存器(eax和edx)带回
当大于八个字节时,通过产生临时变量返回
这里写图片描述
mov esp,ebp 将esp拉回ebp,回退子函数栈帧
Pop ebp 有两个动作:1. 将子函数栈底出栈2.将ebp指向main函数栈底
(每一个函数的栈底是上一个调用方的栈底)
ret 也有两个动作,一个是pop出栈,把出栈的内容放到pc寄存器中,即把call下一条指令的地址放入PC寄存器中(也就是我们当初最后入栈的下一条指令的地址放入寄存器中)
这里写图片描述
Add esp 8回退形参的内存
mov dword ptr [ebp-0ch], eax 将带出的eax中的值放入ret中.

就这样整个函数调用就结束了,是不是很简单呢?你也快在你的电脑上试试吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值