1、第 4 章 单片机汇编语言程序设计 第第4章章 汇编语言程序设计汇编语言程序设计 第 4 章 单片机汇编语言程序设计 所谓程序设计,就是按照给定的任务要求,编写出完整的计算机程序。要完成同样的任务,使用的方法或程序并不是唯一的。因此,程序设计的质量将直接影响到计算机系统的工作效率、运行可靠性。4.1 单片机程序设计语言概述第 4 章 单片机汇编语言程序设计 4.1.1按照语言的结构及其功能可以分为三种1机器语言:机器语言是用二进制代码0和1表示指令和数据的最原始的程序设计语言。2汇编语言:在汇编语言中,指令用助记符表示,地址、操作数可用标号、符号地址及字符等形式来描述。3高级语言:高级语言是接
2、近于人的自然语言,面向过程而独立于机器的通用语言。第 4 章 单片机汇编语言程序设计 机器语言(MachineLanguage)直接用机器码编写程序、能够为计算机直接执行的机器级语言。机器码是一串由二进制代码“0”和“1”组成的二进制数据,其执行速度快,但是可读性极差。机器语言一般只在简单的开发装置中使用,程序的设计、输入、修改和调试都很麻烦。第 4 章 单片机汇编语言程序设计 汇编语言(AssemblyLanguage)指用指令助记符代替机器码的编程语言。汇编语言程序结构简单,执行速度快,程序易优化,编译后占用存储空间小,是单片机应用系统开发中最常用的程序设计语言。汇编语言的缺点是可读性比较
3、差,只有熟悉单片机的指令系统,并具有一定的程序设计经验,才能研制出功能复杂的应用程序。第 4 章 单片机汇编语言程序设计 高级语言(High-LevelLanguage)在汇编语言的基础上用自然语言的语句来编写程序,例如PL/M-51、C51等,程序可读性强,通用性好,适用于不熟悉单片机指令系统的的用户。高级语言编写程序的缺点是实时性不高,结构不紧凑,编译后占用存储空间比较大,这一点在存储器有限的单片机应用系统中没有优势。因而,单片机的汇编语言不但不会被高级语言完全取代,甚至还将继续占据重要地位。第 4 章 单片机汇编语言程序设计 4.1.2 汇编语言语句的种类和格式汇编语言语句的种类和格式汇
4、编语言语句有三种基本类型:指令语句、伪指令语句和宏指汇编语言语句有三种基本类型:指令语句、伪指令语句和宏指令语句。令语句。指指令令语语句句:每每一一个个指指令令语语句句都都在在汇汇编编时时产产生生一一个个目目标标代代码码,对应着机器的一种操作。对应着机器的一种操作。例如:例如:MOV A,#0 伪伪指指令令语语句句:主主要要是是为为汇汇编编语语言言服服务务的的,在在汇汇编编时时没没有有目目标标代码与之对应。代码与之对应。例如:例如:ONE EQU 1 宏指令语句:用以代替汇编语言源程序中重复使用的程序段宏指令语句:用以代替汇编语言源程序中重复使用的程序段的一种语句,由汇编程序在汇编时产生相应的
5、目标代码。的一种语句,由汇编程序在汇编时产生相应的目标代码。第 4 章 单片机汇编语言程序设计 汇编语言语句的格式汇编语言语句的格式 指令语句和伪指令语句的格式是类似的。指令语句和伪指令语句的格式是类似的。指令语句的格式为:指令语句的格式为:【标号标号】:助记符:助记符(操作码)操作码)【操作数操作数】;【注释注释】伪指令语句的格式:伪指令语句的格式:名字名字 定义符定义符 参数参数 ;注释;注释两种语句都由四个部分组成。其中每一部分称为域也称为字段,两种语句都由四个部分组成。其中每一部分称为域也称为字段,各字段之间用一个空格或字段定界符分隔,常用的字段定界符各字段之间用一个空格或字段定界符分
6、隔,常用的字段定界符有冒号有冒号“:”、逗号、逗号“,”和分号和分号“;”。其中方括号括起来。其中方括号括起来的是可选择部分。的是可选择部分。第 4 章 单片机汇编语言程序设计 4.2 80C51汇编语言程序设计汇编语言程序设计汇汇编编语语言言程程序序设设计计,就就是是采采用用汇汇编编指指令令来来编编写写计计算算机机程程序序。要要对对应应用用中中需需使使用用的的寄寄存存器器、存存储储单单元元、I/O端端口口等等先先要要作作出出具具体体安安排排。在在实实际际编编程程中中,如如何何正正确确选选择择指指令令、寻寻址址方方式式和和合合理理使使用用工工作作寄寄存存器器,包包括括数数据据存存储储器器单单元
7、元,如如何何对对扩扩展展的的I/O端端口口进进行操作等,都是基本的汇编语言程序设计技巧。行操作等,都是基本的汇编语言程序设计技巧。程程序序结结构构一一般般采采用用以以下下三三种种基基本本控控制制结结构构,即即顺顺序序结结构构、分分支支结结构构和和循循环环结结构构来来组组成成,再再加加上上使使用用广广泛泛的的子子程程序序及及中中断断服服务子程序,共有五种基本结构。务子程序,共有五种基本结构。第 4 章 单片机汇编语言程序设计 4.2.1 顺序程序结构顺序程序结构 例例 1两个无符号双字节数相加。设被加数存放于内部RAM的40H(高位字节),41H(低位字节),加数存放于50H(高位字节),51H
8、(低位字节),和数存入40H和41H单元中。第 4 章 单片机汇编语言程序设计 程序如下:START:CLRC;将Cy清零MOVR0,41H;将被加数地址送数据指针R0MOVR1,51H;将加数地址送数据指针R1AD1:MOVA,R0;被加数低字节的内容送入AADDA,R1;两个低字节相加MOVR0,A;低字节的和存入被加数低字节中DECR0;指向被加数高位字节DECR1;指向加数高位字节MOVA,R0;被加数高位字节送入AADDCA,R1;两个高位字节带Cy相加MOVR0,A;高位字节的和送被加数高位字节RET第 4 章 单片机汇编语言程序设计 例例 2将两个半字节数合并成一个一字节数。设内
9、部RAM40H#,41H单元中分别存放着8位二进制数,要求取出两个单元中的低半字节,并成一个字节后,存入50H单元中。程序如下:START:MOVR1,40H;设置R1为数据指针MOVA,R1;取出第一个单元中的内容ANLA,0FH;取第一个数的低半字节SWAPA;移至高半字节INCR1;修改数据指针XCHA,R1;取第二个单元中的内容ANLA,0FH;取第二个数的低半字节ORLA,R1;拼字MOV50H,A;存放结果RET第 4 章 单片机汇编语言程序设计 4.2.2 分支程序设计分支程序设计 分支结构框图(a)单分支流程;(b)多分支流程第 4 章 单片机汇编语言程序设计 例例 3x,y均
10、为8位二进制数,设x存入R0,y存入R1,求解:第 4 章 单片机汇编语言程序设计 程序如下:START:CJNER0,00H,SUL1;R0中的数与00比较不等转移MOVR1,00H;相等,R10SJMPSUL2SUL1:JCNEG;两数不等,若(R0)0,则R101HSJMPSUL2NEG:MOVR1,0FFH;(R0)0,则R10FFHSUL2:RET第 4 章 单片机汇编语言程序设计 例例 4比较两个无符号数的大小。设外部RAM的存储单元ST1和ST2中存放两个不带符号的二进制数,找出其中的大数存入外部RAM中的ST3单元中。第 4 章 单片机汇编语言程序设计 程序如下:ORG1000
11、HST1 EQU2000HST2EQU2100HST3EQU2200HSTART:CLRC;清零CyMOVDPTR,ST1;第一个数的指针MOVXA,DPTR;取第一个数MOVR2,A;保存MOVDPTR,ST2;第二个数的指针MOVXA,DPTR;取第二个数CLRC第 4 章 单片机汇编语言程序设计 SUBBA,R2;两数比较JNCBIG1;若第二个数大,则转XCHA,R2;第一个数大BIG0:MOVDPTR,ST3MOVXDPTR,A;存大数AJMPBBIG1:MOVXA,DPTR;第二个数大SJMPBIG0B:RET第 4 章 单片机汇编语言程序设计 第 4 章 单片机汇编语言程序设计
12、4.2.3 循环程序设计循环程序设计 一、一、循环程序循环程序 第 4 章 单片机汇编语言程序设计 循环程序一般由四个主要部分组成:(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。(2)处理部分:为反复执行的程序段,是循环程序的实体,也是循环程序的主体。(3)循环控制部分:这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。(4)结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。第 4 章 单片机汇编语言程序设计 例例 5 工作单元清零。在应用系统程序设计时,有时经常需要将存储器中各部分地址单元作为工作单元,存放
13、程序执行的中间值或执行结果,工作单元清零工作常常放在程序的初始化部分中。设有50个工作单元,其首址为外部存储器8000H单元,则其工作单元清零程序如下:第 4 章 单片机汇编语言程序设计 CLEAR:CLRAMOVDPTR,8000H;工作单元首址送指针MOVR2,#50;置循环次数CLEAR1:MOVXDPTR,AINCDPTR;修改指针DJNZR2,CLEAR1;控制循环RET第 4 章 单片机汇编语言程序设计 例例 6设在内部RAM的BLOCK单元开始处有长度为LEN的无符号数据块,试编一个求和程序,并将和存入内部RAM的SUM单元(设和不超过8位)。BLOCKEQU20HLENEQU3
14、0HSUMEQU40HSTART:CLRA;清累加器AMOVR2,LEN;数据块长度送R2MOVR1,BLOCK;数据块首址送R1LOOP:ADDA,R1;循环加法INCR1;修改地址指针DJNZR2,LOOP;修改计数器并判断MOVSUM,A;存和RET第 4 章 单片机汇编语言程序设计 二、二、多重循环多重循环 例例 710秒延时程序。延时程序与MCS-51执行指令的时间有关,如果使用12MHz晶振,一个机器周期为1s,计算出一条指令以至一个循环所需要的执行时间,给出相应的循环次数,便能达到延时的目的。10秒延时程序如下:DELAY:MOVR5,100DEL0:MOVR6,200DEL1:
15、MOVR7,248NOPDEL2:DJNZR7,DEL2DJNZR6,DEL1DJNZR5,DEL0RET第 4 章 单片机汇编语言程序设计 上例程序中采用了多重循环程序,即在一个循环体中又包含了其它的循环程序,这种方式是实现延时程序的常用方法。使用多重循环时,必须注意:(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。(2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。(3)内循环可以直接转入外循环,实现一个循环由多个条件控制的循环结构方式。第 4 章 单片机汇编语言程序设计 外循环中循环内循环外循环内循环外循环内循环内循环(a)嵌套正确(b)嵌套正确(c)交叉不正确多重循环
16、示意图第 4 章 单片机汇编语言程序设计 例例8设某系统的模数转换器是ADC0809,它的转换结束信号EOC连接到8031的P1.7端,当EOC的状态由低变高时,则结束循环等待,并读取转换值,其程序如下:START:MOVDPTR,addr;0809端口地址送DPTRMOVA,00H;启动0809转换MOVXDPTR,ALOOP:JNBP1.7,LOOP;检测P1.7状态,判是否转换结束MOVXA,DPTR;读取转换结果第 4 章 单片机汇编语言程序设计 例例9在内部RAM中从50H单元开始的连续单元依次存放了一串字符,该字符串以回车符为结束标志,要求测试该字符串的长度。第 4 章 单片机汇编
17、语言程序设计 ASCII码表第 4 章 单片机汇编语言程序设计 程序如下:START:MOVR2,0FFHMOVR0,4FH;数据指针R0置初值LOOP:INCR0INCR2CJNER0,0DH,LOOPRET第 4 章 单片机汇编语言程序设计 4.2.4 散转程序设计散转程序设计 散转程序是分支程序的一种,它可根据运算结果或输入数据将程序转入不同的分支。MCS-51指令系统中有一条跳转指令JMPA+DPTR,用它可以很容易地实现散转功能。该指令把累加器的8位无符号数与16位数据指针的内容相加,并把相加的结果装入程序计数器PC,控制程序转向目标地址去执行。此指令的特点在于,转移的目标地址不是在
18、编程或汇编时预先确定的,而是在程序运行过程中动态地确定的。目标地址是以数据指针DPTR的内容为起始的256字节范围内的指定地址,即由DPTR的内容决定分支转移程序的首地址,由累加器A的内容来动态选择其中的某一个分支转移程序。第 4 章 单片机汇编语言程序设计 K=?转SUB0转SUB1转SUB6K=0K=1K=6开始JMPA+DPTR,第 4 章 单片机汇编语言程序设计 数据排序程序数据排序程序数数据据的的排排序序,其其算算法法很很多多,常常用用的的有有插插入入排排序序法法、冒冒泡泡排排序序法法、快快速速排排序序法法、选选择择排排序序法法、堆堆积积排排序序法法、二二路路归归并并排排序序法法及基
19、数排序法等。及基数排序法等。冒冒泡泡法法是是一一种种相相邻邻数数互互换换的的排排序序方方法法,其其过过程程类类似似水水中中气气泡泡上上浮浮。执执行行时时从从前前向向后后进进行行相相邻邻数数比比较较,若若数数据据的的大大小小次次序序与与要要求求的的顺顺序序不不符符时时(逆逆序序),就就将将二二数数互互换换,正正序序时时不不交交换换,假假定定是是升升序序排排序序,则则通通过过这这种种相相邻邻数数互互换换方方法法,使使小小数数向向前前移移,大大数数向向后后移移,为为此此从从前前向向后后进进行行一一次次冒冒泡泡(相相邻邻数数互互换换),就就会会把把最最大大数数换换到到最最后后,再再进进行行一一次次冒冒
20、泡泡,就就会会把把次次大大数数排排在在倒倒数数第第二二,直至冒泡结束。直至冒泡结束。应用举例:第 4 章 单片机汇编语言程序设计 说明:说明:每每次次冒冒泡泡都都从从向向后后排排定定了了一一个个大大数数(升升序序),每每次次冒冒泡泡所所需需进进行行 的的比比较较次次数数都都递递减减,例例如如有有n个个数数排排序序,则则第第一一次次冒冒泡泡需需比比较较(n-1)次次,第第二二次次冒冒泡泡则则需需(n-2)次次,依依此此类类推推,但但实实际际编编程程中中为为了了简简化化程程序序,往往往往把把各各次次比比较较次次数数都都固固定定为为(n-1)次。)次。对于对于n n个数,理论上说应进行(个数,理论上
21、说应进行(n-1n-1)次冒泡才能完成)次冒泡才能完成排序,但实际上往往不到(排序,但实际上往往不到(n-1n-1)次就已排好序。判定排序是否)次就已排好序。判定排序是否完成的最简单方法是每次冒泡中是否有互换发生,如果有互换完成的最简单方法是每次冒泡中是否有互换发生,如果有互换发生,说明排序还没完成,否则就表示已排好序,为此控制排发生,说明排序还没完成,否则就表示已排好序,为此控制排序结束常不使用计数方法,而使用设置互换标志的方法,以其序结束常不使用计数方法,而使用设置互换标志的方法,以其状态表示在一次冒泡中有无数据互换进行。状态表示在一次冒泡中有无数据互换进行。第 4 章 单片机汇编语言程序
22、设计 统计的数值分别存入统计的数值分别存入20H29H中。中。CLRA;结果单元;结果单元20H29H清零清零MOV R0,#10MOV R1,#20HLP:MOVR1,AINCR1DJNZ R0,LPMOV R0,#100;100个数的计数器个数的计数器READ:MOV A,P1;读入;读入P1例例10.对从对从P1口输入的口输入的100个个09的数进行概率统计。的数进行概率统计。第 4 章 单片机汇编语言程序设计 CHK0:CJNE A,#0,CHK1;比较,不为;比较,不为“0”,继续比较,继续比较INC20H;是是“0”,则则“0”计计数数单单元元加加1SJMP END0;是否全部统计
23、完?;是否全部统计完?CHK1:CJNE A,#1,CHK2INC21H;是是“1”,则则“1”计计数数单单元元加加1SJMP END0CHK2:CJNE A,#2,CHK3INC22H;是是“2”,则则“2”计计数数单单元元加加1SJMP END0第 4 章 单片机汇编语言程序设计 CHK3:CJNE A,#3,CHK4INC23H;是是“3”,则则“3”计计数数单单元元加加1SJMP END0CHK4:CJNEA,#4,CHK5INC24H;是是“4”,则则“4”计计数数单单元元加加1SJMP END0CHK5:CJNEA,#5,CHK6INC25H;是是“5”,则则“5”计计数数单单元元
24、加加1SJMP END0第 4 章 单片机汇编语言程序设计 CHK6:CJNEA,#6,CHK7INC26H;是是“6”,则则“6”计计数数单单元加元加1 SJMP END0CHK7:CJNEA,#7,CHK8INC27H;是是“7”,则则“7”计计数数单单元加元加1SJMP END0第 4 章 单片机汇编语言程序设计 CHK8:CJNE A,#8,CHK9INC28H;是是“8”,则则“8”计计数数单单元元加加1SJMP END0CHK9:CJNE A,#9,ERRINC29H;是是“9”,则则“9”计计数数单单元元加加1END0:DJNZR0,READ;判是否全部统计完?;判是否全部统计完
25、?HERE:SJMPHEREERR:;非;非09,出错,出错第 4 章 单片机汇编语言程序设计 第 4 章 单片机汇编语言程序设计 4.2.5 子程序和参数传递子程序和参数传递 一、一、子程序的概念子程序的概念通常把一些基本操作功能编制为程序段作为独立的子程序,以供不同程序或同一程序反复调用。在程序中需要执行这种操作的地方放置一条调用指令,当程序执行到调用指令,就转到子程序中完成规定的操作,并返回到原来的程序继续执行下去。第 4 章 单片机汇编语言程序设计 二、二、子程序的调用子程序的调用调用子程序的指令有“ACALL”和“LCALL”,执行调用指令时,先将程序地址指针PC改变(“ACALL”
26、加 2,“LCALL”加3),然后PC值压入堆栈,用新的地址值代替。执行返回指令时,再将PC值弹出。子程序调用中,主程序应先把有关的参数存入约定的位置,子程序在执行时,可以从约定的位置取得参数,当子程序执行完,将得到的结果再存入约定的位置,返回主程序后,主程序可以从这些约定的位置上取得需要的结果,这就是参数的传递参数的传递。第 4 章 单片机汇编语言程序设计 子程序调用与返回过程示意图子程序调用与返回过程示意图第 4 章 单片机汇编语言程序设计 在汇编语言源程序中使用子程序时,一般要注意两个问题:参数传递和现场保护。1、参数传递一般可采用以下方法:传递数据。将数据通过工作寄存器R0R7或累加器
27、来传送。即主程序和子程序在交接处,上述寄存器和累加器存储的是同一参数。传送地址。数据存放在数据寄存器中,参数传递时只通过R0、R1、DPTR传递数据所存放的地址。通过堆栈传递参数。在调用之前,先把要传送的参数压入堆栈,进入子程序之后,再将压入堆栈的参数弹出到工作寄存器或者其他内存单元。第 4 章 单片机汇编语言程序设计 2、保护现场与恢复现场保护现场与恢复现场在在调调用用子子程程序序时时,单单片片微微机机只只是是自自动动保保护护断断点点地地址址,但但由由调调用用程程序序转转入入子子程程序序执执行行时时,往往往往会会破破坏坏主主程程序序或或调调用用程程序序的的有有关关寄寄存存器器(如如工工作作寄
28、寄存存器器和和累累加加器器等等)的的内内容容,也也很很可可能能破破坏坏程程序序状状态态字字PSW中中的的标标志志位位,从从而而在在子子程程序序返返回回后后引引起起出出错错。因因此此,必必要要时时应应将将这这些些单单元元内内容容保保护护起起来来,即即保保护护现现场场。对对于于PSW、A、B等等可可通通过过压压栈栈指指令令进进栈栈保保护护。工工作作寄寄存存器器采采用用选选择择不不同同工工作作寄寄存存器器组组的的方方式式来来达达到到保保护护的的目目的的。一一般般主主程程序序选选用用工工作寄存器组作寄存器组0,而子程序选用工作寄存器的其它组。,而子程序选用工作寄存器的其它组。当当子子程程序序执执行行完
29、完后后,即即返返回回主主程程序序时时,应应先先将将上上述述内内容容送送回回到到来来时时的的寄寄存存器器中中去去,这这后后一一过过程程称称为为恢恢复复现现场场。对对于于PSW、A、B等内容可通过弹栈指令来恢复。等内容可通过弹栈指令来恢复。在编写子程序时,还应注意保护(压栈)和恢复(弹出)在编写子程序时,还应注意保护(压栈)和恢复(弹出)的顺序,即先压入者后弹出。的顺序,即先压入者后弹出。第 4 章 单片机汇编语言程序设计【例11】单字节二进制数据转换为BCD码子程序SBTOD。功能:将单字节二进制数转换为三位BCD码。入口:R2中存放要转换的二进制数。出口:(R0)给出百位BCD码的存放地址。(
30、R0)+1给出十位和个位BCD码的存放地址,高半字节放十位,低半字节放个位。占用寄存器:A,B,R0,R2。A累加器的内容不受影响。第 4 章 单片机汇编语言程序设计 SBTOD:MOVSP,#60HPUSHACCMOVA,R2;取数MOVB,#64HDIVAB;除以100,(A)为百位数MOVR0,A;存人(R0)单元MOVA,#0AHXCHA,B;余数(B)送ADIVA,B;除以10,得十位和个位SWAPA;十位数放于高半字节ADDA,B;个位数放于低半字节INCR0MOVR0,A;个位存入(R0)+1单元POPACCRET第 4 章 单片机汇编语言程序设计【例12】求两个无符号数据块中的
31、最大值。数据块的首地址分别为60H和70H,每个数据块的第一个字节都存放数据块的长度,结果存入5FH单元。解本例可采用分别求出两个数据块的最大值,然后比较其大小的方法,求最大值的过程可采用子程序。子程序名称:QMAX。子程序入口条件:R1中存有数据块首地址。出口条件:最大值在A中。下面分别编写主程序和子程序。第 4 章 单片机汇编语言程序设计 主程序:ORG2000HMOVSP,#2FH;设堆栈指针MOVR1,#60H;取第一数据块首地址送R1中ACALLQMAX;第一次调用求最大值子程序MOV40H,A;第一个数据块的最大值暂存40HMOVR1,#70H;取第二数据块首地址送R1中ACALL
32、QMAX;第二次调用求最大值子程序CJNEA,40H,NEXT;两个最大值进行比较NEXT:JNCLP;A大,则转LPMOVA,40H;A小,则把40H中内容送人ALP:MOV5FH,ASJMP第 4 章 单片机汇编语言程序设计 子程序:ORG2200HQMAX:MOVA,R1;取数据块长度MOVR2,A;R2做计数器CLRA;清零,准备做比较LP1:INCR1;指向下一个数据地址 CLRC;准备做减法 SUBBA,R1;用减法做比较JNCLP3;若A大,则转LP3MOVA,R1;A小,则将大数送A中 SJMPLP4;五条件转LP4LP3:ADDA,R1;恢复A中值LP4:DJNZR2,LP1
33、;计数器减1,不为零,转继续比较RET;比较完,子程序返回第 4 章 单片机汇编语言程序设计 三、子程序设计三、子程序设计子程序的调用与返回子程序的调用与返回子程序的调用与返回子程序的调用与返回MCS-51MCS-51单单单单片片片片机机机机有有有有两两两两条条条条子子子子程程程程序序序序调调调调用用用用指指指指令令令令:ACALL ACALL addr11addr11、LCALL addr16LCALL addr16;一条子程序返回指令;一条子程序返回指令;一条子程序返回指令;一条子程序返回指令RETRET。保存与恢复寄存器内容保存与恢复寄存器内容保存与恢复寄存器内容保存与恢复寄存器内容例如
34、:例如:例如:例如:SUB1:SUB1:PUSH PSW PUSH PSW PUSH A PUSH A PUSH R6 PUSH R6 (此处省略了子程序的内容此处省略了子程序的内容此处省略了子程序的内容此处省略了子程序的内容)POP R6POP R6 POP APOP A PUSH PSW PUSH PSW第 4 章 单片机汇编语言程序设计【例例例例13 13】编程计算编程计算编程计算编程计算 编程说明:这个问题中,计算某数的平方可以用子程编程说明:这个问题中,计算某数的平方可以用子程编程说明:这个问题中,计算某数的平方可以用子程编程说明:这个问题中,计算某数的平方可以用子程序来实现,两次调
35、用该子程序,并求和便得到所需序来实现,两次调用该子程序,并求和便得到所需序来实现,两次调用该子程序,并求和便得到所需序来实现,两次调用该子程序,并求和便得到所需结果。设结果。设结果。设结果。设a a、b b 分别存于内部分别存于内部分别存于内部分别存于内部RAM RAM 的的的的30H30H、31H31H单单单单元,结果元,结果元,结果元,结果C C存于内部存于内部存于内部存于内部RAMRAM的的的的40H40H单元。单元。单元。单元。第 4 章 单片机汇编语言程序设计 参数传递:主程序中,将某数存放到累加参数传递:主程序中,将某数存放到累加参数传递:主程序中,将某数存放到累加参数传递:主程序
36、中,将某数存放到累加器器器器A A中,作为子程序的入口参数;子程序中,中,作为子程序的入口参数;子程序中,中,作为子程序的入口参数;子程序中,中,作为子程序的入口参数;子程序中,将所求数的平方值存放在累加器将所求数的平方值存放在累加器将所求数的平方值存放在累加器将所求数的平方值存放在累加器A A中,作为出中,作为出中,作为出中,作为出口参数(即主程序的返回值)。口参数(即主程序的返回值)。口参数(即主程序的返回值)。口参数(即主程序的返回值)。子程序的入口参数:子程序的入口参数:子程序的入口参数:子程序的入口参数:A A中存放某数的值。中存放某数的值。中存放某数的值。中存放某数的值。子程序的出
37、口参数:子程序的出口参数:子程序的出口参数:子程序的出口参数:A A中存放所求数的平方。中存放所求数的平方。中存放所求数的平方。中存放所求数的平方。子程序如下:子程序如下:子程序如下:子程序如下:SQR:SQR:INC AINC A MOVC A,A+PC MOVC A,A+PC ;查平方表;查平方表;查平方表;查平方表 RETRETTABLE:TABLE:DB 0,1,4,9,16DB 0,1,4,9,16 DB 25,36,49,64,81DB 25,36,49,64,81第 4 章 单片机汇编语言程序设计 第 4 章 单片机汇编语言程序设计 主程序如下:主程序如下:主程序如下:主程序如下
38、:START:START:MOV A,30HMOV A,30H ACALL SQR ACALL SQR ;调查表子程序;调查表子程序;调查表子程序;调查表子程序 MOV R1,A MOV R1,A ;a2a2暂存暂存暂存暂存R1R1中中中中 MOV A,31H MOV A,31H ACALL SQR ACALL SQR ;调查表子程序;调查表子程序;调查表子程序;调查表子程序 ADD A,R1ADD A,R1 MOV 40H,AMOV 40H,A ENDEND第 4 章 单片机汇编语言程序设计 4.2.6 查表程序设计查表程序设计 查表程序是一种常用程序,它广泛使用于LED显示控制、打印机打印
39、控制、数据补偿、数值计算、转换等功能程序中,这类程序具有简单、执行速度快等特点。所谓查表法,就是预先将满足一定精度要求的表示变量与函数值之间关系的一张表求出,然后把这张表存于单片机的程序存储器中,这时自变量值为单元地址,相应的函数值为该地址单元中的内容。查表,就是根据变量X在表格中查找对应的函数值Y,使Y=f(X)。第 4 章 单片机汇编语言程序设计 MCS-51指令系统中,有两条查表指令:MOVCA,A+PCMOVCA,A+DPTR第 4 章 单片机汇编语言程序设计 例例 13 一个十六进制数存放在内部RAM的HEX单元的低4位中,将其转换成ASCII码并送回HEX单元。第 4 章 单片机汇
40、编语言程序设计 ORG1000HHEXASC:MOVA,HEXANLA,0FHADDA,3;修改指针MOVCA,A+PCMOVHEX,ARET十六进制09的ASCII码为30H39H,AF的ASCII码为41H46H,ASCII码表格的首地址为ASCTAB。编程如下:ASCTAB:DB30H,31H,32H,33H,34HDB35H,36H,37H,38H,39HDB41H,42H,43H,44H,45HDB46H在这个程序中,查表指令MOVCA,A+PC到表格首地址有两条指令,占用3个字节地址空间,故修改指针应加3。第 4 章 单片机汇编语言程序设计 例例 14设有一个巡回检测报警装置,需对
41、96路输入进行控制,每路有一个额定的最大值,是双字节数。当检测量大于该路对应的最大值时,就越限报警。假设R2为保存检测路数的寄存器,查找最大额定值,将其对应的最大额定值存放于31H和32H单元中。的程序如下:FMAX:MOVA,R2ADDA,R2;表中一个额定值为2个字节MOV31H,AMOVDPTR,TAB;表首址第 4 章 单片机汇编语言程序设计 MOVCA,A+DPTR;查表读取第一个字节XCHA,31H;第一个字节内容存入31HINCDPTRMOVCA,A+DPTR;查表读取第二个字节MOV32H,A;第二字节的内容存入32HTAB:DW1230H,1450H,.DW2230H,244
42、0H,.DW3120H,3300H,.第 4 章 单片机汇编语言程序设计 4.2.7 数制转换数制转换 例例 15将一个字节二进制数转换成3位非压缩型BCD码。设一个字节二进制数在内部RAM40H单元,转换结果放入内部RAM50H,51H,52H单元中(高位在前),程序如下:HEXBCD:MOVA,40HMOVB,100DIVABMOV50H,AMOVA,10XCHA,BDIVABMOV51H,AMOV52H,BRET第 4 章 单片机汇编语言程序设计 4.2.8 运算程序运算程序 一、一、加、加、减法程序减法程序 例例 16将40H开始存放的10个字节的数与50H开始存放的10个字节的数相减
43、(假设被减数大于减数)。设被减数指针为R0,减数指针为R1,差数放回被减数单元,R5存放字节个数,则程序如下:第 4 章 单片机汇编语言程序设计 SUB:MOVR0,40HMOVR1,50HMOVR5,10CLRCSUB1:MOVA,R0SUBBA,R1MOVR0,AINCR0INCR1DJNZR5,SUB1RET第 4 章 单片机汇编语言程序设计 二、二、乘法运算程序乘法运算程序在计算机中,常将乘法采用移位和加法来实现。例例19将(R2R3)和(R6R7)中双字节无符号数相乘,结果存入R4R5R6R7。此乘法可以采用部分积右移的方法来实现,其程序框图如图4.6所示,程序如下:NMUL:MOV
44、R4,0;初始化MOVR5,0CLRCMOVR0,16第 4 章 单片机汇编语言程序设计 NMUL1:MOVA,R4;CyR4R5R6R7右移一位RRCAMOVR4,AMOVA,R5RRCAMOVR5,AMOVA,R6RRCAMOVR6,AMOVA,R7RRCMOVR7,AJNCNMUL2;C为移出乘数的最低位MOVA,R5;(R4R5)+(R6F7)(R4R5)第 4 章 单片机汇编语言程序设计 ADDA,R3MOVR5,AMOVA,R4ADDCA,R2MOVR4,ANMUL2:DJNZR0,NMUL1;循环16位MOVA,R4;最后结果再移一位RRCAMOVR4,AMOVA,R5RRCAM
45、OVR5,AMOVA,R6第 4 章 单片机汇编语言程序设计 RRCAMOVR6,AMOVA,R7RRCAMOVR7,ARET第 4 章 单片机汇编语言程序设计 图4.6NMUL程序框图第 4 章 单片机汇编语言程序设计 例例 20假定被乘数在(R4R3)中,乘数放在R2中,乘积放在R7R6和R5中。MCS-51中有8位数的乘法指令MUL,用它来实现多字节乘法时,可表示为(R4R3)(R2)=(R4)28+(R3)(R2)=(R4)(R2)28+(R3)(R2)其中(R4)(R2)和(R3)(R2)都是可直接用MUL指令来实现,而乘以28意味着左移8位。由此可编写如下程序:第 4 章 单片机汇
46、编语言程序设计 NMUL1:MOVA,R2MOVB,R3MULAB;(R3)(R2)MOVR5,A;积的低位送R5MOVR6,B;积的高位送R6MOVA,R2MOVB,R4MULAB;(R4)(R2)ADDA,R6;(R3)(R2)的高位加(R4)(R2)的低位MOVA,BADDCA,00H;(R4)(R2)的高位加CyMOVR7,A;结果送R7RET第 4 章 单片机汇编语言程序设计 三、三、除法运算程序除法运算程序除法是乘法的逆运算,用移位、相减的方法来完成。首先比较被除数的高位字与除数,如被除数高位大于除数,则商为1,并从被除数中减去除数,形成一个部分余数;否则商位为0,不执行减法。然后
47、把新的部分余数左移一位,并与除数再次进行比较。循环此步骤,直到被除数的所有位都处理完为止,一般商的字长为n,则需循环n次。一般计算机中,被除数均为双倍位,即如果除数和商为双字节,则被除数为四字节。如果在除法中发生商大于规定字节,称为溢出。在进行除法前,应该检查是否会产生溢出。一般可在进行除法前,先比较被除数的高位与除数,如被除数高位大于除数,则溢出,置溢出标志,不执行除法。第 4 章 单片机汇编语言程序设计 图4.7除法程序的流程第 4 章 单片机汇编语言程序设计 例例 21将(R4R5R6R7)除以(R2R3),商放在(R6R7)中,余数放在(R4R5)中。NDIV:MOVA,R5;判商是否
48、产生溢出CLRCSUBBA,R3MOVA,R4SUBBA,R2JNCNDIV1;溢出,转溢出处理MOVB,16;无溢出,执行除法第 4 章 单片机汇编语言程序设计 NDIV2:CLRC;被除数左移一位,低位送0MOVA,R7RLCAMOVR7,AMOVA,R6RLCAMOVR6,AMOVA,R5RLCAMOVR5,AXCHA,R4RLCAXCHA,R4第 4 章 单片机汇编语言程序设计 MOVF0,C;保护移出的最高位CLRCSUBBA,R3;部分余数与除数比较MOVR1,AMOVA,R4SUBBA,R2JBF0,NDIV3;移出的高位为1,肯定够减JCNDIV4;否则,(Cy)=0才够减NDIV3:MOVR4,A;回送减法结果MOVA,R1MOVR5,AINCR7;商上1第 4 章 单片机汇编语言程序设计 NDIV4:DJNZB,NDIV2;循环次数减1,若不为零则循环CLRF0;正常执行无溢出F0=0RETNDIV1:SETBF0;溢出F0=1RET
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100