为什么Motorola 68k的32位通用寄存器分为数据寄存器和地址寄存器?

时间:2018-10-26 19:51:36

标签: motorola 68000

68k寄存器分为两组,每组八个。八个数据寄存器(D0至D7)和八个地址寄存器(A0至A7)。这种分离的目的是什么,团结起来会更好吗?

2 个答案:

答案 0 :(得分:3)

简单的答案是,这种分离来自当时的体系结构限制和设计决策。

长答案:

M68K实现了很多寻址模式(尤其是与基于RISC的处理器相比),其许多指令支持大多数(如果不是全部)。这样在每条指令中提供了多种寻址模式组合。

这也增加了操作码执行的复杂性。请看以下示例:

move.l $10(pc), -$20(a0,d0.l)

该指令只是将一个长字从一个位置复制到另一位置,足够简单。但是,为了实际执行该操作,处理器需要找出要用于源操作数和目标操作数的实际(原始)存储器地址。解码(解析)操作数寻址模式的过程称为“有效地址计算”。

对于此示例:

  1. 为了计算源有效地址- $ 10(pc), 处理器加载 PC (程序)计数器寄存器的值 并添加 $ 10

  2. 为了计算目标有效地址-     -$ 20(a0,d0.l),处理器加载 A0 寄存器的值,向其中添加 D0 寄存器的值,然后减去 $ 20

这是单个操作码的很多计算,不是吗?

但是M68K在执行这些计算时非常快。为了快速计算有效地址,它实现了专用的 地址单元 (AU)。

通常,对数据寄存器的操作由 ALU (算术逻辑单元)处理,涉及地址计算的操作由 AU (地址单元)处理

AU已针对32位地址操作进行了优化:在一个总线周期(4个CPU时钟周期)内执行32位减法/加法,而ALU则没有(对于32位操作,它需要2个总线周期)

但是, AU 仅限于加载和基本加/减运算(由寻址模式决定),并且未连接到 CCR (视情况而定)代码寄存器),这就是为什么对地址寄存器进行的操作永远不会更新标志的原因。

也就是说, AU 应该已经存在,可以优化复杂寻址模式的计算,但是它不能完全取代 ALU (毕竟, M68K中只有大约68K晶体管),因此有两个寄存器集(数据和地址寄存器),每个寄存器都有自己的专用单元。

答案 1 :(得分:0)

因此,这只是基于快速查找,但是使用16个寄存器显然更容易编程。问题可能在于您随后必须为16个寄存器中的每一个进行指令。这将使所需的操作码数量加倍。为每个目的使用一半是不理想的,但是通常可以访问更多寄存器。