问个CPU内存寻址的问题
发这儿合适吧...
1:8086CPU 字长16位(字长16位是寄存器大小的以上么?),地址总线20
这个说法对么?
2:8086CPU用1个寄存器16位就不能充分利用20跟地址总线,所以设计了段地址和偏移地址(2个寄存器)来充分利用20跟地址总线?
(段地址+偏移地址多麻烦啊,但CPU设计成那样了,没法,将就CPU)
PS:如果当初8086字长和数据总线一样大,是否就可能没有段地址+偏移地址这个说法?
3:2个寄存器(CS+IP)总共是32位,来放20位的数据(20跟地址总线),应该是有浪费的,中间有很多重复,这也是一个地址可以由不同的段地址+偏移地址组成的原因?
4:即使是2个寄存器32位放16位的数据远远足够,但考虑发展很快,所以地址分配依然从0开始,也就是先放满IP寄存器,(好比一个数字的低位),再放CS寄存器高位,IP寄存器16位,也就是最多指向64K空间,满了64K空间才进一位进到CS寄存器上去(好比一个数字的高位).
(这段不知道我表述清楚没)
5:如果第四条正确,那么后面就有很多空余的地址配额可以指向更多的空间,但从汇编书上看,那些地址并没有空闲,因为段地址*16+偏移地址这个计算方式,让每一个地址都指向了1M之内的内存空间
(我认为白白浪费点了,还让我们计算的麻烦,不知道为什么用这个方法?)
(我想出来的就是IP寄存器取16位,CS寄存器取低4位然后组合成一个20位地址,刚好对应20跟地址总线,然后CS寄存器的高12位用于以后更多地址总线的寻址)
(用段地址*16+偏移地址这个计算方式难道是计算机不方便从CS寄存器中单独取4位出来?)
(为什么乘以16,我脑袋不大灵活,没想出来.)
6:286有24跟地址总线,照4,5的理解,CS:IP没有20跟地址总线浪费那么多了,但意味着8086上的地址在286上指向了不同的地方,意味着程序的不通用,我感觉这是不大可能的,我可能错在没有理解到那个段地址*16上?
7:386,486都是32字长和32地址总线,完全利用,没有浪费,用1个寄存器就行了嘛,但为了程序通用,估计浪费个寄存器也无所谓哦,这方面地址是怎么处理的?
82 32位字长,36位地址总线,还是要用2个寄存器,64位放36位数据,地址算法又是咋样?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
8086CPU
2个寄存器32位,总共可以放2^32个的地址,但1M只有2^20个地址
2^32个地址全部都指向2^20个地址去了么,意思是平均一个地址有2^12种写法?
你的问题这么多,还不如找本好书仔细看,介绍本好的教材给你《ISA System Architecture (3rd 》网上搜索一下,你能坚持将此书看完且能看两次,那么你的基本就打得很好了。
汗,这些问题是你自己想出来的? 还是书上的?
ISA System Architecture没中文版本啊,E文的我看不懂。。
我在看王爽那本汇编语言,看到大概120页了,感觉模模糊糊的,不是很懂。。
然后我买了本IBMPC汇编语言程序设计,我看到那个寻址方式多啊,复杂啊,也是没看几页,大概看到50页,感觉就看不下去了。。。
想到内存地址不太明白,就一直想下去,就想出这些问题了。。
直接用1,2,3这样挨顺序表示地址很直观啊,不知道当初是基于什么一个原因用了现在书上讲的寻址方式。
没看过王爽的汇编语言,《ISA System Architecture》真的比这些什么什么汇编语言强多了。E文不好,可以用金山词霸翻着看,坚持下去。我看E文不懂时也这样
王爽那本汇编语言不错,属于经典的汇编书了。可惜书店居然找不到,四川书市都没找到。
:em12: 用金山词霸看估计太郁闷了点。。。
cjaizss大虾对硬件了解,等他来解答
再简化下问题
16位寄存器放不下20位的地址,所以用2个寄存器放,这能理解,但为啥不直接把20位地址从0到FFFFF编号,低于FFFF的部分放到IP寄存器当中,高的部分直接放到CS寄存器的低4位去呢,这样CPU拿地址的时候直接把CS寄存器的低4位拿出来后面加上16个0然后再加上IP当中取出来的值。
又说了那么多,没简化成。还是等答案,先不说了
要是以后地址总线是寄存器的3倍,NND,2个寄存器都不够放了,得用3寄存器了。。
汗~ 建议你爱听就听不听就算了。你就等着 cjaizss 给你解答吧
最后答你一次:
20 位地址的形式是: 高16位地址放CS,也即是放CS后,低4位被置为0,再上 offset 得20位地址。
20位的地址编号本来就是从 0 至 FFFFF,只是你转不过弯来而已,这20位地址的编号采取段式内存管理进行分段,形式一个段基CS加上偏移量这种表示形式。实际上编号是0到FFFFF
不是这个意思,英语的我不大可能看的动,要知道我的英语是最差的一科,150分的题我才能得40-50分
假设CS地址FFFF,IP也是FFFF,那么地址就指向10FFEF去了,就超过1M内存了,cpu会把高位丢掉?,按照0FFEF去寻址?
CS的高16位地址加上4位偏移地址,问题是IP是有16位啊, 这点我就不明白了...
LZ 在思考问题,顶一下.
在纯数学逻辑上,有些观点是对的(如1,3).
对于分段的概念,LZ应结合当时OS的理论模型更容易理解,实际上段可以有代码段,数据段等, 有段寄存器最大的好处就是代码和数据可以处于约束保护之中,当然这一点8086做的并不完善,所以80386以上的保护模式就有了段大小的限制(CS,DS也不是直接的段地址了).
在多任务系统中,不同的任务可以处于不同的段中,而段中的指令和数据地址则可线性增长. 至于在内存中的实际起始位置则有段决定. 这样有利于配合OS对任务进行调度....因此段地址有多种组合在实际中是有意义的.
.......
[ 本帖最后由 system888net 于 2008-5-4 09:11 编辑 ]