关于内存地址深入了解
一直对8086的内存寻址计算有个疑惑:16位段*16让cpu寻址能力增加了98w多个,这些地址都分布在什么地方呢? 按照16位段*16最大的地址应该是fffff=1048560,哪如果使用ffff0(段)+ffff(偏移)=1114095,很明显1114095>1048560,哪怎么解释5个16进制位无法定位的哪些地址呢? 自己顶下,希望大家关注! 一个操作对象, 在内存中会占用一点的空间, 这个空间位置在内存中的记号,就是这个操作对象的操作地址, 而这个空间所存储的数据, 就是这个操作对象的数据! 所以一个操作对象就有了两个概念, 一个操作地址,一个操作数! 你答非所闻 本帖最后由 zhdw 于 2011-8-3 15:23 编辑cpu寻址能力? 是根据 地址总线 16根地址线寻址能力 2的16次方 地址是在内存上的
偏移地址16位 范围0-ffffh之间 你的16位段*16这东西怎么出来的 兄弟,你所说的寻址能力是没有地址加法器之前的结果 哦 你的问题:地址加法器合成一个 20位 物理地址。。。 就此意思! “按照16位段*16最大的地址应该是fffff=1048560,哪如果使用ffff0(段)+ffff(偏移)=1114095,很明显1114095>1048560,哪怎么解释5个16进制位无法定位的哪些地址呢?”
按我的理解对拥有20根地址线(即20位)的8086,段地址×16+偏移地址这只是提供了一种可行的寻址方式,以适应8086单次只能处理16位的现状。
A、20位地址线可表示最小地址为0,最大地址为fffffh。
B、而对于“段地址×16+偏移地址”这个数学表达式而言,其可以表达的最大数为(fffffh+ffffh)
需要注意的是上述A和B的区别,B仅为A采用的寻址方式,对于8086而言,当段地址为ffffh时候,其偏移地址只能为0000~000fh,否则将超出其地址线表示范围。
比如若偏移地址为0010h,则按B,ffff0h+10h=100000h,达到了6位(16进制),若用地址线则需要24根才能表示(当然,对于100000h这个实例,21根地址线也可以表示);超出了8086的寻址能力。
简单一些回答你的问题其实就是一句话。。(ffff0H+ffffh)这个地址是不会出现在8086中,当段地址为ffffh时候,偏移地址>0fh的寻址都是无效的。
你测试过没,不要只说理论哦 那你把你的测试拿出来吧,不知道是我的没讲清楚还是我没看懂你的问题~ ffff*16=ffff0 +ffff是否大于fffff?
外部地址总线20条,那么最大提供fffff个地址标记?
如果是,哪cpu能够找到大于fffff个地址,哪多出来的怎么处理? 在网上查了下,如果超出范围就会以虚拟内存的方式来实现。
要得要得!! 本帖最后由 幕府幽魂 于 2011-8-8 10:21 编辑
tsembrace 发表于 2011-8-5 17:21 http://bbs.fishc.com/static/image/common/back.gif
“按照16位段*16最大的地址应该是fffff=1048560,哪如果使用ffff0(段)+ffff(偏移)=1114095,很明显1114 ...
同意10楼这个解释
8086CPUDOS下的 内存寻址范围能力最大只有2^20=1048576B=1MB,段地址*16+偏移地址=物理地址的最大范围=1MB。物理地址长度是固定的由硬件决定。而1MB也是8086CPU所能看见的最大范围!
其实cpu却能看到大于1M的地方
页:
[1]