我在微编程级别与机器语言级别之间有些困惑。例如:
- 两种程序在执行时都驻留在哪里?
- 两者都没有1:1映射到汇编语言真实操作指令吗?
- 两者的格式是否由处理器体系结构定义?
我在微编程级别与机器语言级别之间有些困惑。例如:
Answers:
微代码是除机器代码之外的另一种抽象级别。实际的CPU正在运行微代码,翻译引擎会即时将机器代码转换为微代码。这样做有多种原因,其中包括更快,更小的处理器,更易于创建且调试较少的复杂处理器以及向后兼容。例如,x86指令集包含一些很少使用的字符串处理指令。但是,为了保持向后兼容,它们必须仍然在现代x86处理器中可用。这些指令不是硬性地为这些指令装配执行路径,而是被转换为微代码并执行。这样可以节省芯片,同时仍然保持向后兼容。
两种程序在执行时都驻留在哪里?
机器代码位于高速缓存中(从RAM中提取后)。根据特定的机器体系结构,微代码位于微代码缓存中。高速缓存可能仅足够大以容纳足够的微代码,以容纳来自最大可能的机器代码指令的转换后的微代码,或者它可能是较大的高速缓存,用于存储许多机器代码的转换结果,因此不需要重新转换所有代码。每次迭代的机器代码都会产生小循环。
在某些体系结构中,转换后的微代码不会存储在任何地方-提取/翻译单元只是根据当前正在执行的机器代码吐出一系列微代码指令。在这种情况下,微代码是从某种类型的ROM执行的,而机器代码本质上是ROM的索引-指向必须运行才能完全执行机器代码指令的一系列微代码指令。
两者都没有1:1映射到汇编语言真实操作指令吗?
机器代码和汇编代码通常以1:1映射到汇编指令。这取决于汇编程序。高级汇编器可能具有大量的宏,这些宏允许一个人编写一行汇编代码,并且汇编器将生成多个机器代码。
但是通常,可以使用处理器手册中的指令集表将“纯”汇编语言直接转换为机器代码。
不过,我不确定您所说的“真实操作说明”是什么意思。也许您可以解释参考。
两者的格式是否由处理器体系结构定义?
机器码和微码的格式均由处理器体系结构定义。
基本上,微码将有限的CPU指令集扩展为包含更高级别的指令,这些指令在硬件中实现起来很麻烦,但使用现有指令则相对容易构建。微码允许具有较小指令集的处理器的功能类似于具有较大指令集的处理器的功能。
假设您正在使用MARIE指令集,并且想要添加x,y函数,但是该体系结构仅允许添加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中实现“自定义指令”的)。
许多处理器由状态机驱动,状态机的转换顺序受正在执行的指令影响。微代码“指令”通常以程序员不可见的方式指定各种寄存器和总线之间的交互。
例如,状态为#1的8位CPU的微码指令可能指定程序计数器的两个半部的输出使能都应处于活动状态(导致程序计数器在内部和内部内部地址总线上输出)。程序计数器增加信号应处于活动状态,外部地址锁存信号应处于活动状态(这样外部地址总线将跟踪内部地址),RAM读取信号应处于活动状态,控制器应切换到状态2。
在状态2中,外部数据总线应馈入内部主要数据总线,并且应加载从该总线读取的指令寄存器。程序计数器应像以前一样在地址总线的两半上输出,并发出另一个RAM读操作。指令寄存器的位5-7应该装入状态控制器的位0-2,状态寄存器的位3应该被置位,除非指令寄存器的位1-7被全部置位,而状态寄存器的其他位应该清楚,最终结果是下一个状态将是#7-#15。
请注意,微码并不是真正按照指令来定义,而是按照控制信号的组合来定义。硬件将不会被设置为允许微指令中的通用指令,而是从/向它们所在的总线加载或输出各种寄存器,或将不同的总线相互连接,并使用各种位或其组合来实现。选择不同的状态。设计的许多方面都是硬接线的(例如,操作码FE和FF在硬件而不是微码中可能是特殊情况)。微代码的想法不是运行程序,而是替换逻辑。