最近正在编写带有fp编号的小程序。 首先,我将双fp读入对齐位置( SSE 指令)
<div>
<!-- button -->
<div id="button">
<a href="#bigger" title="LALA"><img src="http://imagenes.es.sftcdn.net/es/scrn/115000/115177/thumbnail_1459842713-100x100.png" title="Landscape button" alt="landscape"></a>
</div>
<!--pop up-->
<div id="bigger" class="popup">
<a href="#"><img src="http://www.robertofarrenphotography.com/wp-content/uploads/galleries/post-1336/thumbnails/BOSTON%20LANDSCAPE%20PHOTOGRAPHER_USA_049.jpg" alt="landscape"/></a>
</div>
</div>
然后我移动双倍:
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]
以供scanf阅读。
1.6
标签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
,我使用过)
这里发生了什么?
答案 0 :(得分:3)
来自scanf(3)
:
%f
匹配可选的有符号浮点数;下一个指针必须是指向float
的指针。
所以scanf将32位单精度float
存储到[x]
,就像你告诉它的那样。接下来的32位保持为零。
你看到的其他一切都是明显的结果。
double
的转化说明符为%lf
,您可以通过搜索&#34; double&#34;快速查找。在手册页中。