Ubuntu 我可以从堆栈中弹出一个值,但不将其放在NASM程序集中吗?
NASM汇编,Ubuntu,32位程序 通常,当从堆栈中弹出一个值时,我会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来有效地“无处可去”。当然,您
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不会删除任何内容,它只是移动堆栈指针。