assembly 如何使用x64程序集从局部变量偏移?

pxiryf3j  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(107)

我正在尝试访问当前堆栈帧上的第二个局部变量,位于(我认为是?)%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
...
ttp71kqs

ttp71kqs1#

您可以使用位移将一个值添加到带有leaq的寄存器中。

movq %rsp, %rbx
addq $8, %rbx
movq %rbx, %rsi

您可以执行以下操作:

leaq 8(%rsp), %rsi

虽然这看起来像是通常用于movq的寄存器解引用,但对于leaq,它只使用%rsp的值并添加位移。
这也可以与负值一起使用,例如-8(%rsp),因为您提到需要%rsp-8

相关问题