![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-19 23:55 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,270 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 求教高手:关于汇编语言的问题 |
| 可打印版本 1,343 / 3 |
| 第1楼 goodboyfast | 发表于 2009-03-03 10:17 |
| 新手上路 发帖 5 积分 14 | |
|
求教高手:关于汇编语言的问题 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 ;选择子) 运算后是地址还是什么数据?? 谢谢 |
|
| 第2楼 netwinxp | 发表于 2009-03-04 12:16 |
| 高级用户 发帖 366 积分 741 | |
|
保护模式下,段选择子相当于以前的段寄存器,由它和偏移量形成最终的真正地址(含虚拟地址)。段选择子的值是根据一个指向描述表的指针(GDTR寄存器或LDTR寄存器)从描述表取得。
描述表分为全局性(GDT)和局部性(LDT),前者大家可以共享,后者仅当前任务使用。 描述表由多条表项组成,每条表项由16位的限长和32位的地址组成。 gdt label byte是个标签示意这是全局性描述表的开始,上表有两个表项代码段和数据段,0FFFFh也就是所谓的限长,超过这64K范围就会在CPU产生一个硬件中断或异常,后面也就是个32位的地址,这个通常也就是被称为段选择子,它的值用来和偏移量运算形成真正的地址。 保护模式还需要注意另外一个表,叫中断描述表(IDT),它的指针是寄存器IDTR。 |
|
| 第3楼 goodboyfast | 发表于 2009-03-06 05:40 |
| 新手上路 发帖 5 积分 14 | |
|
谢谢2楼的解答,原来 gdt label byte 是表示一个以BYTE为单位的标签.
code_sel=code-gdt 是表示CODE-GDT的长度,也就是CODE_SEL=16. 我这样理解对吗:?在保护模式的书上介绍不详细,说选择子是GDT里的索引. 按此解释CODE_SEL应该为 2 的. |
|
| 第4楼 goodboyfast | 发表于 2009-03-08 08:33 |
| 新手上路 发帖 5 积分 14 | |
|
再次谢谢2楼,现在搞明白了,书上说的不错,因选择子用的是高13位,而一个描述符是8
字节,所以低3位相对来说最多可以表示8,选择子是索引,我以前理解错了, CODE_SEL的值应该与RPL和TI位联系起来的,如上例,因RPL=0,TI=0,所以 CODE_SEL=8,索引为1 |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |