【发布时间】:2026-01-25 12:50:02
【问题描述】:
68k 寄存器分为两组,每组 8 个。八个数据寄存器(D0 到 D7)和八个地址寄存器(A0 到 A7)。这种分离的目的是什么,联合起来会不会更好?
【问题讨论】:
68k 寄存器分为两组,每组 8 个。八个数据寄存器(D0 到 D7)和八个地址寄存器(A0 到 A7)。这种分离的目的是什么,联合起来会不会更好?
【问题讨论】:
简短的回答是,这种分离来自当时的架构限制和设计决策。
长答案:
M68K 实现了很多寻址模式(尤其是与基于 RISC 的处理器相比时),它的许多指令支持大多数(如果不是全部)它们。这在每条指令中提供了多种寻址模式组合。
这也增加了操作码执行的复杂性。举个例子:
move.l $10(pc), -$20(a0,d0.l)
指令只是将一个长字从一个位置复制到另一个位置,很简单。但是为了实际执行操作,处理器需要找出实际(原始)内存地址以用于源操作数和目标操作数。这个对操作数寻址模式进行解码(解析)的过程称为有效地址计算。
对于这个例子:
为了计算源有效地址-$10(pc), 处理器加载PC(程序)计数器寄存器的值 并添加 $10。
为了计算目的有效地址—— -$20(a0,d0.l),处理器加载A0寄存器的值,加上D0寄存器的值,然后减去 20 美元。
单个操作码的计算量相当大,不是吗?
但 M68K 执行这些计算的速度相当快。为了快速计算有效地址,它实现了一个专用的Address Unit (AU)。
作为一般规则,对数据寄存器的操作由 ALU(算术逻辑单元)处理,涉及地址计算的操作由 AU(地址单元)处理.
AU 针对 32 位地址操作进行了很好的优化:它在一个总线周期(4 个 CPU 周期)内执行 32 位减法/加法,而 ALU 没有(32 位操作需要 2 个总线周期) .
但是,AU 仅限于加载和基本的加法/减法运算(由寻址模式决定),并且它不连接到 CCR(有条件Codes Register),这就是地址寄存器上的操作从不更新标志的原因。
也就是说,AU应该是用来优化复杂寻址模式的计算的,但它不能完全取代ALU(毕竟,有M68K 中只有大约 68K 个晶体管),因此有两个寄存器组(数据和地址寄存器),每个寄存器都有自己的专用单元。
【讨论】:
所以这只是基于快速查找,但使用 16 个寄存器显然更容易编程。问题可能是您必须为 16 个寄存器中的每一个都编写指令。这将使所需的操作码数量增加一倍。为每个目的使用一半并不理想,但通常可以访问更多寄存器。
【讨论】: