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

标签 assembly memory 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
...

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/

相关文章:

winapi - 如何在64位Windows Assembly中使用 "GS:"(例如,移植TLS代码)

performance - Go 语言指针性能

Ruby 符号不是垃圾收集的!?那么,使用String不是更好吗?

cpu-architecture - MIPS 处理器 I/O 设备支持

assembly - 何时在 MASM 中将 EXTERNDEF 与 ABS 一起使用?

assembly - Intel X86-64 组装教程或书籍

assembly - movsbl指令做什么?

java - 加载 100MB 文件时出现 OutOfMemoryError,尽管有 550MB 堆

linux - arm "versions?"之间的差异(仅限 ARMv7)

c# - Visual Studio 中 "Prefer 32-bit"设置的用途是什么?它实际上是如何工作的?