如你所想,movq %rcx, %rsi
是不正确的。你需要传递一个指向内存的指针。寄存器不是内存地址空间的一部分,因此你不能有指向它们的指针。您需要全局或本地分配存储。顺便说一句,你不应该把你的数据(特别是可写)放到默认的.text
部分,因为这是用于代码的,并且通常是只读的。另外,调用约定通常要求16字节的堆栈指针对齐,所以你也应该注意这一点。
.globl main
main:
push %rbp # keep stack aligned
movq $0, %rax # clear rax
movq $f, %rdi # load format string
movq $x, %rsi # set storage to address of x
call scanf
pop %rbp
ret
.data
f: .string "%d"
x: .long 0
(如果您的环境需要一个前导下划线上的符号,然后使用_main
,大概_scanf
。)
,如果你的变量是在地址空间的下部4GiB以上才有效。另外,您也可以使用RIP相对寻址创建的指针,它可能看起来像:
leaq f(%rip), %rdi # load format string
leaq x(%rip), %rsi # set storage to address of x
您还可以使用加载完整的64位地址助记符movabsq
:
movabsq $f, %rdi # load format string
movabsq $x, %rsi # set storage to address of x
根据要求:本地变量版本可能如下所示:
subq $8, %rsp # allocate 8 bytes from stack
movq $0, %rax # clear rax
movabsq $f, %rdi # load format string
movq %rsp, %rsi # set storage to local variable
call scanf
addq $8, %rsp # restore stack
ret
'scanf'是*标准库*函数,而不是“系统函数”。对于第二个参数,它期望一个将存储结果的内存地址。你可以将一个寄存器的值移动到RSI中,并期望它将数据存储在前一个寄存器中 - 这没有任何意义。使用LEA。 – 2014-11-23 22:44:07