汇编学习笔记(20)

小结:

  1. 除CRX 和 DRX两组寄存器外,其他都是 写需要特权级 读不需要特权级
  2. 实模式 只能操作 GDT IDT 和 CRX 和 DRX两组寄存器
  3. 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,此函数会有权限检查

原文地址:https://www.cnblogs.com/alwaysking/p/12347682.html