我正在尝试访问当前堆栈帧上的第二个局部变量,位于(我认为是?)%rsp-8
,因为第一个地址位于%rsp
。我想做的是将%rsp-8
的地址加载到另一个寄存器中。注意,这意味着当前存储在 * rsp
的地址,而不是内存中该地址的数据。是否可以在不声明单独的寄存器来存储偏移量(或递增当前的rsp
)的情况下执行此操作?
我目前拥有:
...
movq %rsp, %rsi # Move the first address at rsp into rsi.
leaq infmt, %rdi # Load the input format string into rdi.
movq $0, %rax # Clear rax since it is a var-args procedure.
call scanf
movq %rsp, %rbx
addq $8, %rbx
movq %rbx, %rsi # Move the next address at rsp into rsi.
leaq infmt, %rdi # Reload the input format.
call scanf
...
有什么会是“好”的:
...
movq %rsp, %rsi # Move the first address at rsp into rsi.
leaq infmt, %rdi # Load the input format string into rdi.
movq $0, %rax # Clear rax since it is a var-args procedure.
call scanf
movq %rbx-8, %rsi # Move the next address at rsp into rsi.
leaq infmt, %rdi # Reload the input format.
call scanf
...
1条答案
按热度按时间ttp71kqs1#
您可以使用位移将一个值添加到带有
leaq
的寄存器中。您可以执行以下操作:
虽然这看起来像是通常用于
movq
的寄存器解引用,但对于leaq
,它只使用%rsp
的值并添加位移。这也可以与负值一起使用,例如
-8(%rsp)
,因为您提到需要%rsp-8
。