鱼C论坛

 找回密码
 立即注册
查看: 2768|回复: 5

32位汇编如何寻址

[复制链接]
发表于 2012-4-13 20:02:35 | 显示全部楼层 |阅读模式

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

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

x
dword ptr es:[di]
如果是16位的话,物理地址 = es * 16 + edi
dword ptr es:[edi]
但是32位该怎么计算呢?
百度一下这个问题找了很久都看不明白,求指教:dizzy:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-13 20:42:13 | 显示全部楼层
因为80386所有的通用寄存器都是32位的,232相当于4G,所以用任何一个通用寄存器来间接寻址,不必分段就已经可以访问到所有的内存地址。这是不是说,在保护模式下,段寄存器就不再有用了呢?答案是否定的。虽然在寻址上不再有分段的限制问题,但在保护模式下,一个地址空间是否可以被写入,可以被多少优先级的代码写入,是不是允许执行等涉及保护的问题就出来了。要解决这些问题,必须对一个地址空间定义一些安全上的属性。段寄存器这时就派上了用途。但是涉及属性和保护模式下段的其他参数,要表示的信息太多了,要用64位长的数据才能表示。我们把这64位的属性数据叫做段描述符(Segment Descriptor)。把所有段的段描述符顺序放在内存中的指定位置,组成一个段描述符表(Descriptor Table);而段寄存器中的16位用来做索引信息,指定这个段的属性用段描述符表中的第几个描述符来表示。这时,段寄存器中的信息不再是段地址了,而是段选择器(Segment Selector)。可以通过它在段描述符表中“选择”一个项目以得到段的全部信息。
    80386中引入了两个新的寄存器来管理段描述符表。一个是48位的全局描述符表寄存器GDTR,一个是16位的局部描述符表寄存器LDTR。GDTR指向的描述符表为全局描述符表GDT(Global Descriptor Table)。它包含系统中所有任务都可用的段描述符,通常包含描述操作系统所使用的代码段、数据段和堆栈段的描述符及各任务的LDT段等;全局描述符表只有一个。
    LDTR则指向局部描述符表LDT(Local Descriptor Table)。80386处理器设计成每个任务都有一个独立的LDT。它包含有每个任务私有的代码段、数据段和堆栈段的描述符,也包含该任务所使用的一些门描述符,如任务门和调用门描述符等。

以上是网上找的一些资料,不过那些概念完全看不明白:dizzy:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-14 13:58:11 | 显示全部楼层
32位模式
也是ds:[xxxxxxxx]   这个成为2维的地址   通过GDTR LDTR那套  转换成了一维的线性地址xxxxxxxxh
这个转换过程 称为分段
如果没有开启分页机制  那么  这个转换后的xxxxxxxxh  就是物理地址罗

如果开启了分页机制  
那么  xxxxxxxxh这个地址  在通过分页机制的转换  得到最后的  物理地址

大概 就这样罗   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-14 14:59:28 | 显示全部楼层
本帖最后由 幕府幽魂 于 2012-4-14 15:07 编辑

32位的内存管理有3级管理,分段管理和分页管理和页内管理3个。一个程序装入内存后,会有分段,整个程序为了区分每个段会形成一个段号,段的大小不等,由程序员确定。而每个段是有不等数量的页组成,为了管理区分这组页,每个段都形成一个表来管理这些页,这个表叫段表,段的长度决定页的数量,段表里会有每个页的编号等页说明。而页是固定大小的,页也有个表,这个表占此页的一定空间用来是表明此页的属性,比如此页的活跃度,是否可读写等信息,剩下的空间就是各种数据了。这是我个人的理解,也可能不准确,仅供参考,可以配合2楼来理解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-16 15:22:50 | 显示全部楼层

至今这个寻址方式我看了10次,但是还是一头雾水,你这个说法跟书上那个跳来跳去的说明比较易懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-16 22:18:02 | 显示全部楼层
想要彻底解决这个问题就要彻底忘记16位的寻址方式,不要受它影响。想弄明白32位寻址方式还得你自己慢慢体会,因为这个对于初学有点难于理解,我们回帖的只能为你指明下方向,如下:了解保护模式(有助于理解为什么32位会是这样的寻址方式),了解32位段寄存器在保护模式下寻址方式中充当的角色(打破以前16位的束缚),之后便是相对难于理解的部分了(这部分其实也不是那么难,多看几遍,多找几个寻址在脑子里用32位的方式过一遍就好了)。说了这么多,你自己去看下(windows环境下32位汇编语言程序设计),罗云彬的,这书开头说的就是这个。。新手感受,呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-20 01:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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