如何处理一个空的 pop?

What to do with an empty pop?

我有以下函数,它在堆栈上存储一个数字(并修改该数字),然后在最后清理:

.rodata
number: .long   127     # need to keep original value

_start:

    # set up stack, align on 16 for syscalls
    push %rbp
    mov %rsp, %rbp
    push number

    ...

  exit:
    pop ???
    mov %rbp, %rsp
    pop %rbp
    mov $SYS_EXIT,      %eax
    syscall

我应该如何处理 pop 来删除数字(即,在退出前重新对齐堆栈)?

您可以使用 add , %rsp 或简单地弹出一个您不关心其值的寄存器,例如 pop %rcx.

由于较短的代码大小和“”的怪癖(显式使用 RSP 可以使 Intel CPU 作为 stack-sync uop 插入),后者在最近的系统中更受欢迎,但是前者也不错。

一些编译器(尤其是 clang)在需要将 RSP 正好移动 8 时默认使用虚拟 push/pop:


另请注意,您的 popmov %rbp, %rsp 是多余的,因为无论如何您都将 RBP 用作帧指针。 _exit 系统调用不关心 RSP 指向哪里。