64-ia-32-architectures-software-developer-manual第二卷2.2节

来源:互联网 发布:app视频录像软件 编辑:程序博客网 时间:2024/06/06 09:10

之前有人翻译了第二卷2.1节,2.1节讲的是32位指令编码方式。2.2节讲64位模式指令编码方式的不同。下面是翻译正文。


IA-32e模式有两个子模式:

兼容模式:准许传统保护模式软件未修改地在64位系统上运行

64位模式:运行可访问64位地址空间的程序

REX Prefixes

REX前缀是在64位模式下使用的指令前缀。它们的功能为:

1.       指定GPRS和SSH寄存器

2.       指定64位操作数尺寸

3.       指定扩展控制寄存器

在64位模式下不是所有的指令都需要REX前缀。只有在指令使用扩展寄存器或使用64位操作数时需要REX前缀。如果在其没有任何意义时使用REX寄存器,它将被忽略。

每个指令只准许使用一个REX前缀。如果使用REX前缀,它必须位于操作码或逃避操作码(escape opcodeOFH)之前并紧挨着操作码或逃避操作码。如果指令使用传统前缀,则传统前缀位于REX前缀之前。指令的最大15字节尺寸限制任然适用带REX前缀的指令。

编码

Intel 64 andIA-32指令格式使用经过编码的3bit域指定寄存器,最多指定三个寄存器。编码根据的格式如下:

1.        ModR/M:ModR/M 字节的reg和r/m 域

2.        ModR/M与SIB:ModR/M字节的reg域,SIB字节的base和index域

3.        没有ModR/M的指令:操作码的reg域

在64位模式中,这些格式没有改变。定义64位上下文中域所需要的bit在新加的REX前缀中。

关于REX前缀域的更多内容

REX前缀是16个编码操作码的集合,包含40H到4FH。这些操作码在IA-32模式和兼容模式中代表有意义的指令。在64位模式中,相同的操作码则代表REX前缀,不再当做单独的指令看待。

在64位模式中INC/DEC一类的单字节操作码形式不再有效,INC/DEC的功能则由相同指令的ModR/M模式代替。(操作码 FF/0和FF/1)。

表2-4是REX前缀的总述。图2-4到图2-7是现实中REX前缀的实例。某些REX前缀中域的组合是无效的,在那种情况下,前缀将被忽略。如下是一些附加的信息:

1.        设置REX.W可用于决定操作数尺寸(size),但并不是独自决定操作数宽度(width)。像前缀为66H的尺寸宽度,重新指定64位操作数尺寸对操作指定的字节没影响。

2.        对于non-byte操作,如果使用66H前缀和REX.W = 1前缀,66H被忽略。

3.        如果在REX.W = 0时使用66H前缀,操作数尺寸为16位。

4.        REX.R修改ModR/M的reg域,当reg域编码为GPR, SSE, 控制或调试寄存器。当ModR/M指定其它寄存器或定义一个扩展操作数,则REX.R被忽略。

5.        REX.X位修改SIBindex域。

6.        REX.B或者修改ModR/Mr/m域的base或者修改SIBbase域,或者修改访问GPRs的操作数寄存器域。

在IA-32体系结构中,字节寄存器(AH,AL, BH, BL, CH, CL, DH, and DL)被编码进ModR/M字节的reg域、r/m域或者操作码的reg域当做寄存器0到7。REX前缀为字节寄存器提供了一个附加的寻址能力,使得GPRs的最低位可用于字节操作。

ModR/M和SIB中域的某些结合代码特殊的寄存器编码意义。对于某些结合,REX扩展的域不被解码。表2-5描述每一个情况:

偏移

64位模式下的寻址使用32位一样的ModR/Mand SIB编码。ModR/M and SIB的偏移尺寸也没改变,它们保留8位或32位并可以符号扩展到64位。

Direct Memory-Offset类MOV

在64位模式下,直接存储器偏移形式的mov指令扩展到使用64位立即数决定地址。这个地址叫做moffset。指定该64为存储器偏移不需要前缀。对于这些mov指令,内存偏移的尺寸和地址尺寸保持一致,见表2-6:

立即数

在32位模式下,通常立即数操作数的尺寸保持32位。当操作数尺寸是64位时,处理器在使用前将所有的立即数符号扩展到64位。

支持64位立即操作数通过扩展现有mov指令的语义实现,这些指令(opcodes B8H – BFH)移动一个16位或32位立即数到GPR。当有效操作尺寸是64位时,这些指令可以被用于载入一个立即数到GPR。重载一个默认的32位尺寸到64位需要REX前缀。

例如:

48 B88877665544332211 MOV RAX,1122334455667788H

RIP相对寻址

一个新的寻址方式,RIP相对寻址,在64位模式下被实现。一个有效地址由在下一条指令的RIP上加一个偏移组成。

在IA-32体系结构和兼容模式中,相对指令指针的相对寻址只有在控制转移类指令中有效。在64位模式下,使用ModR/M寻址的指令可以使用RIP相对寻址。除了RIP相对寻址,所有ModR/M指令相对0来寻址。

RIP相对寻址准许特定的ModR/M模式利用一个32位有符号偏移相对RIP来寻址内存。这种方式提供的偏移范围为相对RIP+-2G。表2-7为RIP相对寻址的ModR/M和SIB编码。32位相对偏移寻址类型存在于现有的ModR/M和SIB编码的冗余形式中。有一个ModR/M编码和几个SIB编码。RIP相对寻址使用冗余的形式编码。

在64位模式下,ModR/MDisp32 (32-bit displacement)被重新定义为RIP+Disp32而不是只有偏移。如表2-7.

支持RIP相对寻址的ModR/M前缀不依赖于前缀。尤其是,r/m域编码为101,不受REX前缀影响。例如,以mod= 00B选择R13 (REX.B = 1, r/m = 101B)仍然是RIP相对寻址。REX.B4r\m域在结合ModR/M时,并没有完全被解码。为了使用没有偏移的R13,软件必须使用为0的一字节偏移编码R13+0

RIP相对寻址被64为模式支持,不是64位地址尺寸。使用地址尺寸前缀不会影响RIP相对寻址,地址尺寸前缀的作用是截断或0扩展所计算的有效地址。

默认64位操作尺寸

在64位模式中,两组指令的默认尺寸为64位(无需使用REX前缀):

1.        Near分支

2.        除了far分支,所有潜在引用RSP的指令

控制和调试寄存器的附加编码

在64位模式下,许多控制、调试寄存器的编码是有效的。当ModR/W的reg域编码一个控制或调试寄存器时,REX.R用于修改ModR/M的reg域(表2-4)。这些编码使得处理器可以寻址CR8-CR15和DR8-DR15。64位模式新增的控制寄存器CR8为任务优先级寄存器(Task Priority Register (TPR))。

在IA-32e模式的第一个实现中,CR9-CR15和DR8-DR15没有被实现,尝试访问未实现的寄存器将导致invalid-opcode exception (#UD)。

0 0