作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我现在正在学习高级汇编语言,并且一直在研究堆栈的概念。我想我理解得还不错,但在实践中我有一些疑问。
堆栈向下增长,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);
事实似乎并非如此。查看输出:
0018FF6C0018FF70
0018FF680018FF70
0018FF640018FF70
0018FF740018FF70
EBP 始终相同,ESP 在第一次推送时减少 4 个字节,然后在第二次推送时再减少 4 个字节。
这之后我很困惑。在我的前 2 次弹出之后,ESP 应该回到它开始的地方。如果我没有将任何内容压入堆栈,我该如何再执行两次弹出操作?我在弹出什么?
进一步弹出并打印 EAX 显示一些数字,然后是 0,然后是更多数字。所以,我肯定会弹出一些东西......但是什么?它属于我的程序内存的哪一部分,为什么没有受到影响?
为什么 EBP 根本不受影响?
另外,为什么 ESP 减少 4 个字节,而不是 8 个字节?
如果有人能帮助我理解这一点,我将不胜感激。
最佳答案
EBP 不会被推送/弹出指令修改,它是手动设置的,因此除非您自己更改它,否则它将保持不变。
IKE 的推送导致 4 字节的变化,所以显然你在这里处于 32 位模式。
EAX(32 位)的 4 次弹出将导致 16 字节(10h)更改,就像它们一样。
不确定这里出了什么问题。似乎按我的预期工作?
关于assembly - 从堆栈中弹出而不压入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7174983/
我是一名优秀的程序员,十分优秀!