我正在创建一个受 LC-3 VM 启发的原始虚拟机,但它是 32 位版本。我正在给机器提供指令集。执行完第一条指令后,PC如何知道第二条指令的位置。
是否有一种特定的方法可以系统地将指令存储在内存中,以便 PC 知道下一条指令的地址
示例 - 所有指令都以线性方式存储,如内存 [0] = 指令 1、内存 [1] = 指令 2 等。
感谢您的帮助。
我正在创建一个受 LC-3 VM 启发的原始虚拟机,但它是 32 位版本。我正在给机器提供指令集。执行完第一条指令后,PC如何知道第二条指令的位置。
是否有一种特定的方法可以系统地将指令存储在内存中,以便 PC 知道下一条指令的地址
示例 - 所有指令都以线性方式存储,如内存 [0] = 指令 1、内存 [1] = 指令 2 等。
感谢您的帮助。
这取决于您的处理器架构是 RISC 还是 CISC。在您询问的上下文中,CISC 处理器具有大小不同的指令,例如从 1 到 14 个字节,就像英特尔处理器一样。如果是 RISC,则每条指令的大小都是固定的,比如 4 字节,就像 ARM 处理器一样。程序的所有指令都按顺序存储在主存储器中。处理器控制单元决定增加多少 PC。来自主存储器的指令将按顺序读取。
所以说在CISC架构中,从主存储器读取的单个8字节可以包含多达8个“1字节”指令,例如,英特尔处理器中的重复“inc ax”指令。在发送第一条解码指令后,控制单元将 PC 加 1。但是,在另一个极端,可能会有类似 'add REG , [BASE+INDEX+OFFSET]' 的指令,它可能需要 13 个字节来存储所有指令中的信息(操作码 + REG id + 基地址 + 索引 + 一些偏移量)。对于这样的指令,需要两次内存读取操作来获取完整的指令。发送解码后,控制单元将 PC 加 13。
对于 RISC,这很简单。将 PC 增加指令的大小 (2,4,...)。
唯一的例外是有分支时。在这种情况下,PC 值通常在执行阶段被重置。
指令和数据通常被分组(在某些处理器架构中被分段)并单独存储。代码段将以某种返回或退出指令结束。如果 PC 设置为存储数据的某个内存地址,则处理器的控制单元会将其作为指令处理。毕竟数据和指令都只是一个位序列!控制单元将无法区分。通常是操作系统或程序员的角色(如果没有操作系统,比如在微控制器上)来防止这种异常。