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