如何处理一个空的 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:
另请注意,您的 pop
与 mov %rbp, %rsp
是多余的,因为无论如何您都将 RBP 用作帧指针。 _exit
系统调用不关心 RSP 指向哪里。
我有以下函数,它在堆栈上存储一个数字(并修改该数字),然后在最后清理:
.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
.
由于较短的代码大小和“
一些编译器(尤其是 clang)在需要将 RSP 正好移动 8 时默认使用虚拟 push/pop:
另请注意,您的 pop
与 mov %rbp, %rsp
是多余的,因为无论如何您都将 RBP 用作帧指针。 _exit
系统调用不关心 RSP 指向哪里。