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

时间:2014-12-27 12:06:33

标签: assembly x86-64 cpu-registers instruction-set

例如,其中一个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条指令是相同的,除了第二条指令使用额外的字节并提供更少的选项......所以基本上它没用。

我错过了什么?

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前缀将ahch, dhbh更改为splbplsil和{{ 1}}(分别)。因此,虽然您不能使用第一组,但您可以使用第二组。