段寄存器
段寄存器一共有96位
点击查看代码
struct SegMent
{
WORD Selector;
WORD Atrributes;
DWORD base;
DWORD Limt;
}
段描述符
当执行MOV DS,AX
是CPU会查表,根据AX的值来选择查找GDT,LDT表,查找表的什么位置,查出多少数据。理解:并不是把AX的值给DS,AX只是一个索引。base的组成是分开的上面部分是高位,下面是地位。同时limt发现没有32位,这取决于段描述符的G的值为0是Limt=000FFFFF,为1时候Limt=FFFFFFFF.p为表示这个描述符是否可用。
在p为1的情况下 00CF9B00`0000FFFF DPL只有全为1或者0,s为1或者0,为0时候是系统段描述符,这样构成的4位标识一个16进制数处于从左到右的第5位,只有为F或者9时候才是数据段或者代码段。
type位分别代码段或者数据段,第6位大于8就是代码段,否则数据段,因为转成16进制为type为最左边位为0。
数据段说明
代码段说明
D/B位说明
段选择子
段选择子是一个16位的段描述符,该描述符指向了定义该段的段描述符。
理解AX的值就是段选择子,查表后填充到DS里面。
段权限检查
1.如何查看程序处于几环,CPL,当前特权级别CS和SS中存储的段选择子的后俩位,3代表3环,0代表0环。
2.DPL,描述符特权级别,和CPL一致才能访问。
3.RPL,请求特权级别。
点击查看代码
Mov ax,0008
Mov ds,ax
8拆分,1000 RPL取后俩位00 与DPL,CPL一样的意思