单片机原理与应用技术(第2版)清华大学出版社•6.1汇编语言•6.2基本程序结构设计•6.3子程序设计•6.4实用程序举例•小结第6章汇编语言程序设计单片机原理与应用技术(第2版)清华大学出版社6.1汇编语言采用汇编语言编写的程序叫做汇编语言源程序,源程序只能用于人机对话,并不能被机器直接执行,必须由“汇编程序”翻译成机器语言的目的程序。汇编语言(AssemblyLanguage)是指用指令助记符代替机器码的编程语言。它是一种面向机器的程序设计语言,属于低级程序语言。汇编语言程序结构简单,执行速度快,程序易优化,编译后占用存储空间小,是单片机应用系统开发中最常用的程序设计语言。汇编语言的缺点是可读性比较差。单片机原理与应用技术(第2版)清华大学出版社汇编语言程序设计的基本步骤如下。(1)题意分析(2)画出程序流程图(3)分配内存工作区及有关端口地址(4)编制汇编源程序(5)仿真、调试程序(6)固化程序单片机原理与应用技术(第2版)清华大学出版社按照程序编写的顺序依次执行,编写这类程序主要应注意正确地选择指令,提高程序的执行效率。6.2基本程序结构设计6.2.1顺序结构程序设计例6.2拆字程序。将30H的内容拆开,高位送31H低位,低位送32H低位。分析:利用逻辑与指令实现内容的屏蔽。程序流程如图所示。单片机原理与应用技术(第2版)清华大学出版社解:编程清单如下:ORG0050HCWORD:MOVA,30HSWAPAANLA,#0FHMOV31H,A;将(30H)高位存入(31H)MOVA,30HANLA,#0FHMOV32H,A;将(30H)低位存入(32H)END单片机原理与应用技术(第2版)清华大学出版社6.2.2循环结构程序设计在程序设计中,当需要对某段程序多次重复执行时,可采用循环的方法设计程序。循环结构的程序一般包括下面几个部分:◆置循环初值◆循环体◆循环修改◆循环控制例6.4数据极值查找程序。内部RAM30H单元开始存放了10个数,找出其中最大的数。分析:采用比较交换法来查找最大数。先指定MAX单元,使第一个数存入MAX单元,然后把它和数据块中的每一个数逐一比较,大的数存放在MAX单元,直到数据块中每个数都比较完。单片机原理与应用技术(第2版)清华大学出版社单片机原理与应用技术(第2版)清华大学出版社6.2.3分支结构程序设计分支程序的主要特点是程序的流向有两个或两个以上的出口,根据指定的条件进行选择确定。编程的关键是如何确定供判断或选择的条件以及选择合理的分支指令。分支结构程序可根据程序要求无条件或有条件地改变程序执行的顺序,选择程序流向。例6.6设补码数x存放在30H单元中,函数值y按下式进行赋值:试编写程序,根据x的值求出y,并放回原单元。分析:取出x后先作取值范围判断,用累加器A状态转移指令判断x是否为0,用位状态转移指令判断x是大于0还是小于0。单片机原理与应用技术(第2版)清华大学出版社单片机原理与应用技术(第2版)清华大学出版社6.3子程序设计在解决实际问题时,经常会遇到一个程序中多次使用同一个程序段,如延时程序、查表程序、算术运算程序段等功能相对独立的程序段。为了节省存储空间,往往把它独立出来,附加额外的指令,将其编制成可供反复调用的公用的独立程序段,并通过适当的方法把它与其他程序段连接起来。这种程序设计的方法称为子程序设计。被独立出来的程序段称为子程序,调用子程序的程序叫主程序或调用程序。设计包含子程序的程序时,需注意以下几个问题。◆主程序与子程序之间的转返◆主程序与子程序间的参数传递◆现场保护单片机原理与应用技术(第2版)清华大学出版社例6.9用程序实现c=a2+b2,假设a、b、c分别存放于R2、R3、R4中。分析:通过调用子程序查平方表,结果在主程序中相加得到。解:编程清单如下:单片机原理与应用技术(第2版)清华大学出版社例6.118位二进制数转换为BCD码。将累加器A中的二进制数0~FFH内的任一数转换为BCD码(0~255)。6.4实用程序举例1、代码转换程序解:编程清单如下:BINBCD:MOVB,#100DIVA,B;除法指令,A/B→商在A中,余数在B中PUSHACC;将商(百位数)暂存在堆栈中MOVA,#10XCHA,B;余数交换到A中,B=10DIVA,B;A/B→商(十位)在A中,余数(个位)在B中SWAPA;十位数移到高半字节ADDA,B;十位数和个位数组合在一起POPB;百位数存放到B中RET单片机原理与应用技术(第2版)清华大学出版社例6.144位二进制数转换为ASCII代码。分析:小于10的4位二进制数加30H得到相应的ASCII代码,大于等于10的加37H。单片机原理与应用技术(第2版)清华大学出版社2、查表程序在单片机应用系统中,应用程序时常要对数据进行复杂计算,而由于受汇编语言指令特点的限制,使得编程困难,程序冗长,运算速度慢,而且精度不易得到保证。在这种情况下,采用查表法往往使问题的解决简单得多。在MCS-51汇编语言中,有两条专门的查表指令:MOVCA,@A+DPTRMOVCA,@A+PC其中,DPTR为数据指针寄存器,一般用来存放表首地址。查表程序主要用于代码转换、代码显示、实时值查表计算和按命令号实现程序转移等。单片机原理与应用技术(第2版)清华大学出版社例6.16在程序中定义一个0~9的平方表,利用查表指令找出累加器A=05的平方值。分析:所谓表格是指在程序中定义一串有序的常数,如平方表、字型码表、键码表等。因为程序一般都是固化在程序存储器中,因此可以说表格是预先定义在程序的数据区中,然后和程序一起固化在ROM中的一串常数。查表程序的关键是表格的定义和如何实现查表。编程清单如下:ORG0050HMOVDPTR,#TABLE;表首地址→DPTRMOVA,#05;05→AMOVCA,@A+DPTR;查表指令,25→ASJMP$;程序暂停TABLE:DB0,1,4,9,16,25,36,49,64,81;定义0~9平方表END单片机原理与应用技术(第2版)清华大学出版社小结•单片机汇编语言程序设计是单片机应用系统设计的重要组成部分。汇编语言程序基本结构包括顺序结构、分支结构、循环结构和子程序结构等。•程序设计的关键是掌握解题思路。程序设计的步骤一般分为题意分析、画流程图、分配寄存器和内存单元、源程序设计、程序调试等。