这是我的问题:
我尝试使用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.htmMove doubleword at address DS:(E)SI to address ES:(E)DI,但是我没有看到任何设置esi,这里的edi和生成的源文件中的movsd有两个参数,但是在链接的文档中却没有。有人可以在这里给我解释吗?

最佳答案

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

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

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

10-04 14:36