4

这是我的问题:
我尝试使用scanf(in msvcrt.dll) 输入单个浮点值,flat assembler然后我编写了一个简单的“scanf 程序”,如下所示 (in 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.htmMove doubleword at address DS:(E)SI to address ES:(E)DI但我没有看到任何设置esiedi在这里和movsd生成的源文件有两个参数,但在链接中的文档中它不应该。有人可以在这里解释一下吗?

4

3 回答 3

17

有两条同名的x86指令!

  1. MOVS/MOVSB/MOVSW/ MOVSD /MOVSQ - 将数据从字符串移动到字符串
  2. MOVSD — 移动标量双精度浮点值

检查英特尔数据表

于 2013-01-19T12:29:40.367 回答
6

我怀疑网页显示的图片少于完整图片。

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

有关更多详细信息,请参见此处

于 2013-01-19T12:18:17.637 回答
4

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

于 2013-01-19T12:17:24.123 回答