我在如何访问堆栈中的变量方面遇到了一些麻烦。这就是我正在做的事情:
.data
.text
input:
.string "%ld" #format for input
output:
.string "%ld.\n" #format for output
.global main
pushq %rbp #push base pointer, also known as frame pointer
movq %rsp, %rbp #set base pointer to stack pointer, reference off of rbp for locals
subq $8, %rsp #allocate 16 bytes for local use
movq $input, %rdi #calls scanf in the format of input
movq %rsp, %rsi
movq $0, %rax
call scanf
subq $8, %rsp
movq $input, %rdi #calls scanf in the format of input
movq %rsp, %rsi
movq $0, %rax
call scanf
movq -8(%rsp), %rbx #stores first number into reg rbx
movq (%rbx),%rbx
movq -16(%rsp), %rcx #stores second number into reg rcx
movq (%rcx),%rcx
movq $output,%rdi #prints in format input
movq $0, %rax
movq %rcx, %rsi
call printf
addq $16, %rsp
popq %rbp
ret
我使用scanf
读取两个整数,然后尝试将它们存储到rbx
和rcx
寄存器中。但是,当我尝试将其中一个打印出来时,它只打印出一些随机整数。
答案 0 :(得分:3)
如果您在rsp
上完成自己的操作,那么显然第二个号码仍在地址(%rsp)
,因为没有任何变化且第一个号码位于8(%rsp)
,因为您已经从rsp
中减去了8,因为你已经阅读了它。另外,正如@EOF所说,你不需要间接:
movq 8(%rsp), %rbx #stores first number into reg rbx
movq (%rsp), %rcx #stores second number into reg rcx
请注意,要保留调用约定强制rbx
,因此破坏它是一个坏主意。 x86-64有很多其他寄存器可供选择;)(但要注意,其他一些也需要保存)。