在64位模式下只有REX前缀的指令是什么意思?

Sim*_*mon 7 assembly x86-64 instruction-set cpu-registers

例如,其中一个MOV有两个版本,一个带有REX,一个没有(来自英特尔的doc):

88 /r MOV r/m8, r8
REX + 88 /r MOV r/m8***, r8***

***In 64-bit mode, r/m8 can not be encoded to access the following byte registers if a REX prefix is used: AH, BH, CH, DH.
Run Code Online (Sandbox Code Playgroud)

根据我的理解,2条指令是相同的,除了第二条指令使用额外的字节并提供更少的选项......所以基本上它是无用的.

我错过了什么?

ade*_*hus 11

它与指令中寄存器的编码有关.r/m部分中可用的位从一组寄存器中进行选择 - 这些寄存器会根据REX前缀而改变:

可用的8位寄存器,不带REX前缀:

AL,CL,DL,BL,AH,CH,DH,BH

可用的8位寄存器,REX前缀设置为:

AL,CL,DL,BL,SPL,BPL,SIL,DIL,R8B,R9B,R10B,R11B,R12B,R13B,R14B,R15B

这就是英特尔文档引起注意的原因,即您无法选择具有REX前缀集的某些寄存器.

  • 没有REX前缀,您只能访问8个寄存器(AL,CL,DL,BL,AH,CH,DH,BH),因为寄存器字段只有3位 (2认同)

har*_*old 7

它不是没用,但也不是非常有用。

REX 前缀将ahch, dh和更改bhsplbplsildil(分别)。因此,虽然您不能使用第一组,但可以使用第二组。