Intel x86 XOR操作码0x31

时间:2012-05-20 08:29:06

标签: x86 opcode

以下Intel x86指令是操作码0x31:xor <r/m32>,<r32>。在指令的实际机器代码中,0x31后跟另一个十六进制值,表示使用的寄存器或存储器地址。我的问题如下:

  1. 哪些十六进制代码引用了可以进行异或的可能寄存器?
  2. 考虑到可以使用的寄存器和内存参数组合的数量,该指令可能创建的机器代码有哪些限制?

2 个答案:

答案 0 :(得分:3)

您可以在Intel® 64 and IA-32 Architectures Software Developer Manuals中找到有关英特尔处理器操作码的完整说明。 XOR指令是第2B卷:指令集参考,M-Z。

的第682页

答案 1 :(得分:1)

回答第二部分。

您不希望自由修改堆栈指针ESP。如果您损坏它,您的代码将崩溃或挂起。

同样,指令要使用的地址应该都对应于已分配的可写内存。如果您尝试访问未由物理内存映射的内存位置,或者只读,但是您正在写入内存位置,则代码将崩溃。

因此,您必须观察基数和索引寄存器,位移和索引寄存器乘数。当它们组合在一起形成一个你要读/写的内存地址时,它们应指向你知道可访问内存的地方。

通常,您可以通过在堆栈上推送内容或递减ESP来为堆栈分配一些内存。

如果您需要访问程序的代码存储区,请确保它们只是读取。代码存储器通常是只读的。

如果您需要执行某些操作,则必须是现有程序的代码或位于可执行内存中的代码。预计默认情况下,所有不是程序代码的内存都不可执行。 Windows和Linux中有一些特殊功能可以改变内存区域的内存保护,并使其可执行或可写。