assembly 如何在nasm x86 64中使用scanf读取浮点值?

b09cbbtk  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(104)

我尝试简单地读取一个浮点值,并使用汇编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
t5zmwmid

t5zmwmid1#

%f说明符调用浮点型,而不是双精度型。使用%lf作为双精度,或者将price调整为单精度浮点数。

相关问题