汇编学习笔记(20) - 特权指令
小结:
- 除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,此函数会有权限检查