【发布时间】:2011-08-24 11:54:16
【问题描述】:
我目前正在学习高级汇编语言,并且一直在研究堆栈的概念。我想我理解得相当好,但是在实践中我有一些问题。
堆栈向下增长,ESP 寄存器始终指向堆栈顶部..低内存中的地址。如果有东西被压入堆栈,那么 ESP 应该被递减。
EBP 用作帧指针,据我了解,应该始终超过 ESP。
但是,使用以下程序:
stdout.put(esp, nl);
stdout.put(ebp, nl);
push(ike);
stdout.put(esp, nl);
stdout.put(ebp, nl);
push(ike);
stdout.put(esp, nl);
stdout.put(ebp, nl);
pop(eax);
pop(eax);
pop(eax);
pop(eax);
stdout.put(esp, nl);
stdout.put(ebp, nl);
似乎并非如此。查看输出:
0018FF6C 0018FF70
0018FF68 0018FF70
0018FF64 0018FF70
0018FF74 0018FF70
EBP 始终相同,第一次推送时 ESP 递减 4 个字节,第二次推送时再递减 4 个字节。
在这之后我很困惑。在我的前 2 次弹出后,ESP 应该回到它开始的地方。如果我没有将任何东西压入堆栈,我怎么能再做两次弹出?我在弹出什么?
从 EAX 中进一步弹出和打印会显示一些数字,然后是 0,然后是更多数字。所以,我肯定会弹出一些东西......但是什么?它属于我的程序内存的哪一部分,为什么没有任何影响?
为什么 EBP 完全没有受到影响?
另外,为什么 ESP 减少 4 个字节,而不是减少 8 个字节?
如果有人能帮助我理解这一点,我将不胜感激。
【问题讨论】: