如果内存组织为字,为什么程序计数器增加 1,而在字节的情况下增加 2?

Kul*_*rma 3 memory assembly cpu-architecture

如果在计算机中,一条指令是 16 位的,并且内存是按 16 位字组织的,那么下一条指令的地址是通过在当前指令的地址中加一个来计算的。如果内存是按字节组织的,可以单独寻址,那么我们需要在当前指令地址上加两个,得到下一条要依次执行的指令的地址。为什么会这样??请解释这个概念。我是计算机组织和汇编语言编程的新手,因此不胜感激。谢谢。

Mar*_*nau 5

你的问题没有说明你指的是什么架构。

谈到不允许指令与字节对齐的设计,您描述的行为因 CPU 而异

首先我们看一下8位CPU上“地址”的含义。在此类 CPU 上,当从内存中的一个字节到下一个字节时,地址会增加 1:

Address   Meaning
0         1st byte in memory
1         2nd byte in memory
2         3rd byte in memory
3         4th byte in memory
4         5th byte in memory
...
Run Code Online (Sandbox Code Playgroud)

68000采用了类似的解决诸如8位CPU。然而,内存实际上是以 16 位为单位组织的,指令必须从偶数地址开始,并且是 16 位长的倍数。因此程序计数器总是包含一个偶数值。在每条指令期间,它将增加 22的倍数。

(使用奇数地址只允许用于字节方式的内存访问(读/写),这实际上会在后台执行 16 位内存访问。)

对于TMS9900(16 位 CPU),地址为 16 位加 1;可以访问中间的字节,但地址是通过添加 0x8000 形成的:

Address   Meaning
0         1st byte in memory
0x8000    2nd byte in memory
1         3rd byte in memory
0x8001    4th byte in memory
2         5th byte in memory
...
Run Code Online (Sandbox Code Playgroud)

此处程序计数器可能包含奇数或偶数值,但不能包含大于 0x7FFF 的值,因为这将指代未 16 位对齐的字节。当然,当指令长度为 16 位时,程序计数器会加 1

TMS320不允许寻址奇字节:

Address       Meaning
0             1st + 2nd byte in memory
not possible  2nd + 3rd byte in memory
1             3rd + 4th byte in memory
2             5th + 6th byte in memory
...
Run Code Online (Sandbox Code Playgroud)

在此设计中,当指令长度为 16 位时,程序计数器也会增加 1

LittleMIPS(或类似的,我不记得正确的名称)的设计是一个降低MIPS CPU供学生学习微芯片的设计。它只允许 32 位内存访问和 4 对齐地址:

Address       Meaning
0             1st to 4th byte in memory
1             address does not exist
2             address does not exist
3             address does not exist
4             5th to 8th byte in memory
5             address does not exist
...
Run Code Online (Sandbox Code Playgroud)

在这种设计中,程序计数器将始终包含 4 的倍数。因为每条指令的长度正好是 4 个字节,因此在一条指令期间程序计数器将增加 4

  • DEC Alpha 的前几代就像 LittleMIPS:字节地址,但实际上只能对齐 4 字节和 8 字节加载/存储。没有“lbu”/“sb”或“lhu”/“sh”指令来加载/存储任何比 32 位字窄的内容,直到 ISA 扩展添加了它们。(MMIO 区域可以映射到物理地址空间的特殊字节 <-> 字区域,从而可以为具有相邻字节寄存器的 PCI 设备编写驱动程序。) (2认同)
  • @KuldeepSarma 8086 上的寻址工作方式与 68000 类似。但是,与 68000 不同,x86 CPU 也知道只有 8 位长的指令。这也意味着指令可以从任何地址开始。如果指令长为 8 位,则程序计数器加 1;如果指令长为 16 位,则程序计数器加 2。 (2认同)