论坛: 编程破解 标题: 汇编问题:如何理解段内地址?为什么要分段? 复制本贴地址    
作者: bluezzb [bluezzb]    论坛用户   登录
书上没有详细讲解,不知哪位大虾能帮我讲解一下段内地址这一节?
还有,“16位的机器”是什么意思?
期待有更深层次的讲解……
谢谢~~~~


地主 发表时间: 04-10-10 11:50

回复: anfer [anfer]   论坛用户   登录
16位机是指运算器一次最多可以处理16位的数据;
寄存器的最大宽度为16位;
寄存器和运算器之间的通路为16位;

段的划分来自于CPU,由于8086CPU 用“基础地址(段地址*16)+偏移地址=物理地址”的方式给出内在单元的物理地址使得我们用分段的方式来管理内存


[此贴被 八路军撇石头(anfer) 在 10月10日13时40分 编辑过]

B1层 发表时间: 04-10-10 13:35

回复: hackgou [hackgou]   论坛用户   登录
其实段的来历比较简单:在dos时代(硬件方面是386以下),因为16位的处理器无法访问(寻址)20位的地址总线提供的1M内存,于是就使用分段的办法解决:每个段64K,(按照最大段来计算,多少段?1M/64K=16个段),这样就可以利用两个16位寄存器来寻址这20位的1M内存(虽然,是浪费了12位宝贵的寄存器位数,两个16位寄存器合起来的寻址能力是2^32=4G,现在只需利用其中2^20的寻址能力,但却变相实现了利用两个16位寄存器来寻址20位1M的内存的功能),因此可以利用一个寄存器来表示段地址(那个64K的段从哪儿开始),另外一个16位的寄存器来表示你要访问的数据在该64K的段内的什么地方。起前一个功能的寄存器就叫段寄存器(按段寄存器所指的段的用途来分,这些段寄存器又分为:CS、DS、SS、ES等。而后一个功能则一般通过通用寄存器来实现的,通常后面这个用来在段内寻址的地址就叫做段内偏移(offset),它也是16位的寄存器。

在具体寻址的时候是如何计算的呢?段寄存器和段内偏移地址直接相加?不是的,因为那样最多能够达到17位的寻址能力。正确的做法是将段寄存器左移4位,然后加上段内偏移地址,这样就得到了20位的地址了,使用则20位地址就能够实现1M的存储空间寻址。

现在32位平台下的这些理论已经不实用了,因为32位的CPU的寻址能力达到4G,则就是为什么32位的操作系统说它支持最大4G内存,而32的应用程序也说它自己有4G的存储空间寻址能力,(虽然背后引入页面文件等等新的理论),但是理解16位的分段,却可以帮助我们理解这些更加复杂的32寻址方式。




[此贴被 憨狗(hackgou) 在 10月10日13时48分 编辑过]

B2层 发表时间: 04-10-10 13:46

回复: bluezzb [bluezzb]   论坛用户   登录
感谢二三楼大虾的热情解答。
今晚得慢慢体味了。。
谢谢~~~~


B3层 发表时间: 04-10-10 18:05

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号