NASM 程序集,Ubuntu,32 位程序。
通常,当从堆栈中弹出一个值时,我会这样做
POP somewhere
写入寄存器或变量。但有时,我根本不想把它放在任何地方——我只想摆脱堆栈中的下一个元素。正在做
POP
就这样行不通。
我有一个解决方法是制作一个我根本不使用的 4 字节变量并将其转储POP
到其中。有没有更好的方法来实现这一目标?
NASM 程序集,Ubuntu,32 位程序。
通常,当从堆栈中弹出一个值时,我会这样做
POP somewhere
写入寄存器或变量。但有时,我根本不想把它放在任何地方——我只想摆脱堆栈中的下一个元素。正在做
POP
就这样行不通。
我有一个解决方法是制作一个我根本不使用的 4 字节变量并将其转储POP
到其中。有没有更好的方法来实现这一目标?
将堆栈指针调整四个字节(或其他数量),忽略顶部的任何值:
add esp, 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, 4
:https ://hg.ulukai.org/ecm/ldosboot/file/b7cf0f0fee06/boot.asm#l1186