2012-05-20 41 views
2

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

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

回答

1

回答第二部分。您不希望自由修改堆栈指针ESP。如果你破坏它,你的代码将崩溃或挂起。

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

所以你将不得不看你的基地和索引寄存器,位移和索引寄存器乘数。当它们结合在一起形成一个你要读/写的内存地址时,它们应该指向你知道有可访问内存的地方。

通常情况下,您可以根据需要在堆栈上分配一些内存,方法是将某些内容推入或通过递减ESP

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

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