比如cpu的数据总线位数为32,为什么要规定cpu只能从4的倍数开始读?

wangyu1wangyu 2012-10-23 10:43:37
比如cpu的数据总线位数为32,为什么要规定cpu只能从4的倍数开始读?

我知道cpu一次可以读取4个字节,这样可以提高速度。

我还知道如果比如一个int型如果放在地址不对其的位置要通过多次读取->移位去掉无用字节->拼接得到。

我的问题是为什么不规定可以从任意位置可以读取4个字节呢?而一定要从4开始,如果可以从任意位置开始读4个字节,那么内存不对其的4个字节也就一次读取了
...全文
1125 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyu1wangyu 2012-10-25
  • 打赏
  • 举报
回复
谢谢1楼的回答,根据你的提示我查了查内存的结构和地址译码方式,说下我的见解。我们知道内存是通过位扩展和字扩展获得的。

如果我们同时想取得连续的四个字节的内容,那么这四个字节肯定不能放到同一片上,并且地址的低位应该是片选地址。

但是我们的片的数目肯定是有限的,如果按照我的思路任意位置可以去取得连续四个字节那么久需要每个字节为一片,这显然不现实,所以要同时取得四个字节,比如我们只有4片的字扩展,那么就必须按照4字节对齐的方式去取才可能同时取得四个连续的字节。

这样就出现了个问题,其实地址总线低两位是没有用的。
tianfang 2012-10-25
  • 打赏
  • 举报
回复
楼主2楼的理解是对的

但是,内存读取,并不仅仅读取32位数据,也有8位字节的读写需要;
另外,IO读取也是使用地址总线传递地址,也需要只读取字节的地址;

使用地址总线的低两位不是无用的
Rao_risk 2012-10-24
  • 打赏
  • 举报
回复
这个问题和存储的结构和寻址方式有很大关系。正如楼主所言,每次取4位是为了提高效率,所以我们以下的讨论都围绕一次取思维讨论。
1. 存储器其实是很多个存储单元组成的阵列,需要通过地址起寻址找到对应的存储单元。一般存储器都将地址分成了行地址和列地址。每当输入一个地址的时候,通过译码器,每个行地址对应一行,每个列地址选中一类,行和列的交叉就是我们要寻址的存储单元。如果按楼主的思路就有可能导致存储单元分散到不同的行和列,通过传统的译码方式就很难寻址成功了。这必然会导致译码电路复杂从而降低效率也就是速度。
2. 每当选中存储单元之后,数据就被传到了数据线上,然后进一步到达寄存器。当我们想要取1,2,3,4四个单元是,假设0-7,8-15,16-23,24-31数据线正好分别对应四个单元,但是如果我们存储2,3,4,5的时候也要求他们分别对应0-7,8-15,16-23,24-31数据线,这就必然要有一个专门的电路进行这些操作。而现有的按4的倍数寻址就不存在这样的问题了。每个存储单元永远只对应8根地址线,不需要额外的电路,了不起就是为每个数据线对应一个类似三态门的读写电路。

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