梦想飞扬 发表于 2012-4-13 20:02:35

32位汇编如何寻址

dword ptr es:
如果是16位的话,物理地址 = es * 16 + edi
dword ptr es:
但是32位该怎么计算呢?
百度一下这个问题找了很久都看不明白,求指教:dizzy:

梦想飞扬 发表于 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:

bingghost 发表于 2012-4-14 13:58:11

32位模式
也是ds:   这个成为2维的地址   通过GDTR LDTR那套转换成了一维的线性地址xxxxxxxxh
这个转换过程 称为分段
如果没有开启分页机制那么这个转换后的xxxxxxxxh就是物理地址罗

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

大概 就这样罗   

幕府幽魂 发表于 2012-4-14 14:59:28

本帖最后由 幕府幽魂 于 2012-4-14 15:07 编辑

32位的内存管理有3级管理,分段管理和分页管理和页内管理3个。一个程序装入内存后,会有分段,整个程序为了区分每个段会形成一个段号,段的大小不等,由程序员确定。而每个段是有不等数量的页组成,为了管理区分这组页,每个段都形成一个表来管理这些页,这个表叫段表,段的长度决定页的数量,段表里会有每个页的编号等页说明。而页是固定大小的,页也有个表,这个表占此页的一定空间用来是表明此页的属性,比如此页的活跃度,是否可读写等信息,剩下的空间就是各种数据了。这是我个人的理解,也可能不准确,仅供参考,可以配合2楼来理解。

ztc123 发表于 2012-4-16 15:22:50

幕府幽魂 发表于 2012-4-14 14:59 static/image/common/back.gif
32位的内存管理有3级管理,分段管理和分页管理和页内管理3个。一个程序装入内存后,会有分段,整个程序为了 ...

至今这个寻址方式我看了10次,但是还是一头雾水,你这个说法跟书上那个跳来跳去的说明比较易懂

俟过近牵 发表于 2012-4-16 22:18:02

想要彻底解决这个问题就要彻底忘记16位的寻址方式,不要受它影响。想弄明白32位寻址方式还得你自己慢慢体会,因为这个对于初学有点难于理解,我们回帖的只能为你指明下方向,如下:了解保护模式(有助于理解为什么32位会是这样的寻址方式),了解32位段寄存器在保护模式下寻址方式中充当的角色(打破以前16位的束缚),之后便是相对难于理解的部分了(这部分其实也不是那么难,多看几遍,多找几个寻址在脑子里用32位的方式过一遍就好了)。说了这么多,你自己去看下(windows环境下32位汇编语言程序设计),罗云彬的,这书开头说的就是这个。。新手感受,呵呵
页: [1]
查看完整版本: 32位汇编如何寻址