我不明白爲什麼這段代碼不適合我。我需要使用scanf函數進行double操作,然後使用printf進行相同的操作。 使用此代碼時結果不好。我看到的是非常隨機的字符。ASM x64 scanf printf double,GAS
.data
d1: .double
format: .asciz "%lf\n"
format2: .asciz "%lf"
.text
.globl main
main:
subq $8, %rsp
#scanf
movq $0, %rax
movq $d1, %rsi
movq $format2, %rdi
call scanf
addq $16, %rsp
#printf
movq $1, %rax
movsd d1, %xmm0
movq $format, %rdi
call printf
addq $16, %rsp
#exit
movq $1, %rdi
xorq %rax, %rax
call exit
調試,單步,看寄存器值。 –
這可能不是問題所在,因爲'main'永遠不會返回,並且您從不讀取任何堆棧內存,但是在每次調用之後,您都會用'add $ 16,%rsp'打破堆棧。 '%rsp'是一個保存呼叫的寄存器,所以它在調用之後具有與之前相同的值。另外,你應該把'd1'放在bss中,而不是'.data'中,因爲你不需要在它的可執行文件中存儲一個值。其實這是問題。 –
^^ lol,panto評論:'哦不,不是'....'哦,是的,它是' –