为什么我从scanf获得浮动而不是双重?

时间:2016-09-05 05:52:09

标签: assembly x86-64 sse

最近正在编写带有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,我使用过)

这里发生了什么?

1 个答案:

答案 0 :(得分:3)

来自scanf(3)

  

%f匹配可选的有符号浮点数;下一个指针必须是指向float的指针。

所以scanf将32位单精度float存储到[x],就像你告诉它的那样。接下来的32位保持为零。

你看到的其他一切都是明显的结果。

double的转化说明符为%lf,您可以通过搜索&#34; double&#34;快速查找。在手册页中。