【问题标题】:x86 Assembly: movsd instruction issuex86 汇编:movsd 指令问题
【发布时间】:2013-01-19 12:08:37
【问题描述】:

这是我的问题:
我尝试使用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 但我在这里没有看到任何设置esiedi 并且生成的源文件中的movsd 有两个参数,但在链接中的文档中它不应该。有人可以在这里解释一下吗?

【问题讨论】:

    标签: assembly x86 masm32 fasm


    【解决方案1】:

    有两条同名的 x86 指令!

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

    检查英特尔datasheet

    【讨论】:

      【解决方案2】:

      我怀疑网页显示的图片不够完整。

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

      更多详情请参阅here

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2013-08-11
          • 2015-06-29
          • 1970-01-01
          • 2011-02-15
          • 1970-01-01
          • 2011-08-18
          • 2017-10-23
          • 2012-01-15
          • 2014-08-04
          相关资源
          最近更新 更多