用于表示定义段的三个参数的数据称为‘描述符’。每个描述符长8个字节。在保护模式下,每一个段都有一个相应的描述符来描述。
存储段是存放可由程序直接进行访问的代码和数据的段。存储段描述符描述存储段,所以,存储段描述符也被称为代码和数据段描述符。长32位的段基地址(即段的开始地址)被安排在描述符的两个域中,其位0~23安排在描述符内第2~4字节中,其位24~31被安排在描述符的第7字节中。长20位的段界限也被安排在描述符的两个域中,其位0~15被安排在描述符内的第0~1字节,其位16~19被安排在描述符内的第6字节的低4位中。
描述符的段属性也被安排在两个域中。其详细说明如下:
①P位,称为存在位。位于段属性位7。P=1表示描述符对地址转换是有效的,或者表示该段描述符所描述的段存在。P=0则表示描述符对地址转换无效,并且引用该描述符会引起异常。
②DPL,位于段属性位5~6,表示描述符特权级,共2位。它规定了该描述符的特权级,用于特权检查,以决定对该段能否进行访问。
③DT位,位于段属性位4。用于说明描述符类型。对于存储段描述符而言,DT=1以区别系统段描述符和门描述符(DT=0)。
④TYPE位,位于段属性位0~3。说明存储段描述符所描述的存储段的具体属性。
其中位0指示描述符是否被访问(Accessed),用符号A标记。A=0表示尚未被访问,A=1表示已被访问。 当把描述符的相应选择子装入到段寄存器时,80386把该位置1,标明描述符已被访问。操作系统可测试访问位,以确定描述符是否被访问过。
其中的位3指示所描述的段是代码段还是数据段。用符号E表示。E=0表示段是不可执行的,也就是数据段,相应的描述符也就是数据段描述符。E=1则表示段是可执行段,也就是代码段,相应的描述符也就是代码段描述符。
在数据段描述符中(E=0)时,TYPE中的位1指示所描述的数据段是否可写,用W标记。W=0表示对应的数据段不可写,只能读,W=1则表示对应的数据段可写。TYPE中的位2就是ED位,指示所描述的数据段的扩展方向。ED=0表示数据向高扩展,也即段内偏移小于等于段界限。ED=1则表示数据向低扩展,也即段内偏移必须大于段界限。
在代码段描述符中(E=1)时,TYPE中的位1指示所描述的代码段是否可读,用R标记。R=0表示对应的代码段不可读,只能执行。R=1则表示对应的代码段可读可执行。TYPE中的位2指示所描述的代码段是否是一致码段,用途C标记。C=0表示对应的代码段不是一致码段,C=1表示对应的代码段是一致码段。
⑤G位,就是段界限粒度位。 G=0表示界限粒度为字节,G=1表示界限粒度为4K字节。注意,界限粒度只对段界限有效,对端基地址无效,段基地址总是以字节为单位的。
⑥D位是一个很特殊的位。在描述可执行段、向低扩展数据段或由SS寻址的段(堆栈段)的三种描述符中的意义各不相同
在描述可执行段的描述符中, D位决定了指令所使用的地址及操作数所默认的大小。D=1表示默认情况下使用32位地址及32位或8位操作数,这样的代码段也成文32位代码段;D=0则表示默认情况下使用16位地址及16位或8位操作数, 这样的代码段也称为16位代码段。
在向低扩展数据段的描述符中,D位决定了段的上部边界。D=1表示段的上部界限为4G;D=0表示段的上部界限为64KB这是为了与8086兼容。
在描述由SS寻址的段描述符中,D位决定了隐式的堆栈访问指令(如push,pop等)使用何种堆栈指针寄存器。D=1表示使用32位的ESP;D=0表示使用16位的SP,这也是为了与8086兼容。
7)AVL位是软件可利用位。
此外,描述符内第6字节的位5必须置0。
存储段描述符的数据结构表示
DESCRIPTOR STRUC
LIMITL DW 0;16位段界限
BASEL DW 0;基地址低16位
BASM DB 0;基地址中间8位
ATTRIBURTES DW 0;属性(含段界限的高4位)
BASEH DB 0;基地址高8位
DESCRIPTOR ENDS
- [somniumchase] 我一运行就说没有数字 01/01 11:44
- [游客] 为什么啊 08/07 15:36
- [游客] 如果想快一些 就改下面这里 dx值改成1H delay: push ax 04/19 02:53
- [lshhjx] 注释在程序中很重要,楼主不知道吗? 12/08 13:40
- [biaggi] 看不明白,在下還須學習 11/06 08:11
- [游客] 我运行的时候直接显示Unkown filename跳出了- -请问怎么改 06/16 21:44
- [游客] 勿庸置疑,注释是好习惯。与人方便自己方便。 04/12 10:33
- [游客] 老实说,看着真心累呀! 04/07 18:37
- [游客] 很无语,初学者就多看书,不要动不动要别人注释,基础打好了,再自己注释,这样比别人帮你注释好得多 12/17 19:43
- [dgkepu] 初学者:不懂,希望有多点注释带着学习学习! 12/07 20:52
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [466987333] 你好,高手,我想请教一个问题。 我用的是win7操作系统,32位的,里面没有找masm目录,是不是 12/12 17:30
- [lanfioncc] 那个太高级了。。。我还有点看不懂。。不过谢谢!!! 11/27 11:23
- [yc2010] 实验16中的 table: dw sub1,sub2,sub3,sub4 可不可以改成呢? 09/11 09:08
- [yc2010] mov bl,ah mov bh,0 add bx,bx ----------->这里为 09/07 21:03
- [yc2010] 为什么要add bx,bx呢? 09/07 20:55
- [yc2010] 那是不是像table[bx],ds[bx]....等(内存单元)都是表示一个字节呢? 09/06 21:10
- [masmaster] 杨季文的《80X86汇编语言程序设计教程》 09/01 12:52
- [游客] to masmaster shl左移4位,那al传进来的4,5,6位背景色不就没了. 为什 09/01 11:00