关于调用帧中的栈

关于调用帧中的栈

写这篇文章,我想说明一些看起来不复杂,但要花些时间反应的问题。

Q: esp指向哪?
A: 就是栈顶,而不是栈顶的下一个元素。

Q: 如何在windbg中查看当前栈?
A: dp esp. p意指 Pointer-sized. 单列模式格式: dp /c1 esp
因为栈是向下生长的,dp是向上显示的,所以dp esp从栈顶开始,向上显示的内存,刚好就是栈的内容。

Q: call指令做了些什么事?
A: call做的仅仅是把返回地址(call的下一条指令的地址)压栈,然后跳转到目标地址。
它不会为参数压栈,也不会保存其它寄存器,更不好为局部变量分配栈空间。这些事都是程序员干的,或是编译器自动完成的。

Q: 为什么需要ebp?
A:
esp虽然是栈指针,但它是游动的,只要代码中有栈操作,它就随栈顶变量而变化。在引用局部变量(局部变量存放在脆弱的栈中)时,极不方便。
引入ebp,固定指向调用帧,方便引用局部变量。当然ebp需要手动指定。所以函数开头经常可见如下代码:

push ebp     
move ebp esp

调用帧一般结构:

|             | High
| Parameter   |
|-------------|
| Parameter   |
|-------------|
| Return Addr |
|-------------|
| Old ebp     | <-- New ebp
|-------------|
| Local var   |
|-------------|
| Local var   |
|             | Low



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值