2010-04-27 82 views
18

有人可以解释WordByte寻址之间有什么不同吗?它与内存大小等有什么关系?字寻址和字节寻址的区别

+2

请参阅[byte-vs. word-addressing schemes](http://tams-www.informatik.uni-hamburg.de/applets/ hades/webdemos/50-rtlib/40-memory/byte-vs-word.html):>基于字节和字的寻址方案演示。 – 2010-04-27 19:41:10

回答

25

一个字节是用于存储的存储器单元,并且存储器芯片充满了这些字节。内存单元是可寻址的。这是我们可以使用记忆的唯一途径。

实际上内存只能字节寻址。 这意味着一个二进制地址总是指向单个字节。一个字只是一组字节– 2,4,8,具体取决于CPU的数据总线大小。


要充分理解存储器操作,您必须熟悉CPU的各种寄存器和RAM的存储器端口。我假设你知道'MAR存储器地址寄存器','MDR存储器数据寄存器','PC程序计数器寄存器','MBR存储器缓冲寄存器'的含义。 RAM有两个存储器端口:32位用于数据/地址,8位用于OPCODE。

假设CPU想从地址xyz开始读取一个单词(比如说4个字节)。 CPU会将地址放在MAR上,并向内存控制器芯片发送内存读取信号。在接收到地址和读信号后,内存控制器将数据总线连接到32位端口,从地址xyz开始的4个字节将从端口流出到MDR。

如果CPU想要获取下一条指令,它会将地址放到PC寄存器中并向存储控制器发送一个提取信号。接收到地址和提取信号后,存储器控制器将数据总线连接到8位端口,位于接收地址的单字节长操作码将流出RAM到CPU的MDR。

所以这就是我们说某个寄存器是'内存寻址'或'字节寻址'的意思。现在会发生什么事情,当你在MAR上用二进制表示二进制数字时,有意读“2”字,而不是(字节号2)?

字数2表示32位机器的字节数4,5,6,7。实际上,物理内存只能字节寻址。所以有处理'字寻址'的技巧。
当MAR位于地址总线上时,其32位不会分别映射到32位地址线0-31上。相反,MAR位0连接到地址总线2,MAR位1连接到地址总线3,依此类推。 MAR的高2位被丢弃,因为它们只用于高于2^32的字地址,而这些地址对于我们的32位机器都不合法。
使用这种映射,当MAR为1时,地址4被放到总线上,当MAR是2时,地址8被放到总线上等等。

在开始理解时有点困难。我从Andrew Tanenbaums的“结构化计算机组织”中学到了它。

1

此图片应该可以很容易理解: http://i.stack.imgur.com/rpB7N.png

简而言之,

•在字节寻址方案,第一个字开始于地址0, 第二个字地址4​​处开始。

•在字寻址方案,第一个字的所有字节都位于地址0 ,和第二个字的所有字节都位于地址1。

当我们考虑一次处理一个字节的数据的应用程序时,字节寻址的优势就很明显了。在字节可寻址系统中访问单个字节只需要发布单个地址。在16位字寻址系统中,首先需要计算包含字节的字的地址,取出该字,然后从两字节字中提取字节。虽然字节提取的过程很好理解,但它们不如直接访问字节有效。由于这个原因,许多现代机器都是字节可寻址的。

1

可寻址性是具有自己地址的内存单元的大小。它也是您可以在不影响其邻居的情况下修改的最小内存块。

例如:一台机器,其中字节是正常的8位,字长= 4字节。如果它是一个可寻址的机器,则不存在如int的第二个字节的地址。处理字符串(例如像char str[]这样的数组)变得不方便,因为您仍然存储包装在一起的字符。修改str[1]意味着加载包含它的单词,做一些移动/和/或操作来应用更改,然后再进行单词存储。

请注意,这与不允许未对齐的字加载/存储(其中字地址的低2位必须为0)的机器不同。这些机器通常有一个字节加载/存储指令。我们谈论的机器没有那个。

CPU地址实际上可能仍然包含低位,但要求它们始终为零(或忽略它们)。但是,在检查它们为零之后,可能会丢弃它,因此内存系统的其余部分只能看到字地址,其中两个相邻字的地址相差1(而不是4)。但是,在一个寄存器只能容纳64k个不同地址的16位CPU上,你不可能这样做。每个独立的CPU地址都会引用不同的2字节内存,而不是丢弃低位。 2B字寻址内存可以让你寻址128K字节的内存,而不是64K字节寻址的内存。有趣的事实:ARM使用地址的低2位作为未对齐字加载的混洗控制。 (但它总有一个字节load/store指令。)


参见:


需要注意的是位寻址存储器可能存在,但没有。 8位字节现在几乎是通用的标准。 (古代计算机有时有更大的字节,请参阅wikipedia's Byte article的历史部分。)