質問
次の2つのx86命令の(重要な)違いは何ですか?
39 /r CMP r/m32,r32 Compare r32 with r/m32
3B /r CMP r32,r/m32 Compare r/m32 with r32
バックグラウンド
私はJavaアセンブラーを構築しています。これは、コンパイラーの中間言語がWindows-32実行可能ファイルを生成するために使用します。
現在、私は次のコードを持っています:
final ModelBase mb = new ModelBase(); // create new memory model
mb.addCode(new Compare(Register.ECX, Register.EAX)); // add code
mb.addCode(new Compare(Register.EAX, Register.ECX)); // add code
final FileOutputStream fos = new FileOutputStream(new File("test.exe"));
mb.writeToFile(fos);
fos.close();
TEXTセクションに2つのCMP命令を含む有効な実行可能ファイルを出力します。「text.exe」に出力された実行可能ファイルは何も面白いことはしませんが、それは重要ではありません。クラスCompare
はCMP
命令のラッパーです。
上記のコードは(OllyDbgで検査)を生成します:
Address Hex dump Command
0040101F |. 3BC8 CMP ECX,EAX
00401021 |. 3BC1 CMP EAX,ECX
違いは微妙です:39
バイトオペコードを使用する場合:
Address Hex dump Command
0040101F |. 39C1 CMP ECX,EAX
00401021 |. 39C8 CMP EAX,ECX
それは私に彼らの同義性となぜこれが存在するのかについて疑問に思います。