购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.5 8051单片机编程语言

从系统结构来说,8051单片机编程语言分为4个不同的层次,包括:微指令控制序列、机器语言、汇编语言和高级语言,如图1.9所示。

1.微指令控制序列

微指令控制序列存在于CPU内部,单片机应用开发人员看不到微指令控制序列。本质上,CPU就是通过由有限自动状态机所构成的微指令控制器实现对其内部的寄存器、存储器和ALU等参与具体数据处理的功能单元“发号施令”。例如,要实现将8051单片机CPU内的两个寄存器的数据进行相加,CPU内的微指令控制器就会发出一系列的控制序列,这些控制序列在CPU主时钟的控制下,按顺序先后给出,这就是时序。微指令控制序列属于数字逻辑中组合逻辑和时序逻辑的范畴。只有设计8051单片机芯片的工程师才会接触到微指令控制序列。

img

图1.9 单片机编程语言体系结构

下面给出微指令控制序列控制两个数据相加过程的形式化描述:

(1)选择某个寄存器,将加数读取出来;

(2)选择另一个寄存器,将被加数读取出来;

(3)将这两个操作数送到ALU;

(4)根据功能需求,ALU执行加法运算;

(5)ALU产生运算的结果和标志,如零标志、符号标志、进位标志和溢出标志等;

(6)根据指令的要求,将运算的结果送到寄存器或者存储器中进行保存。

从上面描述中可知,一个简单的加法运算需要产生一系列的控制序列。这也就是通常所说的译码和执行指令。

2.机器语言

从微指令控制序列的介绍中可以知道,对于单片机的应用工程师而言,根本不需要知道微指令控制序列,他只要告诉CPU执行加法运算即可,也就是不需要掌握CPU内部结构的具体实现方式。保存在单片机内程序存储器中的程序是由0和1构成的二进制序列,就是机器语言(也称为机器代码)。通过取出相应的机器指令(机器代码),就可以实现加法运算。

在8051单片机中,ACC累加器和一个常数(立即数)相加的机器语言的格式,如图1.10所示。从图1.10中可以看出,机器语言是由0和1构成的二进制序列。这个二进制序列(机器指令)中包含操作码和操作数两部分。

img

图1.10 单片机机器语言格式

1)操作码

操作码告诉CPU需要执行的操作。该指令的操作码用二进制表示为(00100100) 2 ,用十六进制表示为(24) 16 。操作码部分包含了操作的类型编码,同时也包含了一部分的操作数内容,指明了参与加法运算的一个数来自ACC累加寄存器中。

2)操作数

操作数是操作的对象。操作对象包括:立即数(常数)、寄存器和存储器等。在图1.10 中,immediate data表示立即数(常数),占用了1个字节(8个比特位),表示参与加法运算的另一个操作数的具体取值。

但是,纯粹意义上的机器语言对程序员太难理解了,为什么?这是因为程序员是CPU的应用者,而不是CPU的设计者,程序员根本不可能从二进制代码的排列中看出机器语言所描述的逻辑操作行为。而且,程序员很难记忆这些由0和1构成的二进制机器语言序列。

3.汇编语言

为了帮助程序员从更抽象的行为级上理解CPU所执行的操作,计算机软件开发工具设计人员开发了一套基于助记符的描述CPU指令系统的方法。通过汇编语言助记符指令,程序员可以将这些助记符所表示的CPU指令组合在一起,构成一个复杂的称为“程序”的软件来控制CPU的运行。

通过软件开发工具集成的汇编器工具,自动将使用助记符描述的汇编语言指令转换成使用机器语言描述的机器指令。使用汇编助记符描述机器指令的完整形式为

[标号;]助记符[操作数] [;注释]

其中,标号用来标识一行指令;助记符表示所要执行的逻辑操作;操作数为逻辑操作行为所操作的具体对象。

现在用汇编语言描述图1.10给出的机器指令:

ADD A,#25

其中,ADD表示相加操作;A表示目的操作数,即ACC累加器;#25表示源操作数。

