2013-01-19 337 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