我尝试简单地读取一个浮点值,并使用汇编x86 64打印它。因此,变量price的值,我用它作为c函数scanf的缓冲区,当我尝试打印它时,它不会改变。
它将打印最初设置的值,因此在下面的代码中,它打印0.0,因此scanf函数不会正确更改price的值。
为了生成可执行文件,我使用命令nasm -f elf64 test.asm && gcc -no-pie test.o -o test
。
我做错了什么?
section .data
price dq 0.0
fmt db "%.1f", 0
section .text
global main
extern printf, scanf
main:
push rbp
mov rbp, rsp
mov rdi, fmt ;scanf first arg, format string
mov rsi, price ;scanf second argument, this variable is supposed to change
mov rax, 0
call scanf
movq xmm0, [price] ;in float point mode xmm0 holds the value to be printed
mov rdi, fmt
mov rax, 1 ;rax has to be set 1 to float point mode
call printf
leave
ret
1条答案
按热度按时间t5zmwmid1#
%f
说明符调用浮点型,而不是双精度型。使用%lf
作为双精度,或者将price
调整为单精度浮点数。