之前有人翻譯了第二卷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 opcode,OFH)之前並緊挨着操作碼或逃避操作碼。如果指令使用傳統前綴,則傳統前綴位於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位修改SIB的index域。
6. REX.B或者修改ModR/M的r/m域的base或者修改SIB的base域,或者修改訪問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.B的4位r\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)。