【发布时间】:2021-01-05 20:04:35
【问题描述】:
我有以下函数,它在堆栈上存储一个数字(并修改该数字),然后在最后清理它:
.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 以摆脱数字(即,在退出之前重新对齐堆栈)?
【问题讨论】:
-
可以在不清理堆栈的情况下调用“SYS_EXIT”,也就是说可以删除“pop???”以及它之后的 2 条指令,这无关紧要。
-
push number从绝对地址number加载 8 个字节,但您只分配了 4 个字节的静态数据与.long。您的意思可能是push $number将地址作为立即推送,而不是从中加载?因为如果您确实想加载,push number(%rip)是解决静态存储的更有效方式。
标签: assembly x86 x86-64 callstack