6

NASM 程序集,Ubuntu,32 位程序。

通常,当从堆栈中弹出一个值时,我会这样做

POP somewhere

写入寄存器或变量。但有时,我根本不想把它放在任何地方——我只想摆脱堆栈中的下一个元素。正在做

POP

就这样行不通。

我有一个解决方法是制作一个我根本不使用的 4 字节变量并将其转储POP到其中。有没有更好的方法来实现这一目标?

4

2 回答 2

7

将堆栈指针调整四个字节(或其他数量),忽略顶部的任何值:

add esp, 4
于 2013-10-17T05:27:21.893 回答
4

正如 John Zwinck 已经指出的那样,您可以使用add esp, 4有效地“突然出现”。当然,您可以使用其他常量仅弹出一个单词 (2)、两个 dwords (8) 或其他任何内容。

如果您不想修改算术状态标志,则可以lea esp, [esp + 4]改用。(这不适用于 16 位堆栈,sp因为[sp + immediate]无法编码。)

如果您创建了一个ebp指向基础的堆栈帧,您可能会mov esp, ebp放弃自设置以来分配的所有堆栈槽ebp。(该leave指令的部分操作实际上与 相同mov esp, ebp。)

同样,您可以通过使用更改堆栈指针,lea esp, [ebp - immediate]但这需要跟踪ebp与您的期望值的距离esp

最后,除了弹出到临时内存目的地之外,您总是可以弹出到未“使用中”的寄存器,即此时可能被您的代码破坏。例如,在这里我使用pop cx两次只是为了摆脱堆栈槽,它比编码更短add sp, 4https ://hg.ulukai.org/ecm/ldosboot/file/b7cf0f0fee06/boot.asm#l1186

于 2019-08-26T19:20:59.923 回答