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前缀集的某些寄存器.