2017-03-27 8 views
1

mov rcx,rdxhttps://defuse.ca/online-x86-assembler.htmを使用)の出力は48 89 D1を出力します。x86_64 - mov命令を符号化

this referenceでオペコードをチェックすると、そのバイトシーケンスが命令をどのようにエンコードするかが示されます。

しかし、そのテーブルの2行下(オペコード8B)は、非常によく似たmov命令ですが、オペランドの順序は反転します。
実際、同じ命令を48 8b ca(デコンパイルによって検証)を使ってエンコードすることができます。

なぜ両方のオペコードが存在するのですか?彼らは私が解決することができた以上に異なっていますか?誰かがいつ他の人を選ぶだろうか?

+1

メモリオペランドをソースまたはデスティネーションのいずれかにするために存在します。両方がレジスタの場合、2つのエンコーディングが得られます。どのアセンブラがアセンブラに依存しているかによって異なりますが、いくつかは指定することさえできます(例えば、 '.s'接尾辞)。 – Jester

答えて

2

modr/mバイトは、最大1つのメモリオペランドしかエンコードできません。したがって、ソースまたはデスティネーションのメモリオペランドをサポートするすべての命令は、ソースがおそらくメモリオペランドであり、デスティネーションがメモリオペランドである可能性があるため、1回は2回エンコードされる。もちろんこれは、両方のオペランドが2回のレジスタであるニーモニックをエンコードできることを意味します。

+0

ありがとう、それはそれを説明する。シンプルなmov命令(メモリアクセスなし)をアセンブルするときに、アセンブラが最初のエンコードを2番目のエンコードに優先させる傾向がある理由はありますか?それはちょうど偶然でしょうか? – user1000039

+1

@ user1000039はアセンブラによって異なります。 IIRC Solaris「as」は後者に有利です。 – fuz

+0

はアセンブラによって異なります。マクロを使ってランダムに選択して、出力に多型を得ることができます。私はそうする何らかの理由があるとは思わない。 btw。 add、adc、sbb、sub、xor、cmp、test、xchgにも適用されます。 (最後の2つは少し異なります) – sivizius

関連する問題