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

之前有人翻譯了第二卷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)。

發佈了28 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章