我一直在研究 Intel 机器语言,包括汇编列表中显示的生成代码和可执行文件本身的转储(由用 MASM 编写的程序生成)。我无法弄清楚机器指令中如何引用寄存器。我的 PC(当然还有很多其他的)有 16 个寄存器,所以需要 4 位来引用所有这些寄存器,从 0 到 15。作为一个例子,我查看了 lea 指令,因为它有一个 1 个字节的操作码,并且只有一个格式。这是汇编源代码:
lea rax, data2
lea rcx, data2
lea rdx, data2
Data2 位于程序数据部分的偏移量 5 处。这是生成的机器语言:
488D05FE 1F0000
488D0DF7 1F0000
488D15F0 1F0000
我知道十六进制 48 表示 64 位寄存器操作数,而 8D 是操作码,但其余的仍然是个谜。1F0000 的用途是什么?它是否引用了存储位置,这在所有三个指令中都相同?如果是这样,那么 05FE、0DF7 和 15F0 必须代表三个寄存器,但是用什么表示法呢?
我花了很多时间阅读https://software.intel.com/en-us/download/intel-64-and-ia-32-architectures-sdm-combined-volumes-1-2a-2b-2c -2d-3a-3b-3c-3d-and-4,但我觉得它不是很有帮助。例如,它从不对位和字节进行编号,以描述指令的哪些位服务于哪个功能,以及根据什么方案。它充满了细节,但基本上没有解释。