4

これは私の問題です: (in ) を使用して単一の浮動小数点値を入力
しようとしてから、 (in )のような単純な「scanf プログラム」を作成します。scanfmsvcrt.dllflat assemblerC

#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設定はありません。ここと生成されたソースファイルには2つのパラメーターがありますが、リンク内のドキュメントではそうすべきではありません。誰かがここで私を説明できますか?esiedimovsd

4

3 に答える 3

17

同じ名前の x86 命令が 2 つあります。

  1. MOVS/MOVSB/MOVSW/ MOVSD /MOVSQ - 文字列から文字列へのデータの移動
  2. MOVSD —スカラー倍精度浮動小数点値の移動

インテルのデータシートを確認してください。

于 2013-01-19T12:29:40.367 に答える
6

Web ページの表示が全体像に満たないのではないかと思います。

オペコードについて説明していますが、XMM レジスタとより任意のメモリ位置の間の移動を許可するA5など、他のバリアントがあります。F2 0F

詳しくはこちらをご覧ください。

于 2013-01-19T12:18:17.637 に答える
4

これは、SSE 命令の一部である、もう 1 つのMOVSD 命令です。ここでは、倍精度浮動小数点値を xmm0 からメモリに移動しています。

于 2013-01-19T12:17:24.123 に答える