这是我的问题:
我尝试使用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
,但是我没有看到任何设置esi
,这里的edi
和生成的源文件中的movsd
有两个参数,但是在链接的文档中却没有。有人可以在这里给我解释吗? 最佳答案
我怀疑网页显示的内容少于完整图片。
它讨论了A5
操作码,但是还有其他变体,例如F2 0F
,它们允许在XMM寄存器和更多任意存储位置之间移动。
有关更多详细信息,请参见here。