在实模式下,逻辑地址空间中存储单元的地址由段值和段内偏移两部分组成。 在保护模式下,虚拟地址空间(相当于逻辑地址空间)中存储单元的地址由段选择子和段内偏移两部分组成。 与实模式相比,段选择子取代了段值。
段选择子1长6位。其高13位是描述符索引(Index)。 所谓描述符索引是指描述符在描述符表中的序号。 段选择子的第2位是引用描述符指示位,标记为Ti,TI=0指示从全局描述符表GDT中读取描述符;TI=1指示从局部描述符表LDT中读取描述符。 选择子最低两位是请求特权级RPL,用于特权检查。
选择子确定描述符,描述符确定段基地址,段基地址和段内偏移之和就是线性地址。 所以,虚拟地址空间中的由段选择子和段内偏移构成的二维虚拟地址,就是这样确定了现行地址空间中的一维线性地址。
例如某个段选择子的值是0030H, 那么:描述符索引Index=6,描述符指示位TI=0,RPL=0,所以它指定全局描述符表中的第6个描述符,请求特权级是0
由于段选择子中的描述符索引字段由13位表示, 所以可区分8096个描述符(2^13)。这也就是描述符表最多含有8096个描述符的原因。
由于每个描述符长8个字节,根据段选择格式,屏蔽选择低3位后所得的值就是段选择子所指定的描述符在描述符表中的偏移,这可以认为是安排选择子高13位作为描述符索引的原因。
有一种特殊的选择子称为空选择子(NULL),它的Index=0,TI=0,而RPL任意值。空选择子有特定的用途,当用空选择子进行存储访问时会引起异常。空选择子是特别定义的,它不对应于全局描述符表GDT中的第0个描述符,因此GDT中的第0个描述符总不会被CPU访问, 一般把它置全0. 但是当TI=1时,Index=0的选择只不是空选择子,它指定了当前任务LDT中的第0个描述符。
- [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