以下 Intel x86 指令是操作码 0x31: xor <r/m32>,<r32>
。在指令的实际机器代码中,0x31 后跟另一个十六进制值,表示使用的寄存器或内存地址。我的问题如下:
- 哪些十六进制代码表示可以进行异或的可能寄存器?
- 考虑到可以使用的寄存器和内存参数组合的数量,这条指令可能创建的机器代码有哪些限制?
您可以在英特尔® 64 和 IA-32 架构软件开发人员手册中找到英特尔处理器操作码的完整描述。该XOR
指令是第 2B 卷的第 682 页:指令集参考,MZ。
回答第二部分。
您不想随意修改堆栈指针,ESP
. 如果您损坏它,您的代码将崩溃或挂起。
同样,指令将要使用的地址都应该对应于分配的可写内存。如果您尝试访问未由物理内存映射或只读但正在写入的内存位置,您的代码将崩溃。
所以你必须注意你的基址和索引寄存器、位移和索引寄存器乘法器。当组合在一起形成您要读取/写入的内存地址时,它们应该指向您知道有可访问内存的地方。
通常,您可以通过将某些内容压入堆栈或递减来在堆栈上分配一些内存以满足您的需要ESP
。
如果您需要访问程序的代码内存,请确保这些只是读取。代码存储器通常是只读的。
如果你需要执行某些东西,它要么必须是现有程序的代码,要么是位于可执行内存中的代码。期望默认情况下所有不是程序代码的内存都是不可执行的。不过,Windows 和 Linux 中有一些特殊功能可以更改内存区域的内存保护并使其可执行或可写。