微编程与机器语言编程

电器工程 集会 微处理器
2022-01-17 01:07:06

我在微编程级别和机器语言级别之间有点困惑。例如:

  1. 这两种类型的程序在执行时驻留在哪里?
  2. 是否有与汇编语言真运算指令的 1:1 映射?
  3. 两者的格式是否由处理器架构定义?
3个回答

基本上,微码扩展了有限的 CPU 指令集以包含更高级别的指令,这些指令在硬件中实现起来很麻烦,但使用现有指令构建起来相对容易。微码允许具有小指令集的处理器像具有更大指令集的处理器一样运行。

假设您正在使用一个MARIE 指令集并且您想要一个 Add x,y 函数,但该架构只允许一个 Add x(它只是将当前在寄存器中的内容添加到 x)所以您添加一个微码指令:

LOAD x //Load x into the register
ADD y //Add y to the value in the register

现在当你的机器语言代码说:

ADD x,y

它查找您添加到 ROM(您的微代码)的 ADD 函数并执行它。这很棒,因为它增加了您的指令集,允许更多可读的机器代码,并且由于您的微码存储在 ROM 中,它也比从 RAM 调用 LOAD 和 ADD 快一点。

我曾经在一家公司工作,该公司实际上编写了微代码,以便在他们的旧系统上以非常高的速度执行自定义测量。但是,随着 FPGA 的进步,他们已经切换到速度更快的那些(因为您实际上是在硬件而不是 ROM 中实现“自定义指令”)。

微代码是机器代码之外的另一个抽象层次。实际的 CPU 正在运行微码,翻译引擎将机器码即时转换为微码。这样做的原因有很多,包括更快、更小处理器、更容易创建复杂处理器且调试更少,以及向后兼容。例如,x86 指令集包含一些很少使用的字符串处理指令。但是,为了保持向后兼容,它们必须在现代 x86 处理器中仍然可用。不是为这些指令硬连线执行路径,而是将它们转换为微码并执行。这节省了硅,同时仍然保持向后兼容。

这两种类型的程序在执行时驻留在哪里?

机器代码驻留在缓存中(从 RAM 中提取后)。取决于特定的机器架构,微代码驻留在微代码缓存中。缓存可能只足够大到足以容纳足够的微码来保存从最大可能的机器码指令转换的微码,或者它可能是一个更大的缓存,存储许多机器码的转换结果,因此它不需要重新转换所有小循环的每次迭代的机器代码。

在某些架构中,转换后的微码不会存储在任何地方——提取/翻译单元只是根据当前执行的机器码吐出一系列微码指令。在这种情况下,微代码是从某种 ROM 执行的,机器代码本质上是 ROM 的索引 - 指向为了完全执行机器代码指令而必须运行的一系列微代码指令。

是否有与汇编语言真运算指令的 1:1 映射?

机器代码和汇编代码,通常是 1:1 映射到汇编指令的。这取决于汇编程序。高级汇编程序可能有一大组宏,允许编写一行汇编代码,汇编程序将生成多个机器代码。

但总的来说,“纯”汇编语言可以使用处理器手册中的指令集表直接转换为机器代码。

不过,我不确定您所说的“真实操作指令”是什么意思。也许你可以解释参考。

两者的格式是否由处理器架构定义?

机器码和微码的格式都由处理器架构定义。

许多处理器由状态机驱动,其转换顺序受正在执行的指令的影响。微代码“指令”通常以程序员看不到的方式指定各种寄存器和总线之间的交互。

例如,状态 #1 的 8 位 CPU 的微码指令可能指定程序计数器的两半的输出使能都应该是活动的(导致程序计数器在内部地址总线的高位和低位输出),程序计数器增量信号应该有效,外部地址锁存信号应该有效(因此外部地址总线将跟踪内部地址总线)并且 RAM 读取信号应该有效,并且控制器应该切换到状态#2。

在状态#2,外部数据总线应该馈送到内部主数据总线,并且从该总线读取的指令寄存器应该被加载。程序计数器应该像以前一样在地址总线的两半上输出,并发出另一个 RAM 读取。指令寄存器的第 5-7 位应加载到状态控制器的第 0-2 位,除非指令寄存器的第 1-7 位全部置位,否则状态寄存器的第 3 位应置位,以及状态寄存器的其他位应该很清楚,最终结果是下一个状态将是#7-#15。

请注意,微码实际上并不是根据指令定义的,而是根据控制信号的组合来定义的。硬件不会被设置为允许微码中的通用指令,而是从它们所在的总线加载或输出各种寄存器,或将不同的总线相互连接,并使用各种位或其组合来选择不同的状态。设计的许多方面都是硬连线的(例如,操作码 FE 和 FF 可能是硬件而不是微码的特殊情况)。微码的想法不是运行程序,而是替换逻辑。