这个助记符汇编指令将立即数(常数)25和ACC累加器内所保存的数相加,并将得到的结果保存在ACC累加器中。因此,在汇编语言(助记符)级上理解CPU的指令操作更加直观,而且无须知道二进制指令的具体表示形式,从而降低了软件程序设计人员在8051单片机上开发应用程序的难度。

但是,由于汇编语言下面是机器语言,所以对于使用汇编语言编写代码的程序员而言,必须很清楚CPU的指令集、寄存器单元和存储器映射等烦琐的硬件规则。虽然其执行效率与机器语言相当,但是使用汇编语言开发复杂应用程序的效率很低。由于很多程序员根本不了解CPU的具体内部结构,所以对他们而言,使用汇编语言编写代码并不比直接使用机器语言编写代码有更多的优势,这也是一件令他们非常痛苦的事情。

但是,汇编语言仍然非常重要。其重要性体现在:

(1)对理解CPU内部的结构和运行的原理非常重要。

(2)很多与CPU打交道的软件驱动程序,尤其是操作系统的启动引导代码,必须使用汇编语言来开发;这是因为以C语言为代表的高级语言,其语法并不能一一对应到机器指令,无法实现某些机器指令的功能。例如,在C语言中就没有空操作指令,我们只能通过for循环或者while循环来模拟汇编语言中的空操作指令。

(3)一些对响应时间要求比较苛刻的场合也需要使用汇编语言进行开发,这样能显著减少程序的响应时间,提高代码的执行效率。

4.高级语言

值得高兴的是,目前,8051单片机的软件集成开发工具(如KeilμVision)支持使用C语言实现开发单片机的应用程序。C语言不能直接在CPU上使用,它必须通过软件集成开发工具内C语言的处理,最终编译器和链接器(软件工具)生成可执行文件,也就是转换成机器语言,才能在CPU上运行。

从图1.11可以看出,与C语言相比,汇编语言更接近于机器语言。因此,使用以C语言为代表的高级语言所编写的代码,其运行的效率不可能比用汇编语言编程的运行效率更高。所以,如果让C语言所编写的代码和汇编语言编写的代码有一样高的代码执行效率,需要C程序员运用各种程序设计技巧提高C语言代码的设计效率,并且修改编译工具的优先级设置选项,以满足代码长度和运行时间的双重要求。

img

图1.11 C语言、汇编语言和机器语言之间的关系

代码长度和运行时间是单片机程序设计两个最基本的要求:

(1)要求程序代码尽可能短,以减少对程序存储器空间的要求。

(2)程序代码尽量满足实时性的要求,这样在执行程序的过程中可以实时响应不同外部设备的要求。虽然对程序优化会让高级语言程序员耗费很多的精力,但是让他们高兴的是,他们再也不用和底层硬件直接打交道了。

现在更令程序员高兴的事情是,越来越多的厂商提供了硬件的应用程序接口(Application Program Interface,API)函数。这样,程序员可以不用知道更多的硬件实现细节,只需关心如何编写代码来使硬件工作,因此显著提高了程序代码的设计效率。

下面以两个8位数相加为例说明C语言、汇编语言和机器语言之间的关系,如代码清单1-1所示。

代码清单1-1 使用C语言描述两个8位数相加的例子

img

这段代码的反汇编代码(汇编语言)、机器指令(机器语言)与C语言之间的对应关系如图1.11所示。

正如上面所提到的那样,8051单片机软件代码开发的设计者必须能够很好地处理好汇编语言和C语言的关系。

思考与练习1-10:单片机编程语言的4个层次为________、________、________和_______。

思考与练习1-11:机器语言/汇编语言指令中,包含_______和________。

思考与练习1-12:请说明在单片机程序设计中,使用C语言和汇编语言编程的优势。 PU4YCbgZYDfoEcv77gwlbdWrbH2z7GY0D7pYnO7wAgbT0OwvPnU64uTpPJpwW01e

点击中间区域
呼出菜单
上一章
目录
下一章
×