可以有人解释一下什么是“字”和“字节”可寻址的区别吗?它与内存大小有什么关系?
内存单元是可寻址的。这是我们使用内存的唯一方式。
实际上,内存只有按字节寻址。这意味着:
2
, 4
, 8
取决于CPU的数据总线大小。RAM 有 两种
类型的 内存端口:
32位
用于数据/地址8位
用于 操作码。十进制 2
的二进制
放到MAR上,意图读取单词2
而不是(第二个)字节,会发生什么情况呢?
第二个字
表示32位
机器中的4
、5
、6
、7
字节。在真正的物理内存中,只能进行字节寻址。因此有一个技巧来处理字寻址。32
位并不映射到 32
个地址线(分别是 0-31
)。相反,MAR 的 0
位被连线到 地址总线 的 2
号线,MAR 的 1
位被连线到地址总线的 3
号线,以此类推。由于上面的 2
位仅用于超过 2^32
的字地址,而这些地址都不适用于我们的 32 位
机器,因此将其丢弃。1
时,将 地址4
放置在 总线 上,当 MAR 为 2
时,将 地址8
放置在 总线 上,以此类推。int
的第二个字节的地址。处理字符串(例如像char str[]
这样的数组)变得不方便,因为您仍然将字符紧密地存储在一起。仅修改str[1]
意味着加载包含它的字,进行一些移位/和/或操作以应用更改,然后进行字存储。参见:
char str[]
的示例假定 CHAR_BIT == 8,即使在字寻址机器上也是如此。但实际的 C 实现很可能定义 CHAR_BIT == 32。(如果支持线程,则 C11 将要求这样做:写入一个 char
数组元素不得对包含单词的非原子 RMW 进行操作,因为这可能会引入源中不存在的数据竞争。)我的理解是一些现代 DSP 仍然是字寻址的。(但我五年前不知道。) - Peter Cordes