我对 REX 前缀感到困惑:
REX Bits:
|7|6|5|4|3|2|1|0|
|0|1|0|0|W|R|X|B|
W bit = Operand size 1==64-bits, 0 == legacy, depends on opcode.
R bit = Extends the ModR/M reg field to 4 bits. 0 selects rax-rsi, 1 selects r8-r15
X bit = extends SIB 'index' field, same as R but for the SIB byte (memory operand)
B bit = extends the ModR/M r/m or 'base' field or the SIB field.
0100
开头;但是:
$ echo 'mov %al, %al' | as -al -o /dev/null - | tail -1
1 0000 88C0 mov %al,%al
$ echo 'mov %ax, %ax' | as -al -o /dev/null - | tail -1
1 0000 6689C0 mov %ax,%ax
$ echo 'mov %eax, %eax' | as -al -o /dev/null - | tail -1
1 0000 89C0 mov %eax,%eax
$ echo 'mov %rax, %rax' | as -al -o /dev/null - | tail -1
1 0000 4889C0 mov %rax,%rax
0x66
是 %ax
上的 REX 前缀吗?该字节还有其他名称吗?0x66
是 0110 0110
,因此它与以 0100
规则开始的 REX 不匹配。66h 是操作数大小覆盖前缀。基本上,在 32 位或 64 位模式下,它指定指令对 16 位数据进行操作。 (在16位模式下,它指定指令对32位数据进行操作。)
所以它是一个前缀,但不是 REX 前缀。事实上,它早于整个 REX 前缀系统;它自 x86(第一个 32 位 x86 CPU)以来就已存在,而 REX 特定于 x86-64。