什么是 REX 前缀是指令编码?

Posted

技术标签:

【中文标题】什么是 REX 前缀是指令编码?【英文标题】:What is REX prefix is Instruction Encoding? 【发布时间】:2021-07-31 17:25:19 【问题描述】:

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

在指令编码中,我们有一个可选字段 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 位数据时”的真正含义,每次我得到不同的答案:

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

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

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

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

【问题讨论】:

查阅指令集参考。但是,是的,对于新添加的寄存器,您需要 RXB 位,而对于 64 位数据,您需要 W 位。 【参考方案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 位数据”。

【讨论】:

你应该换掉我一个月拿4万美元的教授 您的最后一段是第 1 点 - 使用新的寄存器。 哦,你确定 3 也是正确的吗?因为我读到:默认地址大小是 64 位 #3 不处理地址大小,它处理操作数大小。 @coolmo: (1) 这个问题无关紧要,因为0x1213 适合 32 位或 64 位。但大多数指令只能在有效地址中编码 32 位位移。 mov reg, 0xdeadbeefdeadbeef 将是一个 64 位地址,但它不可编码,除非在寄存器 regal/ax/eax/rax 的特殊情况下。地址大小覆盖仅影响寄存器在有效寻址中的使用方式,而不影响位移。

以上是关于什么是 REX 前缀是指令编码?的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache RewriteRule 指令中设置环境变量时,是啥导致变量名称以“REDIRECT_”为前缀?

在 SSE 中组合前缀

python字符串编码转换

静音的前缀是啥

Opcode解析方法

最优前缀编码