0

我的教授开始自相矛盾,所以我需要你的帮助。

在指令编码中,我们有一个可选字段 REX 前缀,其拆分如下:

Field contains
0100 – fixed constant value 
W – 1 when using 64-bit data
R – expands the Reg field to 4 bit 
X – expands Index field to 4 bit
B – expands the R/M field or Base to 4 bit

我问我的教授“使用 64 位数据时”的真正含义,每次我得到不同的答案:

  1. 当使用添加到 x64 的新寄存器时,如 r9、r10、r9d 等...

  2. 当使用 rax、rbx、r9 等 64 大小的寄存器时...

  3. 当指令使用(读/写)内存中的 64 位数据时。

我真的很困惑,正确的答案是什么(可能都不是,因为我不再信任我的教授了)。

4

1 回答 1

1

2和3都有。

例如,addq %rax, %rbxaddq %rax, long_varaddq $123, long_var都需要设置 W 位的 REX 前缀,因为它们都有 64 位操作数大小。 addq %rax, %r9由于使用了“新”寄存器,因此需要 W 和 B。

但是,addl %eax, %r9d不需要 W 位,因为它的操作数大小是 32 位。它仍然需要 B 位来使用新的寄存器r9d,所以仍然需要前缀字节,但不是因为“使用 64 位数据”。

于 2021-07-31T17:34:36.610 回答