操作碼 |
指令 |
說明 |
0F 22 /r |
MOV CR0,r32 |
將 r32 移到 CR0 |
0F 22 /r |
MOV CR2,r32 |
將 r32 移到 CR2 |
0F 22 /r |
MOV CR3,r32 |
將 r32 移到 CR3 |
0F 22 /r |
MOV CR4,r32 |
將 r32 移到 CR4 |
0F 20 /r |
MOV r32,CR0 |
將 CR0 移到 r32 |
0F 20 /r |
MOV r32,CR2 |
將 CR2 移到 r32 |
0F 20 /r |
MOV r32,CR3 |
將 CR3 移到 r32 |
0F 20 /r |
MOV r32,CR4 |
將 CR4 移到 r32 |
將控制暫存器(CR0、CR2、CR3 或 CR4)的內容移到通用暫存器,或者相反。不論運算元大小屬性如何,這些指令的運算元大小總是 32 位。如需有關控制暫存器的標誌與欄位的詳細說明,請參閱“IA-32 英特爾(R) 體系結構軟件開發人員手冊”第 3 卷第 2 章中的“控制暫存器”)。
載入控制暫存器時,程式不應試圖更改任何保留位;也就是說,應該總是將保留位設定為以前讀取的值。
在操作碼級別,ModR/M 位元組中的 reg 欄位指定載入或讀取的控制暫存器。mod 欄位中的兩個位總是 11B。r/m 欄位指定載入或讀取的通用暫存器。
這些指令有以下副作用:
寫入控制暫存器 CR3 時,將清除所有的非全域性 TLB 項(請參閱“IA-32 英特爾(R) 體系結構軟件開發人員手冊”第 3 卷第 3 章中的“轉譯查詢緩衝區 (TLB)”)。
對於奔騰(R) Pro 處理器,以下副作用取決於具體實現的版本。軟體不應依賴將來或以前 IA-32 處理器中的此項功能:
修改控制暫存器中的任何分頁標誌(暫存器 CR0 中的 PE 與 PG,暫存器 CR4 中的 PGE、PSE 及 PAE)時,會清除所有的 TLB 專案,包括全域性專案。如果 PG 標誌設定為 1,且寫入控制暫存器 CR4 以便將 PAE 標誌設定為 1(以啟用實體地址擴充套件模式),則將頁目錄指針表中的指針 (PDPTR) 載入到處理器(載入到內部非體系結構暫存器)。如果 PAE 標誌與 PG 標誌都設定為 1,則寫入控制暫存器 CR3 會導致將 PDPTR 重新載入到處理器。如果 PAE 標誌設定為 1,且寫入控制暫存器 CR0 以設定 PG 標誌,則將 PDPTR 重新載入到處理器。
DEST SRC;
OF、SF、ZF、AF、PF 及 CF 標誌未定義。
#GP(0) - 如果目前特權級別不是 0。如果試圖將無效的位組合寫入 CR0(例如,在 PE 標誌設定為 0 時,將 PG 標誌設定為 1;或是在 NE 標誌設定為 1 時,將 CD 設定為 0)。如果試圖將 1 寫入 CR4 中的任何保留位。如果在控制暫存器 CR4 中的 PAE 標誌與控制暫存器 CR0 中的 PG 標誌都設定為 1 時,試圖將保留位寫入頁目錄指針表格(在擴充套件實體地址模式中使用)。
#GP - 如果試圖將 1 寫入 CR4 中的任何保留位。
#GP(0) - 這些指令無法在虛 8086 模式中執行。