gpt4 book ai didi

assembly - 从堆栈中弹出而不压入

转载 作者:行者123 更新时间:2023-12-02 18:59:18 25 4
gpt4 key购买 nike

我现在正在学习高级汇编语言,并且一直在研究堆栈的概念。我想我理解得还不错,但在实践中我有一些疑问。

堆栈向下增长,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com