Can I POP a value from the stack, but put it nowhere in NASM Assembly?

后端 未结 2 1297
太阳男子
太阳男子 2021-01-06 00:33

NASM Assembly, Ubuntu, 32-bit program.

Normally, when popping a value from the stack, I\'ll do

POP somewhere

Into a register or a v

2条回答
  •  有刺的猬
    2021-01-06 01:07

    As John Zwinck already pointed out, you can use add esp, 4 to effectively "pop into nowhere". And of course, you can use other constants to pop only a word (2), two dwords (8), or whatever.

    If you want to not modify the arithmetic status flags, you may use lea esp, [esp + 4] instead. (This does not work for a 16-bit stack addressed by sp because [sp + immediate] cannot be encoded.)

    If you have a stack frame created with ebp pointing at the base, you may get away with just mov esp, ebp to discard all the stack slots allocated since ebp was set. (Part of the operation of the leave instruction is effectively the same as mov esp, ebp.)

    Likewise, you may change the stack pointer by using lea esp, [ebp - immediate] but that requires keeping track of how far ebp is from your desired esp value.

    Finally, aside from popping into a scratch memory destination, you can always pop into registers that are not "in use", ie may be clobbered by your code at that point. For example, here I use pop cx twice just to get rid of the stack slots, which is shorter to encode than add sp, 4: https://hg.ulukai.org/ecm/ldosboot/file/b7cf0f0fee06/boot.asm#l1186

提交回复
热议问题