鱼C论坛

 找回密码
 立即注册
查看: 1912|回复: 2

Win32汇编寻址问题

[复制链接]
发表于 2013-5-20 19:09:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 s0512 于 2013-5-25 11:45 编辑

Win32汇编段地址是16位,偏移是32位的,例如 1000:A000B000这样,因为在保护模式下这样显示是虚拟地址,具体虚拟地址应该是1000*10H+A000B000 = A001B000H,我刚学WIN32汇编不知道我上面这样理解有没有错误,求大家指导!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-24 14:34:32 | 显示全部楼层
复制来的,你看一下:
16位的段选择器高13位表示索引值,剩下三位:第0,1位表示程序的当前优先级RPL(Request Privilege Level),第二位TI位用来表示在段描述符中的位置:TI=0表示在GDT中,TI=1表示在LDT中(因为有些系统提供的代码不存在任何LDT中)

在保护模式下,以xxxx:yyyyyyyy(都是16进制的)格式表示一个虚拟地址。单凭段选择器中的数值xxxx无法反映出段基址在哪里。对于这个地址,先看xxxx的TI位是否为0,如果是,从GDTR寄存器中获取GDT的基址,然后再GDT中以段选择器xxxx的高13位作为位置索引得到段描述符,段描述符包含了段的基址、限长、优先级等各种属性,这样就得到了段的起始地址。

如果xxxx的TI位为1,表示段描述符在LDT中,第一步的操作还是从GDTR寄存器中获取GDT基址,然后从LDTR中获取LDT所在段的位置索引,以这个位置索引在GDT中得到LDT段的位置,然后才用xxxx做索引从LDT段中得到段描述符。

得到段基址后,用段基址加上yyyyyyyy得到最后的线性地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-24 21:15:24 | 显示全部楼层

十分感谢!很清楚,谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 18:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表