有人可以解释一下Word
和Byte
可寻址之间有什么不同吗?它与内存大小等有什么关系?
3 回答
内存单元是可寻址的。这是我们使用内存的唯一方法。
实际上,内存只能按字节寻址。它的意思是:
- 二进制地址总是只指向
a single
字节。 - 一个字只是
a group of
字节–2
,4
,8
取决于 CPU 的数据总线size of
。
要全面了解内存操作,必须熟悉CPU的各种寄存器和RAM的内存端口。我假设您知道它们的含义:
- MAR(内存地址寄存器)
- MDR(内存数据寄存器)
- PC(程序计数器寄存器)
- MBR(内存缓冲寄存器)
RAM有two
多种内存端口:
32-bits
用于数据/地址8-bit
对于操作码。
假设CPU想要从地址开始读取a
字(比如4
字节) 。CPU 会将地址放在MAR上,向内存控制器芯片发送内存读取信号。在接收到地址和读取信号后,内存控制器会将数据总线连接到端口,并从地址开始从端口流出到MDR。 xyz
32-bit
4 bytes
xyz
如果CPU想要获取下一条指令,它会将地址放到PC 寄存器中并向内存控制器发送一个获取信号。接收到地址和取指信号后,内存控制器会将数据总线连接到位端口,位于接收到的地址处的字节长操作码将从RAM流出到CPU的MDR。8
a single
这就是我们说某个寄存器是内存可寻址或字节可寻址的意思。现在,当您输入MAR并打算读取单词而不是(字节编号)时会decimal 2
发生什么?binary
2
2
Word no2
表示机器的字节 4
, 5
, 6
, 7
。32-bit
在实际物理内存中,只能按字节寻址。所以有一个技巧来处理字寻址。
当MAR放置在地址总线上时,它的位32
不映射到32
地址线(0-31
分别)。相反,MAR bit 0
连接到地址总线 line 2
,MAR bit 1
连接到地址总线 line 3
,依此类推。MAR2 bits
的上部被丢弃,因为它们只需要高于我们机器的任何一个字地址都不是合法的。
使用此映射,当MAR为时,放在总线上,当MAR为时,放在总线上2^32
32 bit
1
address 4
2
address 8
等等。
一开始有点难以理解。我是从Andrew Tanenbaums的结构化计算机组织中学到的。
这张图片应该很容易理解:http: //i.stack.imgur.com/rpB7N.png
简单的说,
• 在字节寻址方案中,第一个字从地址 0 开始,第二个字从地址 4 开始。
• 在字寻址方案中,第一个字的所有字节都位于地址 0,第二个字的所有字节都位于地址 1。
当我们考虑一次处理一个字节的数据的应用程序时,字节寻址能力的优势就很明显了。在字节可寻址系统中访问单个字节只需要发出单个地址。在 16 位字可寻址系统中,首先必须计算包含该字节的字的地址,取出该字,然后从两字节字中提取该字节。尽管字节提取的过程很好理解,但它们的效率不如直接访问字节。出于这个原因,许多现代机器都是字节可寻址的。
可寻址性是具有自己地址的内存单元的大小。它也是您可以在不影响其邻居的情况下修改的最小内存块。
例如:一台机器,其中字节是正常的 8 位,字大小 = 4 字节。如果它是一台可字寻址的机器,那么就没有int
. 处理字符串(例如,类似 的数组char str[]
)变得不方便,因为您仍然将字符存储在一起。修改只是str[1]
意味着加载包含它的单词,进行一些移位/和/或操作以应用更改,然后进行单词存储。
请注意,这与不允许未对齐字加载/存储的机器不同(其中字地址的低 2 位必须为 0)。此类机器通常具有字节加载/存储指令。我们谈论的是没有那个的机器。
CPU 地址实际上可能仍然包含低位,但要求它们始终为零(或忽略它们)。但是,在检查它们是否为零之后,可以将其丢弃,因此内存系统的其余部分只能看到字地址,其中两个相邻字的地址相差 1(而不是 4)。但是,在一个寄存器只能保存 64k 个不同地址的 16 位 CPU 上,您不太可能这样做。每个单独的 CPU 地址将引用不同的 2 字节内存,而不是丢弃低位。2B 字可寻址内存可让您寻址 128kiB 的内存,而不仅仅是 64kiB 的字节可寻址内存。
有趣的事实:ARM 曾经使用地址的低 2 位作为未对齐字加载的随机控制。(但它总是有字节加载/存储指令。)
也可以看看:
请注意,位寻址存储器可能存在,但不存在。8 位字节现在几乎是通用标准。(古代计算机有时有更大的字节,请参阅维基百科字节文章的历史部分。)