0

我一直在研究 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,但我觉得它不是很有帮助。例如,它从不对位和字节进行编号,以描述指令的哪些位服务于哪个功能,以及根据什么方案。它充满了细节,但基本上没有解释。

4

1 回答 1

4

我们来看第一条指令:48 8D 05 FE 1F 00 00

第一个字节:48h0100 1000 b(我插入一个空格以使其更易于阅读)。那是一个 REX 前缀字节;请参阅您链接的手册的第 535 页(又名第 2A 页第 2-9 页,但为方便起见,我将使用绝对页码)。它由前 4 位标识为0100. 其余四位分别称为W、R、X、B。所以只设置了 W,表示 64 位操作数大小。我们稍后再讨论其他人。

8D如您所知,是 的操作码LEA;参见第 1149 页。由于设置了 REX.W,它会将其第二个操作数的有效地址存储m在其第一个操作数中r64。查看第 1149 页的第二个表,第一个操作数在 ModRM 字节的 reg 字段中编码,第二个在 r/m 字段中编码。

05, 或0000 0101 b, 是 ModRM 字节。请参见第 530 页的图 2-2。这与来自 REX 前缀字节的位组合,如第 535 页的图 2-4 所示(因为我们没有 SIB 字节)。这种编码是为了向后兼容 32 位指令。

  • mod 是 ModRM 字节的前两位:00对于我们来说。

  • reg 是接下来的三位:000. REX 字节的 X 位被附加为高位,产生X.REG = 0.000.

  • r/m 是低三位:101. REX 字节的 B 位被附加为高位,产生B.R/M = 0.101.

现在英特尔的手册似乎只真正解释了这些字段对于 32 位模式的含义;我在 64 位模式案例中找不到很好的解释。所以让我们看看别处,例如https://wiki.osdev.org/X86-64_Instruction_Encoding

X.REG 的含义在这里解释:0.000对于需要通用寄存器的 64 位模式指令,是RAX

对于 Mod 和 BR/M,请参阅此表。Mod是00所以我们看第一行。BR/M =0.101标记为“[RIP/EIP + disp32]”。这意味着接下来的四个字节是指令指针 RIP 的 32 位位移;即从以下指令的地址的偏移量。请参阅英特尔手册的第 538 页。所以这占了最后四个字节,它们形成了 little-endian 32-bit number 00001FFEh。换句话说,内存操作数是1FFEh下一条指令地址之后的字节。那大概是在哪里data2;您的汇编器或链接器为您计算了偏移量。

因此,第一个操作数是 RAX,第二个是[RIP+00001FFEh],所以整个指令是

LEA RAX, [RIP+00001FFEh]

请注意1F0000,它本身没有任何意义;它只是内存操作数位移的前三个字节。

现在下一个类似:48 8D 0D F7 1F 00 00. ModRM 现在是00 001 101,所以X.REG0001,它编码RCX。Mod 和 BR/M 再次编码 RIP+disp32,此时位移为00001FF7h. 请注意,这正好比上一条指令少 7;我们刚刚执行了一条 7 字节的指令,所以 RIP 增加了 7,因此少 7 的位移最终指向与之前完全相同的位置,即data2.

你可以做的最后一个:)

于 2020-07-04T01:25:57.237 回答