首页 > 代码库 > 让cpu运行程序(四)
让cpu运行程序(四)
如何编译汇编程序
这个汇编程序的编译对我们设计的CPU来说非常简单。按照我们设想的CPU中,程序存储器、数据存储器是分开的。因此,不用考虑程序和数据的混淆问题。此外,由于我们设想的指令系统是一条指令就占一个存储单元,所以标号的地址非常容易计算出来。如果我们确定了第一条指令存放的地址,那么从这条指令向后数数,就可以将标号确定下来。
对于变量在什么地方的问题,常常是一般作汇编程序设计的人较为迷惑的问题。产生迷惑的原因主要是我们自己不作变量地址分配。做为一个CPU 的设计者,不仅要对程序如何放入内存进行分配,而且要对每个变量放在存储器当中的位置进行分配。
下面我们要用表的形式来说明汇编程序的设计、程序的内存分配、变量的内存分配、程序如何编译等,让我们学会这一系列问题是如何用表的形式来解决的。弄懂了这张表,有关程序编译的基本原理和方法,你都会从此一清二楚了。顺便说一句,虽然本书的重点是CPU与单片机的设计与制造,但你要是不懂得汇编程序的设计与编译方法,一切也都会成为空谈!
我这里介绍一种用表来进行汇编程序编译的基本方法,使用起来非常清楚简单。其实,程序编译的过程就是处理一张表。在这张表中要能够反映出存储器的结构,地址的顺序标示,程序的起始地址,指令存放的形式,数据和变量在存储器中如何分配,程序转化成二进制如何表示等。为了便于将汇编指令翻译成它的指令编码,还可以将汇编指令和它的编码对照地放在表中参考。做为编译参考,自然也可以将对指令的解释放到适当的位置。我们将这种表叫做程序编译工作表。
做为一个CPU的设计者,我们一定要掌握人工对程序进行编译的基本方法。我们将汇编程序放入表 3 2中,地址一列标示的是指令在程序存储器的地址,同时也标注了变量在数据存储器当中的地址。变量一栏是我们随意分配变量的位置,参考最右面的指令编码,同时对照标号和变量的地址,就可以将二进制的机器指令程序编译出来。
汇编程序的首地址start不妨就设定为0,那么loop标号就是8,exit标号就是16。标号确定之后,转化成11位的二进制,分别是00000001000和00000010000。我们来分配变量在数据存储器中的位置。由于数据存储器中没有有效数据,所以可以任意分配。比如,让one在2号单元,result在8号单元,x在5号单元,y在6号单元等。将变量所在地址都用二进制标示,再将指令用它的编码替换写入二进制编码的前5位,于是在二进制编译一列就得到了这个汇编程序的机器指令程序。写成十六进制为:2001 3002 3802 3008 2040 3005 2035 3006 0806 4810 3802 3006 0808 1005 3008 4008 1808 6000。这就是汇编指令程序的人工编译原理和过程,要想设计再将的CPU必须很好地掌握汇编程序及其编译的基本方法。
虽然我们已经能够有变化地设计CPU的指令,并且能够运用这些设计的指令来编写汇编程序,不但如此,还能够将汇编程序编译成机器指令程序,但可惜尚不能够让得到的机器指令程序实际运行,因而也就见不到程序运行的结果。怎样才能见到我们设计的汇编程序执行的结果?那就是只有一个办法,就是造出一个能够运行这个程序的CPU来,让我们的程序在它上面运行,最终就会检查出我们设计的汇编程序是否正确,与此同时,也会用这种方法去检验我们所设计的CPU是否正确。
让cpu运行程序(四)