以下Intel x86指令是操作码0x31:xor <r/m32>,<r32>
。在指令的实际机器码中,0x31后面跟着另一个表示所用寄存器或存储器地址的十六进制值。我的问题如下:Intel x86异或操作码0x31
- 什么是十六进制代码,指的是可能的寄存器,可以异或?
- 考虑到可以使用的寄存器和存储器参数组合的数量,该指令可能创建的可能的机器码有哪些限制?
以下Intel x86指令是操作码0x31:xor <r/m32>,<r32>
。在指令的实际机器码中,0x31后面跟着另一个表示所用寄存器或存储器地址的十六进制值。我的问题如下:Intel x86异或操作码0x31
您可以在Intel® 64 and IA-32 Architectures Software Developer Manuals中找到英特尔处理器操作码的完整描述。 XOR
指令是第2B卷:指令集参考M-Z的第682页。
回答第二部分。您不希望自由修改堆栈指针ESP
。如果你破坏它,你的代码将崩溃或挂起。
同样,指令要使用的地址应该全部对应于已分配的可写内存。如果尝试访问未由物理内存映射的内存位置,或者只读但您正在写入内存位置,则代码将崩溃。
所以你将不得不看你的基地和索引寄存器,位移和索引寄存器乘数。当它们结合在一起形成一个你要读/写的内存地址时,它们应该指向你知道有可访问内存的地方。
通常情况下,您可以根据需要在堆栈上分配一些内存,方法是将某些内容推入或通过递减ESP
。
如果您需要访问程序的代码存储器,请确保它们只能读取。代码存储器通常是只读的。
如果您需要执行某些操作,它必须是现有程序的代码或位于可执行内存中的代码。预计默认情况下,所有不是程序代码的内存都不可执行。但是,在Windows和Linux中有特殊的功能来改变内存区域的内存保护并使其可执行或可写。