首页 > 解决方案 > 在汇编中打印浮点数

问题描述

我有一个关于打印浮点数以及双字和四字数据之间的差异的问题。这是我的例子

section .data
number dq 2.0
form db '%.2f',0
section .text
extern printf
global main:
push rbp
mov rbp,rsp
push rdi
push rsi
push rbx

movq xmm0,[number]
push qword[number]
mov rdi,form
mov rax,1
call printf

pop rbx
pop rsi
pop rdi
mov rsp,rbp
pop rbp
ret

输出为 :2.0 没问题,但如果数字是双字,则出现问题

section .data
number dd 2.0
form db '%.2f',0
section .text
extern printf
global main:
push rbp
mov rbp,rsp
push rdi
push rsi
push rbx

movd xmm0,[number]
push qword[number]
mov rdi,form
mov rax,1
call printf

pop rbx
pop rsi
pop rdi
mov rsp,rbp
pop rbp
ret

那么输出是 0.00,但是当我检查 xmm0 寄存器时,我注意到在第一种情况下,内容类似于 8_float={0x0,0x2,...},v4_double={0x2,0x0...},而在第二种情况下case 是 8_float={0x2,0x0,..},v4_double={0x0,0x0,..} 所以这意味着 printf 总是检查 v4_double?我尝试用 %lf 打印双精度,但结果相同 0.00,你有什么想法我尝试使用不同的移动,如 movsd、movups、movapd、.. 但这对我没有帮助。你有什么想法吗?

标签: assemblyprintfx86-64

解决方案


推荐阅读