小結:
- 除CRX 和 DRX兩組寄存器外,其他都是 寫需要特權級 讀不需要特權級
- 實模式 只能操作 GDT IDT 和 CRX 和 DRX兩組寄存器
- CRX 和 DRX這兩組寄存器的所有操作都需要特權
寄存器讀寫指令
48位的段寄存器
格式:
SGDT DST,LGDT SRC,SIDT DST,LIDT SRC
說明:
分別是GDT和IDT的讀寫指令
S =SAVE , 將寄存器內容保存到內存那種
L = LOAD, 從內存中加載數據到寄存器
因為這幾個寄存器都是48的,所以不能直接使用其他的寄存器,只能內存尋址
舉例:
SGDT [AX]
LIDT [AX]
內存中的格式:
段界限
段地址
16位的段寄存器
格式:
SLDT DST, LLDT SRC, STR DST, LTR SRC
說明:
分別是LDT和TR的讀寫指令
S =SAVE , 將寄存器內容保存到內存那種
L = LOAD, 從內存中加載數據到寄存器
因為這幾個寄存器都是16的,所以可以使用常規的尋址方式
舉例:
SLDT AX
LIDT [AX]
CRX, DRX
這兩組寄存器是控制寄存器和調試寄存器,他們都使用普通的MOV指令,注意只能寄存器尋址,不能內存尋址
格式
MOV CR0, EAX
MOV EAX, CR0
其他控制指令:
CLTS
格式
CLTS
作用
清理CR0中TS位
HLT
格式
HLT
說明
使CPU暫停,直到觸發中斷或者CPU被復位或重啟
其他測試指令:
ARPL
格式:
ARPL OPRD1, OPRD2
說明:
此指令是用來測試OPRD1作為選擇子時候的特權級的
if( OPRD1.RPL < OPRD2.RPL ) { OPRD1.RPL = OPRD2.RPL ZF = 1 } else{ ZF = 0 }
LAR
格式:
LAR OPRD1, OPRD2
說明:
OPRD2 作為選擇子的指向的表項的屬性段賦值給 OPRD1 成功ZF =1, 失敗 ZF = 0,此函數會有權限檢查
LSL
格式:
LSL OPRD1, OPRD2
說明:
OPRD2 作為選擇子的指向的表項的段界限賦值給 OPRD1 成功ZF =1, 失敗 ZF = 0,此函數會有權限檢查
VERR
格式:
VERR OPRD
說明:
判斷在當前權限下對OPRD作為選擇子指向的段是否具有讀權限 可讀ZF =1, 失敗或不可讀 ZF = 0,此函數會有權限檢查
VERW
格式:
VERW OPRD
說明:
判斷在當前權限下對OPRD作為選擇子指向的段是否具有寫權限 可讀ZF =1, 失敗或不可寫 ZF = 0,此函數會有權限檢查