16 位寄存器的 x64 REX 前缀

问题描述 投票:0回答:1

我对 REX 前缀感到困惑:

  • 文档说 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.  
  • 我理解legacy意味着32bit;
  • 我理解任何 REX 字节都以
    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 不匹配。
  • 这是否意味着我必须翻转第三位才能设置 16 位模式寄存器?
assembly x86-64 intel
1个回答
0
投票

66h 是操作数大小覆盖前缀。基本上,在 32 位或 64 位模式下,它指定指令对 16 位数据进行操作。 (在16位模式下,它指定指令对32位数据进行操作。)

所以它是一个前缀,但不是 REX 前缀。事实上,它早于整个 REX 前缀系统;它自 x86(第一个 32 位 x86 CPU)以来就已存在,而 REX 特定于 x86-64。

© www.soinside.com 2019 - 2024. All rights reserved.