Board logo

标题: 求教高手:关于汇编语言的问题 [打印本页]

作者: goodboyfast     时间: 2009-3-3 10:17    标题: 求教高手:关于汇编语言的问题

dseg    segment   use16  

;----------------------------------------

gdt   label byte                                                         ;全局描述符表

dummy   descriptor       <>

code    descriptor      <0FFFFh,,,atce,>                    ;代码段描述符      

code_sel=code-gdt                                                  ;选择子   

data    descriptor      <0FFFFh,,,atdw,>              ;数据段描述符

data_sel=data-gdt                                                    ;对应的选择子      

上面的: (gdt   label byte   ;全局描述符表)
是什么意思??,是表示地址还是什么??
这里: ( code_sel=code-gdt  ;选择子) 运算后是地址还是什么数据??
谢谢
作者: netwinxp     时间: 2009-3-4 12:16
保护模式下,段选择子相当于以前的段寄存器,由它和偏移量形成最终的真正地址(含虚拟地址)。段选择子的值是根据一个指向描述表的指针(GDTR寄存器或LDTR寄存器)从描述表取得。
描述表分为全局性(GDT)和局部性(LDT),前者大家可以共享,后者仅当前任务使用。
描述表由多条表项组成,每条表项由16位的限长和32位的地址组成。
gdt label byte是个标签示意这是全局性描述表的开始,上表有两个表项代码段和数据段,0FFFFh也就是所谓的限长,超过这64K范围就会在CPU产生一个硬件中断或异常,后面也就是个32位的地址,这个通常也就是被称为段选择子,它的值用来和偏移量运算形成真正的地址。
保护模式还需要注意另外一个表,叫中断描述表(IDT),它的指针是寄存器IDTR。
作者: goodboyfast     时间: 2009-3-6 05:40
谢谢2楼的解答,原来 gdt   label byte   是表示一个以BYTE为单位的标签.
code_sel=code-gdt  是表示CODE-GDT的长度,也就是CODE_SEL=16.
我这样理解对吗:?在保护模式的书上介绍不详细,说选择子是GDT里的索引.
按此解释CODE_SEL应该为 2 的.
作者: goodboyfast     时间: 2009-3-8 08:33
再次谢谢2楼,现在搞明白了,书上说的不错,因选择子用的是高13位,而一个描述符是8
字节,所以低3位相对来说最多可以表示8,选择子是索引,我以前理解错了,
CODE_SEL的值应该与RPL和TI位联系起来的,如上例,因RPL=0,TI=0,所以
CODE_SEL=8,索引为1