2013-01-19 163 views
3

這是我的問題:
我試圖用scanf(在msvcrt.dll)輸入在flat assembler一個浮點值,那麼我寫一個簡單的「scanf的節目」這樣的(在C):x86彙編:MOVSD指令問題

#include <stdio.h> 

int main() { 
    float a; 

    scanf("%f", &a); 
    printf("Just input: %f", a); 
    return 0; 
} 

然後使用cl.exe/FA參數來編譯,以生成組件文件是這樣的:

lea eax, DWORD PTR _a$[ebp] 
    push eax 
    push OFFSET $SG2935 
    call _scanf 
    add esp, 8 
; Line 8 
    cvtss2sd xmm0, DWORD PTR _a$[ebp] 
    sub esp, 8 
    movsd QWORD PTR [esp], xmm0 
    push OFFSET $SG2936 
    call _printf 
    add esp, 12     ; 0000000cH 

我誤解的是movsd指令。根據這裏:http://faydoc.tripod.com/cpu/movsb.htmMove doubleword at address DS:(E)SI to address ES:(E)DI但我沒有看到任何設置esi, edi在這裏和movsd在生成的源文件有兩個參數,但在文件中的鏈接是它不應該。有人可以在這裏解釋我嗎?

回答

5

我懷疑網頁顯示的不夠完整。

它討論的是A5操作碼,但還有其他變體,如F2 0F,它們允許在XMM寄存器和更多任意存儲位置之間移動。

查看here瞭解更多詳情。

+0

謝謝!我知道了 :) –

3

這是其他 MOVSD指令,它是SSE指令的一部分。這裏它將雙精度浮點值從xmm0移動到內存中。

+0

非常感謝! –

10

有兩個x86指令具有相同的名稱!

  1. MOVS/MOVSB/MOVSW/MOVSD/MOVSQ,移動數據從串來串
  2. MOVSD -move標量雙精度浮點值

檢查英特爾datasheet