yjjdick 发表于 2013-5-20 19:09:30

Win32汇编寻址问题

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

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

穷山恶水出刁民 发表于 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得到最后的线性地址

yjjdick 发表于 2013-5-24 21:15:24

穷山恶水出刁民 发表于 2013-5-24 14:34 static/image/common/back.gif
复制来的,你看一下:
16位的段选择器高13位表示索引值,剩下三位:第0,1位表示程序的当前优先级RPL(Reques ...

十分感谢!很清楚,谢谢你
页: [1]
查看完整版本: Win32汇编寻址问题