23

MOVは、おそらく、ASMを学びながら誰もが学ぶ最初の指示です。

ちょうど今、私はIA32アーキテクチャ用のGNU /LinuxでのAssemblyLanguageProgrammingという本に出会いました。RajatMoona著:(壊れたリンクは削除されました)

しかし、私はそれがであることを学びましたMOV dest, src。「Loadwith」のようなものdestですsrcウィキでも同じことを言っています。

著者が間違っていると言っているのではありません。私は彼が正しいことを知っています。しかし、私はここで何が欠けていますか?

asところで..彼はこれらの命令を組み立てるためにGCCを使用しています。しかし、それは命令構文を正しく変更するべきではありませんか?

4

4 に答える 4

58

mov dest, srcIntel構文と呼ばれます。(例mov eax, 123

mov src, destAT&T構文と呼ばれます。(例mov $123, %eax

GNUアセンブラを含むUNIXアセンブラはAT&T構文を使用し、私が知っている他のすべてのx86アセンブラはIntel構文を使用します。ウィキペディアで違いを読むことができます。

于 2010-03-07T19:14:27.063 に答える
8

はい、as / gasはsrc、destの順序を使用するAT&T構文を使用します。MASM、TASM、NASMなどはすべて「dest、src」の順序を使用します。たまたま、AT&T構文はIntelプロセッサにあまり適合せず、(少なくともIMOは)ほとんど読めない混乱です。たとえばmovzx、特に悪い。

于 2010-03-07T19:14:42.850 に答える
2

アセンブリ言語の構文には、IntelとAT&Tの2つの異なるタイプがあります。両方の比較は、ウィキペディアのアセンブリ言語ページにあります。

あなたの本がAT&T構文を使用している可能性があります。この構文では、ソースオペランドがデスティネーションの前にあります。

于 2010-03-07T19:14:08.197 に答える
1

Jerry Coffin の回答で既に述べたように、Intel の構文は x86 アーキテクチャの命令のエンコードに適しています。私のデバッガの逆アセンブラのコメントにあるように、「オペランドは、逆アセンブル出力に表示されるのと同じ順序で命令に表示されます」。たとえば、次の命令について考えてみましょう。

-a
1772:0100 test word [AA55], 1234
1772:0106
-u 100 l 1
1772:0100 F70655AA3412      test    word [AA55], 1234
-

オペコードの hexdump で読み取ることができるように、命令のオペコード0F7hは最初に、次に ModR/M バイト06h、次にリトル エンディアン オフセット ワード0AA55h、最後に即値ワード1234hです。Intel 構文は、アセンブリ ソースのその順序と一致します。AT&T 構文では、これtestw $0x1234, (0xAA55)はエンコーディングと比較して順序を交換するように見えます。

Intel の構文順序に従うもう 1 つの例は、比較条件です。たとえば、次のシーケンスを考えてみましょう。

cmp ax, 26
jae .label

これは、 26 以上 (符号なし比較)の.label場合にジャンプします。このニーモニックは、 for のようにフラグを設定するオペランドの順序にのみ当てはまります。ax cmp dest, srcdest -= src

于 2020-03-09T08:35:49.603 に答える