如何在x86-64汇编中使用堆栈?

时间:2014-12-02 01:01:03

标签: assembly stack x86-64

我在如何访问堆栈中的变量方面遇到了一些麻烦。这就是我正在做的事情:

.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读取两个整数,然后尝试将它们存储到rbxrcx寄存器中。但是,当我尝试将其中一个打印出来时,它只打印出一些随机整数。

1 个答案:

答案 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有很多其他寄存器可供选择;)(但要注意,其他一些也需要保存)。