1.3 单片机应用系统汇编语言程序设计
在单片机应用系统设计中,应用程序设计是整个系统设计的重要工作。在早期单片机开发中,都是采用汇编语言。采用汇编语言编写应用程序,可直接面向系统硬件,从而可以编写出高质量的程序代码。因此,现在尽管用C语言编程已成为单片机程序设计主流,但用汇编语言进行程序设计仍是一些单片机爱好者乐于采用的方法。
1.3.1 顺序结构的程序设计方法
1.顺序结构
顺序结构程序是一种最简单、最基本的程序结构,其特点是按程序编写的顺序依次执行,程序流向不变。顺序结构是所有复杂程序的基础。
2.顺序程序设计
在进行顺序结构的程序设计时,先要根据题意,找到解决问题的方法,然后以指令为依据,将解决问题的方法用程序表达出来。
【例1-1】设有16位二进制数存放在R0、R1中(R0存放高位),试编写实现16位二进制数“取反加1”的操作程序。
解 程序流程图如图1.17所示,程序如下:
ORG 1000H START:MOV A,R1 CPL A ADD A,#01H MOV R1,A MOV A,R0 CPL A ADDC A, #00H MOV R0.A END
图1.17 程序流程图
1.3.2 分支结构的程序设计方法
1.分支结构
分支结构是指程序中含有转移指令,程序的进程要根据程序要求无条件或有条件改变程序执行顺序,选择程序流向。分支结构有单分支、双分支、多分支3种形式,如图1.18所示。
2.分支结构程序设计方法
由于计算机具有逻辑判断能力,这是计算机实现分支程序的理论基础,依据条件转移指令和比较指令实现计算机分支。
(1)无条件转移程序设计
以无条件转移语句实现程序的无条件转移。
图1.18 单片机分支结构程序流程图
(2)条件转移程序设计方法
用条件判断语句对程序执行的条件进行分析,从而决定程序的流向。
【例1-2】警情从单片机的P1.0输入,当系统检测到有警情发生时,立即调用拨号子程序,试编制实现上述过程的程序。
分析:程序流程如图1.19所示,程序如下:
ORG 1000H NAME:SETB P1.0 MOV C,P1.0 JNC NAME …… END
图1.19 单片机分支结构程序流程图
值得注意的是,分支程序设计一定要先分析分支条件,然后采用合适的语句,从而达到分支的目的。
1.3.3 散转程序设计
散转实际上是多分支结构的一种特殊情况。我们知道,当分支较多时,如果采用连续判断的方法对条件逐个比较,会使程序显得太烦琐,且执行速度较慢。散转程序的设计思想是:在满足某种规律的情况下,用一条指令转移到指定的分支。与前面介绍的直接转移方式相比,散转程序属于间接转移方式。指令JMP@A+DPTR是实现散转的基础,用它来实现散转的方法有两种:一种是按照某种规律直接将转移地址编排成一个表,当执行散转指令时,程序转移到相应的地址;另一种是对偏移量作某种运算得到一个转移地址表。
在散转程序设计中,除了用JMP@A+DPTR指令实现散转外,还可以用RET指令实现。RET指令的作用是将堆栈顶部的一个16位数据赋值给PC,因此,用RET指令实现散转的要点是首先获得转移地址,然后用PUSH指令将地址压入堆栈(先压入低字节),然后用RET指令实现散转。
1.3.4 循环程序设计方法
1.循环结构
在程序设计中,经常会遇到需对大量数据进行重复处理的情况。此时,程序中的某些程序段需要多次重复执行。这种多次出现的程序结构叫循环结构。在汇编语言中,循环结构包括循环初始化和循环体两部分。循环初始化部分是为进入循环所做的准备工作,用来设置循环初始化状态,如地址指针、拟定的循环次数。循环体是重复执行的程序。循环结构如图1.20所示。
图1.20 循环结构程序流程
2.循环结构程序设计
循环程序设计的核心是循环控制。常用的循环控制方法有以下3种。
(1)计数控制法
对于循环次数已知的程序,或者在进入循环前可由某变量确定循环次数的程序,常采用计数控制循环。循环计数的方法有两种:一种方法是先将循环计数器清0,以后每执行一遍循环体,循环计数器加1,同时与规定的循环次数进行比较,次数未到,继续执行循环体;次数到,则结束循环。这种方法在高级语言中常用。另一种方法是将计数器的初值设置为循环次数,以后每执行一遍循环体,循环计数器减1,同时检测计数器是否为0,非0继续循环,为0则终止循环。汇编语言中常采用这种方法,它适用于DJNZ之类的指令编程。
(2)条件控制法
有些循环程序预先不能确定循环次数,而是在循环的过程中,当满足某个特定的条件时退出循环。这类通过测试特定条件来实现循环控制的方法称为条件控制法。条件控制的实现是通过条件判断语句达到目的的。
(3)逻辑尺控制法
有些循环程序,在循环的过程中分别要求完成不同的操作。例如,如这次循环完成两数的相加,下次循环完成两数的相减,这时可以采用“逻辑尺”控制法。它也是汇编语言独有的一种控制方法。