问题
以下两个 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-section 中包含两条 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
这让我想知道它们的同义性以及为什么会存在。