x86汇编:movsd指令问题

时间:2013-01-19 12:08:37

标签: assembly x86 masm32 fasm

这是我的问题:
我尝试使用scanf(在msvcrt.dll中)在flat assembler中输入单个浮点值,然后我编写一个简单的“scanf程序”(在C中):

#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.htm Move doubleword at address DS:(E)SI to address ES:(E)DI但我在此处看不到任何设置esiedi,生成的源文件中的movsd有两个参数但在链接中的文档中它不应该。有人可以在这解释一下吗?

3 个答案:

答案 0 :(得分:15)

有两个x86指令同名!

  1. MOVS / MOVSB / MOVSW / MOVSD / MOVSQ - 将数据从字符串移动到字符串
  2. MOVSD - 移动标量双精度浮点值
  3. 检查英特尔datasheet

答案 1 :(得分:5)

我怀疑网页呈现的不完整。

它讨论了A5操作码,但还有其他变体,例如F2 0F,允许在XMM寄存器和更多任意内存位置之间移动。

有关详细信息,请参阅here

答案 2 :(得分:4)

这是其他 MOVSD指令,它是SSE指令的一部分。这里它将双精度浮点值从xmm0移动到内存中。