gpt4 book ai didi

assembly - 在 x86 汇编中,ESP 是否在调用后递减两次,然后在数据保存到堆栈之前压入?

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

长话短说,我正在学习 Singh 和 Triebel 撰写的一本名为“8088 和 8086 微处理器”的书,以学习这些特定 CPU 的汇编。现在我练习的电脑是我的主电脑,是我最近组装的,所以寄存器更大。

也就是说,这本书(我发现这本书非常有帮助)说调用标签操作数会导致调用后的指令地址被放置在堆栈上,然后 SP 递减2( ESP,并在我的 CPU 上减 4)。在我正在研究的一些代码中,调用操作数后面紧跟着一个 push。当CPU遇到 push时,书上说 SP会减少2(同样, ESP在我的CPU上会减少4)。

; ESP=0xffffd840 right now
call iprint
mov eax, 0Ah

iprint:
push eax ; say eax contains 1

现在,在通话前说 ESP=0xffffd840EIP 的地址保存在堆栈中(CALL 操作数后面的指令的地址)。然后ESP减4。此时ESP=0xffffd83c。然后遇到push操作数。按照书上的说法,首先将堆栈指针递减,然后将寄存器的内容压入堆栈。所以现在ESP=0xffffd838并且1被压入堆栈。

If it helps:
Stack addr Contents
********** ********
0xffffd840 address of mov eax, 0Ah
0xffffd83c ?
0xffffd838 1

现在,我的问题是,0xffffd83c 是否被跳过?根据这本书,ESP 在保存 call 后的下一条指令后递减,然后在数据从 push 放入堆栈之前,再次递减。

我已经调试类似的场景有一段时间了,密切关注寄存器的值,但我只是无法判断调试器是否遵循书中所说的内容(在执行操作之前递减,或者之后)。

这是因为在某些情况下,在子例程中的RET之后给出了一个参数,导致堆栈指针递增吗?如果堆栈指针在放入数据之前确实递减两次,这是我能看到的唯一原因。

如果我有这个错误,有人可以确认或解释一下吗?

谢谢

最佳答案

call <address>就像:push eip jmp <address> ,所以在你的情况下如果 esp0xffffd840领先于 call ,下一条指令的返回地址被压入0xffffd83c (因为伪“push eip”将首先递减esp以创建新的堆栈顶部,然后它将在那里存储eip的当前值(顺便说一句,eip已经指向下一条指令,因为call 的获取+解码指令阶段已完成,因此它实际上是 ret 所需的值。

您还可以在调试器中查看内存。而“栈”只是普通的内存。所以如果你有 esp等于 0xffffd840 ,您可以打开例如内存 View 0xffffd824 ,您将看到 32 字节的堆栈内存,其中 28 字节尚未使用,最后 4 字节是当前的“堆栈顶部”。

我到处都使用 4 字节组,因为这是 32b 保护模式下 CPU“字”的 native 大小(x86 术语中的 dwordword 仅 16 位)。 IIRC 您仍然可以强制 CPU 执行 push ax或使用sub/add esp,immediate甚至可以将其移动单个字节,但通常会涉及性能损失,并且在 64b 模式下,多个调用约定甚至需要 16 字节对齐,因此我建议坚持使用 +-4 esp 32b 模式下的操作。

但是如果你的书大约是8086,你可能想使用dosbox模拟旧的 DOS 16 位环境,以避免一开始出现一些特定于平台的问题。虽然也许你应该为你的操作系统找到一些最近的 32/64 位书籍,因为 x86 上的 32b 保护模式更容易学习(只是图形输出不像 DOS 时代那么简单,但如果你愿意的话)将你的asm文件与C++“加载器”混合,例如将一些窗口表面初始化为ARGB内存数组,你可以将该指针向下传递给asm例程并玩弄像素,以同样简单的方式,旧的320x200“DOS 中的模式 13h"有效。甚至更简单(没有调色板,也没有 64k 段限制)。

关于assembly - 在 x86 汇编中,ESP 是否在调用后递减两次,然后在数据保存到堆栈之前压入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44129645/

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