Kul*_*rma 3 memory assembly cpu-architecture
如果在计算机中,一条指令是 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
...
Run Code Online (Sandbox Code Playgroud)
在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
...
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。