【发布时间】:2016-09-05 05:52:09
【问题描述】:
最近在写fp数的小程序。 首先,我将双 fp 读入对齐的位置(对于 SSE 指令)
segment .data
scanf_fmt:
db "%f%ld", 0
segment .bss
align 16, db 0
x resq 1 ; for double fp
number resq 1 ; for integer
align 16, db 0
res resq 1 ; for double fp
lea rdi, [fmt]
lea rsi, [x]
lea rdx, [number]
xor eax, eax ; number of fp values(edited from mov rax, 1 ,still looks the same)
call scanf
然后我移动双:
movsd xmm0, [x]
然后我开始调试:我输入了1.6让scanf读取。
100 movsd xmm0, [x]
(gdb) p/f x
$1 = 1.60000002
(gdb) n
(gdb) p $xmm0
$2 = {v4_float = {1.600000002, 0, 0, 0}, v2_double = {5.2..., 0}, ...
标签 x 处的浮点值已移动,但作为浮点数(movss)而不是双精度(movsd,我使用过)
这是怎么回事?
【问题讨论】:
-
你需要展示你的完整程序,你是如何构建它的,你是如何运行它的,以及你在运行它时输入了什么。您还需要说出您希望在调试器中显示的内容。
-
mov rax, 1是一个错误。您在整数寄存器中传递一个指向双精度的指针,在 xmm regs 中传递零 FP args。 -
@RossRidge Build:
yasm -f elf64 -g dwarf2 main.asm; gcc -o main main.oRun:./mainTyped:1.6期望类似{v4_float = {smth, 0, 0, 0}, v2_double = {1.6, 0}, ... -
您不应该期望 v4_float 的第二个元素为零,除非双精度数的尾数的低 32 位全为零。 (这只有在它完全可表示的情况下才有可能,例如 0.5 或整数之类的)
-
更重要的是,你用的是什么格式的字符串?