2

このコードがなぜかわかりません

#include <iostream>
using namespace std;
int main(){
    int result=0;

    _asm{
        mov eax,3;
        MUL eax,3;
        mov result,eax;
    }

    cout<<result<<endl;
    return 0;
}

は次のエラーを示しています。

1> c:\ users \ david \ document \ visual studio 2010 \ projects \ assembler_instructions \ assembler_instructions.cpp(11):エラーC2414:オペランドの数が不正です

すべてが正常に見えますが、なぜこのコンパイラエラーが発生するのですか?

4

4 に答える 4

11

このページによると、mul命令は1つの引数のみを取ります。

mul arg

これにより、「arg」にAレジスタの対応するバイト長の値が乗算されます。次の表を参照してください。

オペランドサイズ1バイト2バイト4バイト

他のオペランドALAXEAX

結果の上位部分は次の場所に保存されます:AH DX EDX

結果の下部は次の場所に保存されます:AL AX EAX

于 2010-07-16T18:19:14.063 に答える
4

したがって、ジャスティンのリンクに従ってメモに従います。

#include <iostream>

int main()
{
    int result=0;

    _asm{
        mov eax, 3;
        mov ebx, 4;
        mul ebx;
        mov result,eax;
    }

    std::cout << result << std::endl;

    return 0;
}
于 2010-07-19T15:31:03.540 に答える
2

使用する:

imul eax, 3;

また:

imul eax, eax, 3;

そうすれば、 edx -register が破壊されることを心配する必要はありません。それは「符号付き整数乗算」です。あなたは 'int' -result を持っているように見えるので、mul を使用するか imul を使用するかは問題ではありません。

除算または乗算時に edx レジスタをゼロにしないと、エラーが発生することがあります。CPUはIntel core2 quad Q9550でした

麻痺するほど過剰に設計されていますが、読むことができる正しいインテルの取扱説明書があります。インテルは少し前にウェブサイトを壊しましたが。ただし、AMD サイトから同じリファレンス マニュアルを検索してみてください。

更新: マニュアルを見つけました: http://www.intel.com/design/pentiumii/manuals/243191.htm

彼らがいつまたサイトを壊すか分からないので、常に検索する必要があります。

Update2: ARGHL! それらは 1999 年のものです。残念ながらほとんどの詳細は同じです。

于 2010-07-20T16:34:11.763 に答える
1

Intel アーキテクチャのマニュアルをダウンロードする必要があります。

http://www.intel.com/products/processor/manuals/

あなたの目的のためには、第 2 巻が最も役に立ちます。

これらは 2010 年 7 月のアクセス時点で最新のものです。

于 2010-07-20T16:42:14.710 に答える