例如,其中一个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.
根据我的理解,2条指令是相同的,除了第二条指令使用额外的字节并提供更少的选项......所以基本上它没用。
我错过了什么?
答案 0 :(得分:9)
它与指令中寄存器的编码有关。 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前缀集的某些寄存器。
答案 1 :(得分:3)
它并非无用,但也不是非常有用。
REX前缀将ah
,ch,
dh
和bh
更改为spl
,bpl
,sil
和{{ 1}}(分别)。因此,虽然您不能使用第一组,但您可以使用第二组。