微代码和汇编都是低级语言,但是微代码比汇编更底层。微代码和汇编都和硬件有着紧密的联系,但是对于同一产品系列的不同代产品来说,汇编可以完全相同,微代码可能有着巨大的区别,因为微代码是完全依赖于芯片内部的硬件连接。
我是写微代码的,当我告诉朋友我的职业的时候,他显得很迷惑。他觉得微代码就是汇编,两者没有区别。其实,两者之间有着本质的区别。
的确,微代码和汇编都是低级语言,但是微代码比汇编更底层。微代码和汇编都和硬件有着紧密的联系,但是对于同一产品系列的不同代产品来说,汇编可以完全相同,微代码可能有着巨大的区别,因为微代码是完全依赖于芯片内部的硬件连接。
对于同样一句C语言,在不同的处理器上会生成不同的汇编语言。每一条汇编语言的执行时间也许是一个或者两个时钟周期,甚至更多。微代码和汇编的关系,就像C 与汇编的关系,也就是说一条汇编也许会生成一条或多条微代码。所谓微代码,或者微指令,是处理器内部最小的操作原语,控制着诸如门电路(gates)开关等专门动作,和组成一条指令的微操作的序列。例如,对于一个加法"ADD"的简单动作,微代码可以决定接受哪两个寄存器或总线为输入,输出到什么总线或者寄存器里,标志寄存器要保存还是丢弃,根据条件进行跳转或者直接执行下一条微代码。一个内部只有8位宽的数据总线完全可以支持32位整数的汇编操作,就是因为有微代码。
微代码原来只是用来开发计算机的逻辑控制。古老的CPU往往都是“硬连线”,每个机器指令(加法,移动)都是由电路实现,虽然有着高性能的优点,但随着指令复杂度的增长,也带来了研发和DEBUG的困难,以及电路的复杂性。微代码的出现让CPU的设计者可以通过写一个微程序的方式来实现一条机器指令,而不是设计电路来实现它。在将来的开发设计过程中,微代码可以很容易地改变,硬件电路却不可更改,否则带来的将是巨大的商业损失。这种灵活的CPU设计导致了今天日益复杂的指令集。
微代码一般存储在处理器的 ROM,也就是芯片在工厂里生成的时候就被固化在里面的微程序。它实现了一系列底层硬件操作,而用户只要知道它外部的汇编接口和引脚情况以及寄存器即可,至于内部细节,对不起,这是商业机密。微代码也可以存储在处理器的RAM里,一般是一些非核心内容,或者升级更新指令集,更多的是一些勘误,也就是纠正 ROM里的代码错误。这也是为什么INTEL的芯片会有微代码升级的内容。这些都是BOOT LOADER,也就是PC BIOS的任务。
巧妙地运用微代码可以实现算法的优化和加速,较少访问内存的次数。因为对底层硬件的了解,可以在同一时钟周期做尽量多的并行的硬件操作,从而加快程序的执行。一个处理器 的核心往往是加法器和乘法器,两者是独立的部件,如果能在同一时钟周期同时操作加法和乘法,岂不是大大加快了执行速度吗?