Ubuntu 我可以从堆栈中弹出一个值,但不将其放在NASM程序集中吗?

Ubuntu 我可以从堆栈中弹出一个值,但不将其放在NASM程序集中吗?,ubuntu,stack,nasm,32-bit,Ubuntu,Stack,Nasm,32 Bit,NASM汇编,Ubuntu,32位程序 通常,当从堆栈中弹出一个值时,我会 POP somewhere 输入寄存器或变量。但有时,我根本不想把它放在任何地方——我只想去掉堆栈中的下一个元素。做 POP 就像那样是行不通的 我的一个解决办法是制作一个我根本不用的4字节变量,并将POP转储到其中。有更好的方法来实现这一点吗?将堆栈指针调整四个字节(或其他数量),忽略顶部的任何值: add esp, 4 正如John Zwinck已经指出的,您可以使用添加esp,4来有效地“无处可去”。当然,您

NASM汇编,Ubuntu,32位程序

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

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

POP
就像那样是行不通的


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

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

add esp, 4

正如John Zwinck已经指出的,您可以使用
添加esp,4
来有效地“无处可去”。当然,您可以使用其他常量仅弹出一个单词(2)、两个DWORD(8)或任何内容

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

如果在创建堆栈帧时,
ebp
指向底部,则可以通过
mov esp,ebp
放弃自设置
ebp
以来分配的所有堆栈插槽。(
leave
指令的部分操作实际上与
mov esp、ebp
相同)

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


最后,除了跳转到临时内存目标之外,您还可以跳转到未“使用”的寄存器中,也就是说,此时您的代码可能会对寄存器造成冲击。例如,我在这里使用了两次
pop cx
,只是为了去掉堆栈插槽,它比
add sp,4

编码的时间短,并且确实删除了堆栈中的下一个元素?如果我按下5键,然后按你说的做,下次我按下5键时,我不会得到我的5键,对吗?试试看。:)您将看到一些NASM示例函数中使用的相同代码。@Omega:Popping不会删除任何内容,它只是移动堆栈指针。