如果在计算机中,一条指令是 16 位的,并且内存是按 16 位字组织的,那么下一条指令的地址是通过在当前指令的地址上加一个来计算的。如果内存是按字节组织的,可以单独寻址,那么我们需要在当前指令地址上加两个,得到下一条要依次执行的指令的地址。为什么会这样??请解释这个概念。我是计算机组织和汇编语言编程的新手,因此不胜感激。谢谢。
最佳答案
你的问题没有说明你指的是什么架构。
谈论不允许指令与字节对齐的设计,您描述的行为因 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
...
68000 使用类似的寻址方式,如 8 位 CPU。然而,内存实际上是以 16 位为单位组织的,指令必须从偶数地址开始,并且是 16 位长的倍数。因此程序计数器总是包含一个偶数值。它将 增加 2 或每条指令期间 2 的倍数。
(使用奇数地址只允许用于字节方式的内存访问(读/写),这实际上会在后台执行 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
...
程序计数器在此处可能包含奇数或偶数值,但不能包含大于 0x7FFF 的值,因为这将指代未 16 位对齐的字节。当然,程序计数器会增加 1 当指令长度为 16 位时。
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
...
在这个设计中,程序计数器也会增加 1 当指令长度为 16 位时。
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
...
在这种设计中,程序计数器将始终包含 4 的倍数。因为每条指令的长度正好是 4 个字节,程序计数器将为 增加 4 在指令期间。
关于assembly - 如果内存组织为字,为什么程序计数器增加 1,而在字节的情况下增加 2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55171644/