1、4.1 概述概述 4.2 顺序结构程序顺序结构程序4.3 分支结构程序分支结构程序4.4 循环结构程序循环结构程序4.5 子程序结构子程序结构4.6 综合程序举例综合程序举例4.7 本章小节本章小节4.8 思考与练习题思考与练习题第四章汇编语言程序设计第四章汇编语言程序设计 主要内容:主要内容:本章从程序结构和实用角度出发本章从程序结构和实用角度出发,通过通过典型的应用实例介绍汇编语言程序的基本结构及模块典型的应用实例介绍汇编语言程序的基本结构及模块化程序设计化程序设计,使学生进一步理解和掌握使学生进一步理解和掌握5151系列单片机的系列单片机的指令系统指令系统,并掌握汇编语言程序设计的基本语
2、言和技巧。并掌握汇编语言程序设计的基本语言和技巧。要求:要求:1 1、熟练运用指令系统、熟练运用指令系统,掌握循环程序、分支程序掌握循环程序、分支程序和搜索程序的设计方法;和搜索程序的设计方法;2 2、熟练运用指令系统,掌握基本的运算程序设计、熟练运用指令系统,掌握基本的运算程序设计方法;方法;第四章汇编语言程序设计第四章汇编语言程序设计 3 3、熟练运用指令系统,掌握数制和码制转换程序、熟练运用指令系统,掌握数制和码制转换程序的设计方法;的设计方法;4 4、熟练掌握子程序结构,实现模块化程序设计;、熟练掌握子程序结构,实现模块化程序设计;5 5、深刻理解软件、硬件的相互作用,不断提高实、深刻
3、理解软件、硬件的相互作用,不断提高实际问题处理程序编写能力。际问题处理程序编写能力。4.1 4.1 概述概述 4.1 4.1 概述概述 程序设计:为了解决某一个问题,将所设计应用程序设计:为了解决某一个问题,将所设计应用系统系统(单片机类型单片机类型)的指令按一定顺序组合在一起。即的指令按一定顺序组合在一起。即用计算机所能接受的语言把解决问题的步骤描述出来。用计算机所能接受的语言把解决问题的步骤描述出来。单片机汇编源程序结构与通用微机汇编源程序结单片机汇编源程序结构与通用微机汇编源程序结构略有不同,构略有不同,原因原因是:是:1 1、一般没有可以直接利用的监控程序,所有程一般没有可以直接利用的
4、监控程序,所有程序均要自己编写。序均要自己编写。4.1 4.1 概述概述 2 2、没有像、没有像X86X86汇编语言程序那样,可直接调用系汇编语言程序那样,可直接调用系统提供的中断功能统提供的中断功能(如:如:BIOSBIOS中断、中断、DOSDOS中断中断)或或WindowsWindows的的APIAPI函数完成特定操作,即所有子程序函数完成特定操作,即所有子程序(如键如键盘监控子程序、显示驱动程序、中断服务程序等盘监控子程序、显示驱动程序、中断服务程序等)均需均需要自己编写。要自己编写。汇编语言语句三种基本类型:指令语句、伪指令语汇编语言语句三种基本类型:指令语句、伪指令语句、宏指令语句。
5、句、宏指令语句。4.1 4.1 概述概述 一、汇编语言伪指令一、汇编语言伪指令 伪指令伪指令 汇编程序某些指令在汇编时并不产生目标代码,汇编程序某些指令在汇编时并不产生目标代码,不影响程序的执行,不是不影响程序的执行,不是CPUCPU能执行的指令,只提供一能执行的指令,只提供一些汇编控制信息的指令。些汇编控制信息的指令。常用的伪指令:常用的伪指令:(1)(1)设置起始地址设置起始地址ORGORG 格式:格式:ORG ORG nnnn 1 1、ORGORG:表明为后续源程序经汇编后的目标程序:表明为后续源程序经汇编后的目标程序安排存放位置,安排存放位置,nnnn则给出了存放的起始地址值则给出了存
6、放的起始地址值;4.1 4.1 概述概述 2 2、ORGORG总是出现在每段源程序或数据块的开始总是出现在每段源程序或数据块的开始;3 3、在一个源程序中,可以多次使用、在一个源程序中,可以多次使用ORGORG规定不同规定不同程序段的起始位置,但定义的地址顺序应从小到大,程序段的起始位置,但定义的地址顺序应从小到大,且不能重叠且不能重叠;4 4、若不用、若不用ORGORG,则汇编将从,则汇编将从0000H0000H单元开始存放目单元开始存放目标程序标程序;例例4.14.1ORG 3000HORG 3000H;表示后续的目标程序代码从;表示后续的目标程序代码从3000H3000H单元开始存放。单
7、元开始存放。MOV AMOV A,30H30H 4.1 4.1 概述概述 (2)(2)定义字节定义字节DBDB 格式:标号:格式:标号:DBDB字节数据项表字节数据项表 1 1、标号区段可有可无,项表指中间用逗号分开的、标号区段可有可无,项表指中间用逗号分开的字节、数、字符串或用引号括起来的字节、数、字符串或用引号括起来的ASCASC码字符串码字符串(一个字符用一个字符用ASCASC码表示,就相当于一个字节码表示,就相当于一个字节)。2 2、功能:功能:把项表的数据存入从标号开始的连续单把项表的数据存入从标号开始的连续单元中。元中。例例4.24.2ORG 2000HORG 2000HSEG1S
8、EG1:DB 35HDB 35H,78H78H4.1 4.1 概述概述 SEG2SEG2:DB DAYDB DAY ENDEND则则 (2000H)=35H(2000H)=35H,(2001H)=78H(2001H)=78H,(2002H)=44H(2002H)=44H,(2003H)=41H(2003H)=41H,(2004H)=59H(2004H)=59H 注意:项表中若为数值,其取值范围应为注意:项表中若为数值,其取值范围应为00H00HFFHFFH,若为字符串,其长度应限制在,若为字符串,其长度应限制在8080个字符内。个字符内。(3)(3)定义字定义字DWDW 格式:标号:格式:标号
9、:DWDW字节数据项表字节数据项表 DWDW的基本含义与的基本含义与DBDB相同,不同的是相同,不同的是DWDW定义定义1616位数位数据,常用来建立地址表。存放时一个字需两个单元,据,常用来建立地址表。存放时一个字需两个单元,高高8 8位先存放,低位先存放,低8 8位后存放。位后存放。4.1 4.1 概述概述例例4.34.3 ORG 8000HORG 8000HHETABHETAB:DW 7234H,8AH,10 DW 7234H,8AH,10 汇编后:汇编后:(8000H)=72H(8000H)=72H,(8001H)=34H(8001H)=34H,(8002H)=00H(8002H)=0
10、0H,(8003H)=8AH(8003H)=8AH,(8004H)=00H(8004H)=00H,(8005H)=0AH(8005H)=0AH (4)(4)数据地址赋值数据地址赋值DATADATA 格式为:格式为:字符名称字符名称 DATA DATA 数据或表达式数据或表达式 把数据地址或代码地址赋予字符名称。常用于定把数据地址或代码地址赋予字符名称。常用于定义数据地址,它可以先使用后定义义数据地址,它可以先使用后定义(因为因为DATADATA定义的字定义的字符名称作为标号登记在符号表中,而符名称作为标号登记在符号表中,而EQUEQU没定义没定义),这,这点与点与EQUEQU不同。表达式应是可
11、求值的。不同。表达式应是可求值的。4.1 4.1 概述概述例例4.44.4ORGORG8000H8000H INDEXJ INDEXJDATADATA 8096H8096H LJMP LJMP INDEXJINDEXJ END END 等价于等价于ORGORG8000H8000H LJMPLJMP 8096H8096H ENDEND 4.1 4.1 概述概述 (5)(5)赋值赋值(等值等值)EQU)EQU 格式:标号格式:标号 EQU EQU 项或表达式项或表达式 功能:功能:将语句操作数的值赋于本语句的标号,用将语句操作数的值赋于本语句的标号,用EQUEQU赋过值的标号名可以用作数据地址、代
12、码地址、位地址赋过值的标号名可以用作数据地址、代码地址、位地址或是一个立即数,它可以是或是一个立即数,它可以是8 8位、也可以是位、也可以是1616位。位。注意:注意:1 1、在同一程序中,用、在同一程序中,用EQUEQU伪指令对标号赋值后,该伪指令对标号赋值后,该标号的值在整个程序中不能再改变;标号的值在整个程序中不能再改变;2 2、用、用EQUEQU定义的字符须先定义后使用。定义的字符须先定义后使用。4.1 4.1 概述概述 例例4.54.5 ORGORG8000H8000H AAAAEQUEQUR6R6;AAAA与与R6R6等值等值MOV A,AAMOV A,AA ;(R6)(R6)的值
13、送入的值送入A A中中 (6)(6)位地址符号命令位地址符号命令BITBIT 格式:格式:字符名称字符名称 BIT BIT 位地址位地址 功能功能:给一个可位寻址的位单元起一个名字。用:给一个可位寻址的位单元起一个名字。用BITBIT定义过的位单元可用名字使用定义过的位单元可用名字使用。注意:名字必须是以字母开头的字母数字串,它注意:名字必须是以字母开头的字母数字串,它必须是事先未定义过的。必须是事先未定义过的。4.1 4.1 概述概述 例例4.6 4.6 A1A1BITBITP1.0P1.0A2A2BITBIT02H 02H (7)(7)源程序结束源程序结束ENDEND 格式:标号:格式:标
14、号:END END 表达式表达式 1 1、标号和表达式是可有可无的。、标号和表达式是可有可无的。2 2、ENDEND是一个结束标志,在一个程序中只允许出是一个结束标志,在一个程序中只允许出现一个现一个ENDEND语句,而且它必须放在整个程序的最后面。语句,而且它必须放在整个程序的最后面。(8)(8)定义存储空间定义存储空间DSDS 格式:格式:标号:标号:DS DS 表达式表达式 1 1、由标号指定单元开始,定义一个存储区,以备、由标号指定单元开始,定义一个存储区,以备源程序使用。源程序使用。4.1 4.1 概述概述2 2、存储区内预留的存储单元数由数据或字符表达式、存储区内预留的存储单元数由
15、数据或字符表达式的值决定。的值决定。例例4.74.7 ORG 8000HORG 8000HTEMPTEMP:DS 08HDS 08HDB 30H,8AHDB 30H,8AH即即8000H8000H8007H8007H单元保留备用,单元保留备用,(8008H)=30H(8008H)=30H,(8009H)=8AH(8009H)=8AH。二、汇编语言程序设计的基本步骤二、汇编语言程序设计的基本步骤1 1、分析问题、分析问题(调研调研),确定方案和计算方法,确定方案和计算方法 目的目的:对需要解决的问题进行分析,以求对问题有:对需要解决的问题进行分析,以求对问题有正确的理解。正确的理解。4.1 4.
16、1 概述概述2 2、了解应用系统的硬件配置、性能指标。、了解应用系统的硬件配置、性能指标。3 3、建立系统数学模型,确定控制算法和操作步骤。、建立系统数学模型,确定控制算法和操作步骤。4 4、编制说明要解决问题的程序框图。、编制说明要解决问题的程序框图。画程序框图画程序框图:用各种图形、符号、指向线等来说明:用各种图形、符号、指向线等来说明程序设计的过程。框图步骤写得越细致,编程时也就越程序设计的过程。框图步骤写得越细致,编程时也就越方便。方便。目的:目的:把具有一定功能的各个部分有机地联系起来,把具有一定功能的各个部分有机地联系起来,可以使人们抓住程序的基本线索,对全局有完整的了解。可以使人
17、们抓住程序的基本线索,对全局有完整的了解。4.1 4.1 概述概述好处:好处:(1)(1)容易发现设计思想上的错误和矛盾,便于找出解容易发现设计思想上的错误和矛盾,便于找出解决问题的途径。决问题的途径。(2)(2)便于把较大的程序分成若干个模块,从而分头进便于把较大的程序分成若干个模块,从而分头进行设计,最后合在一起联调。行设计,最后合在一起联调。5 5、按所使用计算机的指令系统,依据框图写出汇编语言、按所使用计算机的指令系统,依据框图写出汇编语言程序。程序。编程的三个原则:尽可能的节省数据存储单元;缩编程的三个原则:尽可能的节省数据存储单元;缩短程序长度;减少执行时间。短程序长度;减少执行时
18、间。4.1 4.1 概述概述.合理分配存储器单元和了解合理分配存储器单元和了解I/OI/O接口地址。接口地址。.按功能设计程序,明确各程序之间的相互关系。按功能设计程序,明确各程序之间的相互关系。.用注释行说明程序,便于阅读、调试和修改。用注释行说明程序,便于阅读、调试和修改。6 6、上机调试程序,直至完成预定功能。、上机调试程序,直至完成预定功能。MCS-51 MCS-51 程序总体组成程序总体组成MCS-51MCS-51汇编语言源程序一般由程序头、主程序、完汇编语言源程序一般由程序头、主程序、完成特定操作的子程序成特定操作的子程序(可能不止一个可能不止一个)及相应功能的中断及相应功能的中断
19、服务程序等部分组成。服务程序等部分组成。结构如下:结构如下:4.1 4.1 概述概述 -程序头程序头(即定义变量和等值符号即定义变量和等值符号)-)-SCL BIT P1.2 SCL BIT P1.2;定义;定义SCLSCL位变量位变量SDA BIT P1.3 SDA BIT P1.3;定义;定义SDASDA位变量位变量ByteConByteCon DATA 30H DATA 30H;定义字节变量;定义字节变量ByteConByteCon ORG nnnnORG nnnn ;CPUCPU复位后,第一指令机器码存放复位后,第一指令机器码存放单元地址,具体值由单元地址,具体值由CPUCPU类型决定
20、。类型决定。例例4.8 4.8 在在5151系列中,复位后系列中,复位后PC=0000PC=0000,因此在,因此在5151系系列中,第一条指令存放在列中,第一条指令存放在ROMROM的的0000H0000H单元中,即单元中,即nnnnnnnn为为“0000H”0000H”。4.1 4.1 概述概述 LJMP Main LJMP Main;一般第一条指令是跳转指令,跳到;一般第一条指令是跳转指令,跳到主程序入口地址,其中主程序入口地址,其中“Main”Main”是主程序入口地址标是主程序入口地址标号。号。主程序不能直接存放在复位后主程序不能直接存放在复位后PCPC指向的存储单元,原指向的存储单
21、元,原因是这一区域往往是中断服务程序的入口地址,不能因是这一区域往往是中断服务程序的入口地址,不能覆盖,否则不能使用相应的中断功能。覆盖,否则不能使用相应的中断功能。例例4.94.9 在在5151系列中,外部中断系列中,外部中断0 0的入口地址为的入口地址为 0003H0003H,显然只有,显然只有0000H0000H、0001H0001H和和0002H0002H三个单元,刚三个单元,刚好可以存放一条长跳转指令的机器码。好可以存放一条长跳转指令的机器码。4.1 4.1 概述概述-主程序主程序 -ORG yyyyORG yyyy ;其中;其中yyyyyyyy就是主程序代码存放区的就是主程序代码存
22、放区的首地址,如首地址,如0100H0100H MainMain:MOV SP,#5FHMOV SP,#5FH ;初始化有关寄存器,如设;初始化有关寄存器,如设置置SPSP、选择工作寄存器组。、选择工作寄存器组。;初始化中断控制寄存器等;初始化中断控制寄存器等 ;主程序实体,具体指令由程序功能决定;主程序实体,具体指令由程序功能决定 LCALL SUB1LCALL SUB1 ;调用子程序;调用子程序1 1,其中,其中SUB1SUB1为子程序名为子程序名 ;END END 4.1 4.1 概述概述 -子程序结构子程序结构 -ORG zzzzORG zzzz ;其中;其中zzzzzzzz就是子程序
23、代码存放区的首就是子程序代码存放区的首地址,可以不用地址,可以不用ORGORG指令,直接将子程序存放主程序后。指令,直接将子程序存放主程序后。SUB1SUB1:PUSH PSWPUSH PSW PUSH AccPUSH Acc;通过;通过PUSHPUSH指令保护子程序中用到的有指令保护子程序中用到的有关寄存器,如关寄存器,如AccAcc、PSW PSW 等,即保护现场等,即保护现场 ;子程序实体,具体指令由程序功能决定;子程序实体,具体指令由程序功能决定 POP AccPOP Acc POP PSWPOP PSW ;恢复现场;恢复现场RETRET ;子程序最后一条指令,使子程序指令运行结;子程
24、序最后一条指令,使子程序指令运行结束后,返回主程序断点。束后,返回主程序断点。4.1 4.1 概述概述-中断服务程序结构中断服务程序结构 -ORG kkkkORG kkkk ;其中;其中kkkkkkkk就是中断程序代码存放区的就是中断程序代码存放区的首地址首地址 PUSH PSWPUSH PSW PUSH AccPUSH Acc ;通过;通过PUSHPUSH指令保护中断服务程序中用指令保护中断服务程序中用到的有关寄存器,如到的有关寄存器,如 AccAcc、PSWPSW等,即保护现场等,即保护现场 ;中断服务程序实体,具体指令由程序功能;中断服务程序实体,具体指令由程序功能决定决定POP Acc
25、POP AccPOP PSWPOP PSW ;恢复现场;恢复现场4.1 4.1 概述概述CLR TICLR TI ;清除中断标志;清除中断标志(在在5151系列中,对于电平触系列中,对于电平触发的外中断发的外中断INT0INT0和和 INT1INT1、串行接收及发送中断、串行接收及发送中断 RIRI、TITI等,不自动清除,需要在中断服务结束前,通过等,不自动清除,需要在中断服务结束前,通过CLRCLR指令指令清除。清除。RETIRETI ;中断服务程序最后一条指令,返回主程序断;中断服务程序最后一条指令,返回主程序断点。点。为了确保子程序、中断服务程序运行结束后,能够为了确保子程序、中断服务
26、程序运行结束后,能够正确返回,从断点处继续执行主程序,必须注意在子程正确返回,从断点处继续执行主程序,必须注意在子程序以及中断服务程序中堆栈操作指令的匹配问题,否则序以及中断服务程序中堆栈操作指令的匹配问题,否则将无法返回。将无法返回。4.1 4.1 概述概述例例4.10 4.10 在上述子程序结构中,假设在上述子程序结构中,假设SUB1SUB1子程序入口子程序入口地址为地址为2000H2000H,即主程序内,即主程序内“LCALL SUB1”LCALL SUB1”指令等效于指令等效于“LCALL 2000”LCALL 2000”。假设该指令机器码首地址为。假设该指令机器码首地址为1000H1
27、000H,且,且指令执行前,指令执行前,SP=5FHSP=5FH,则,则“LCALL 2000”LCALL 2000”指令执行过程指令执行过程中中PCPC和和SPSP内容如下:内容如下:(1)PCPC+3(1)PCPC+3,即,即PC=1003H(PC=1003H(即断点地址即断点地址 );(2)SPSP+1(2)SPSP+1,即,即SP=60HSP=60H,并把,并把PCPC低低8 8位压入堆栈,位压入堆栈,于是于是(60H)=03(60H)=03;(3)SPSP+1(3)SPSP+1,即,即SP=61HSP=61H,并把,并把PCPC高高8 8位压入堆位压入堆 栈,栈,于是于是(61H)=
28、10(61H)=10;4.1 4.1 概述概述 (4)(4)把把 SUB1SUB1入口地址装入入口地址装入PCPC,即,即 PC=2000HPC=2000H。可见,可见,“LCALL 2000”LCALL 2000”指令执行后,指令执行后,PC=2000HPC=2000H,已,已指向子程序指向子程序SUB1SUB1第一条指令所在的存储单元地址;第一条指令所在的存储单元地址;SP=61HSP=61H。在子程序中在子程序中 PUSH Acc PUSH Acc;执行后,;执行后,SP=62HSP=62H,(62H)(62H)就是就是AccAcc的当前的当前值,假设为值,假设为XXXX PUSH PS
29、W PUSH PSW;执行后,;执行后,SP=63HSP=63H,(63H)(63H)就是就是PSWPSW的当的当 前值,假设为前值,假设为YYYY返回前返回前 POP PSW POP PSW;执行后,;执行后,PSW(SP)PSW(SP),即将,即将(63H)(63H)单元单元4.1 4.1 概述概述中原来的中原来的PSWPSW返回给返回给PSWPSW;SPSPSPSP1 1,即,即SP=62HSP=62HPOP Acc POP Acc;执行后,;执行后,ACC(SP)ACC(SP),即将,即将(62H)(62H)单元中单元中原来的原来的AccAcc返回给返回给Acc Acc;SPSPSPS
30、P1 1,即,即SP=61HSP=61HRET RET;执行后,;执行后,PCPC高高8 8位位(SP)(SP),即将,即将(61H)(61H)单元内单元内容容10H10H传给传给PCPC高高8 8位,位,SPSPSPSP1 1,即,即SP=60HSP=60H;PCPC低低8 8位位(SP)(SP),即将,即将(60H)(60H)单元内容单元内容03H03H传给传给PCPC;低;低8 8位,位,SPSPSPSP1 1,即,即SP=5FHSP=5FH 结果结果PC=1003H(PC=1003H(重新装入主程序断点地址重新装入主程序断点地址)4.1 4.1 概述概述汇编语言程序按其汇编语言程序按其
31、结构结构可分为以下四类:可分为以下四类:(1)(1)顺序结构;顺序结构;(2)(2)分支结构;分支结构;(3)(3)循环结构;循环结构;(4)(4)子程序结构。子程序结构。4.2 4.2 顺序结构程序顺序结构程序4.2 4.2 顺序结构程序顺序结构程序 最简单的一种结构,又称简单程序。最简单的一种结构,又称简单程序。特点:特点:按照程序编写的顺序依次执行,不发生任何分支按照程序编写的顺序依次执行,不发生任何分支 或转移。或转移。(程序走向只有一条路径。程序走向只有一条路径。)例例4.114.11 将两个半字节数组合成一个字节数。将两个半字节数组合成一个字节数。设内部设内部RAMRAM中中40H
32、40H、41H41H单元分别存放着单元分别存放着8 8位二进制数,位二进制数,要求将两个单元中的低半字节合并成一个字节后,存入要求将两个单元中的低半字节合并成一个字节后,存入42H42H单元。单元。40H40H的低的低4 4位作为位作为42H42H的高的高4 4位。位。4.2 4.2 顺序结构程序顺序结构程序分析:分析:首先要取数送首先要取数送A(A(传送指令传送指令),分离出低,分离出低4 4位位(逻辑与逻辑与0FH)0FH),用,用A A半字节交换送到高半字节交换送到高4 4位,地址加位,地址加1 1,取另一个数,取另一个数低低4 4位数位数(逻辑与逻辑与0FH)0FH),用或合成一个字节
33、。,用或合成一个字节。解:解:STARTSTART:MOV R1MOV R1,#40H#40H MOV AMOV A,R1R1 ANL AANL A,#0FH#0FH;取第一个半字节;取第一个半字节 SWAP ASWAP A ;移至高;移至高4 4位位4.2 4.2 顺序结构程序顺序结构程序 INC R1INC R1XCH AXCH A,R1R1;取第二个字节;取第二个字节ANL AANL A,#0FH#0FH;取第二个半字节;取第二个半字节ORL AORL A,R1R1;拼字;拼字INC R1INC R1MOV R1MOV R1,A A ;存放结果;存放结果RETRET例例4.124.12
34、将将20H20H单元的两个单元的两个BCDBCD码拆开并变成码拆开并变成ASCASC码,存码,存入入21H21H、22H22H单元。注意:单元。注意:ASCASC码码0 09 9为为30H30H39H39H。分析:分析:4.2 4.2 顺序结构程序顺序结构程序 把把BCDBCD数除以数除以1010,商,商A A余余B B,刚好把两个,刚好把两个BCDBCD码分别移到码分别移到A A、B B的低的低4 4位,然后再各自与位,然后再各自与30H30H相相“或或”,即变成即变成ASCASC码。其程序框图如图码。其程序框图如图4-14-1所示。所示。采用先把采用先把20H20H中低中低4 4位位BCD
35、BCD码交换出来加以码交换出来加以转换、存放,然后再把高转换、存放,然后再把高4 4位位BCDBCD码交换至低码交换至低4 4位加以转换、位加以转换、存放。其程序框图如图存放。其程序框图如图4-24-2所示。所示。4.2 4.2 顺序结构程序顺序结构程序图图4-1 BCD4-1 BCD码转换为码转换为ASCIIASCII码方法一流程图解码方法一流程图解 4.2 4.2 顺序结构程序顺序结构程序 编程:编程:ORG 2000HORG 2000HMOV AMOV A,20H20HMOV BMOV B,#0AH#0AH;用;用0AH0AH作除数作除数DIV ABDIV ABORL BORL B,#3
36、0H#30H;低;低4 4位位BCDBCD码变成码变成ASCASC码码MOV 22HMOV 22H,B B ORL AORL A,#30H#30H;高;高4 4位位BCDBCD码变成码变成ASCASC码码 MOV 21HMOV 21H,A AENDEND 4.2 4.2 顺序结构程序顺序结构程序图图4-2 BCD4-2 BCD码转换为码转换为ASCIIASCII码方法二流程图解码方法二流程图解 4.2 4.2 顺序结构程序顺序结构程序 编程:编程:ORG 2000HORG 2000HMOV R0MOV R0,#22H#22HMOV R0MOV R0,#00H#00H MOV AMOV A,20
37、H20HXCHD AXCHD A,R0 R0 ORL 22HORL 22H,#30H#30H SWAP ASWAP AORL AORL A,#30H#30HMOV 21HMOV 21H,A AEND END 4.3 4.3 分支结构程序分支结构程序4.3 4.3 分支结构程序分支结构程序一、分支程序设计综述一、分支程序设计综述分支结构程序:分支结构程序:根据程序要求无条件或有条件改变根据程序要求无条件或有条件改变程序执行的顺序,选择程序的流向。程序执行的顺序,选择程序的流向。特点:特点:程序中含有转移类指令。程序中含有转移类指令。关键:关键:正确选用转移指令。正确选用转移指令。单重分支程序:单
38、重分支程序:一个判断决策框,程序有两条出路。一个判断决策框,程序有两条出路。4.3 4.3 分支结构程序分支结构程序两种分支结构两种分支结构 4.3 4.3 分支结构程序分支结构程序转移指令有转移指令有3 3种:种:1 1、无条件转移无条件转移 程序转移方向是设计者事先安排的,与已执行程序程序转移方向是设计者事先安排的,与已执行程序的结果无关,使用时只需给出正确的转移目标地址或偏的结果无关,使用时只需给出正确的转移目标地址或偏移量即可。移量即可。(LJMP(LJMP、AJMP AJMP、SJMP)SJMP)2 2、条件转移条件转移 根据已执行程序对标志位或根据已执行程序对标志位或A A或对内部
39、或对内部RAMRAM某位的影某位的影响结果,决定程序的走向,形成各种分支。响结果,决定程序的走向,形成各种分支。(JZ/JNZ(JZ/JNZ、CJNECJNE、DJNZDJNZ、位控制转移类指令、位控制转移类指令)在编写有条件转移语句时要特别注意以下两点:在编写有条件转移语句时要特别注意以下两点:(1)(1)在使用条件转移指令形成分支前,一定要安排可在使用条件转移指令形成分支前,一定要安排可供条件转移指令进行判别的条件。供条件转移指令进行判别的条件。4.3 4.3 分支结构程序分支结构程序例如,若采用例如,若采用“JC relJC rel”指令,在执行此指令前必指令,在执行此指令前必须使用影响
40、须使用影响CyCy标志的指令;若采用标志的指令;若采用“CJNE ACJNE A,#data#data,relrel”指令,在执行此指令前必须使用改变指令,在执行此指令前必须使用改变A A内容的指令,内容的指令,以便为测试做准备。以便为测试做准备。(2)(2)要正确选定所用的转移条件和转移目标地址。要正确选定所用的转移条件和转移目标地址。3 3、散转散转(JMP(JMPA+DPTR)A+DPTR)它是根据某种已输入的它是根据某种已输入的“或或”运算的结果,使程序运算的结果,使程序转向各个处理程序中去。转向各个处理程序中去。操作:操作:把把1616位位DPTRDPTR的内容与的内容与“或或”运算
41、的结果与在运算的结果与在A A中的中的8 8位无符号数相加,形成地址,装入位无符号数相加,形成地址,装入PCPC,即散转的目,即散转的目的地址。其操作结果不影响的地址。其操作结果不影响A A和和DPTRDPTR。(JMP)(JMP)4.3 4.3 分支结构程序分支结构程序二、无条件二、无条件/条件转移程序条件转移程序 分支程序中最常见的一类。其中,条件转移类程序分支程序中最常见的一类。其中,条件转移类程序编写较容易出错,编写时需要确定转移条件。编写较容易出错,编写时需要确定转移条件。例例4.134.13 两个无符号数比较大小。同两个无符号数比较大小。同P59P59页例页例4-74-7 解解 设
42、外部设外部RAMRAM存储单元存储单元ST1ST1和和ST2ST2中存放两个不带符中存放两个不带符号的二进制数,找出其中的大数存入号的二进制数,找出其中的大数存入ST3ST3单元中。单元中。4.3 4.3 分支结构程序分支结构程序图图4-3 4-3 两个无符号数比较大小程序框图两个无符号数比较大小程序框图 4.3 4.3 分支结构程序分支结构程序解:解:ORG 8000HORG 8000H ST1 EQU 8040H ST1 EQU 8040HSTARTSTART:CLR C CLR C ;进位位清;进位位清0 0 MOV DPTR MOV DPTR,#ST1#ST1 ;读数据指针;读数据指针
43、 MOVX AMOVX A,DPTR DPTR ;取第一个数;取第一个数 MOV R2MOV R2,A A ;暂存;暂存R2R2 INC DPTR INC DPTR MOVX A MOVX A,DPTR DPTR ;取第二个数;取第二个数 SUBB ASUBB A,R2 R2 ;两数比较;两数比较 JNC BIG1 JNC BIG1 ;若;若Cy=0Cy=0,则转,则转BIG1(BIG1(第二个数大第二个数大)4.3 4.3 分支结构程序分支结构程序 XCH A XCH A,R2 R2;第一个数大;第一个数大 BIG0BIG0:INC DPTRINC DPTR MOVX DPTR MOVX D
44、PTR,A A;存大数;存大数 RETRET BIG1 BIG1:MOVX AMOVX A,DPTR DPTR;第二个数大;第二个数大 SJMP BIG0SJMP BIG0 END END 上面程序中,应用带借位的减法指令上面程序中,应用带借位的减法指令SUBBSUBB比较两数比较两数的大小。在执行指令前,应先把进位位清的大小。在执行指令前,应先把进位位清“0”0”。执行。执行JNCJNC指令后形成分支,指令中指令后形成分支,指令中BIG1BIG1为标号地址,表示相对为标号地址,表示相对偏移量偏移量relrel。4.3 4.3 分支结构程序分支结构程序例例4.144.14 设设5AH5AH单元
45、中有一变量单元中有一变量X X,请编写计算下列函数式,请编写计算下列函数式的程序,结果存入的程序,结果存入5BH5BH单元。单元。同同P61P61页例页例4-8.4-8.4.3 4.3 分支结构程序分支结构程序图图4-4 4-4 例例4.64.6程序流程图程序流程图4.3 4.3 分支结构程序分支结构程序 解:解:根据题意首先计算根据题意首先计算X X2 2(使用乘法使用乘法)并暂存于并暂存于R1R1中,中,因为因为X X2 2最大值为最大值为225225,可只用一个寄存器,然后根据,可只用一个寄存器,然后根据X X值值的范围,决定的范围,决定Y Y的值。的值。R0R0作中间寄存器。作中间寄存
46、器。编程:编程:ORG 2000H ORG 2000H MOV AMOV A,5AH5AH MOV B MOV B,A A MUL AB MUL AB ;AXAX2 2 MOV R1 MOV R1,A A MOV A MOV A,5AH 5AH ;重新把;重新把X X装入装入A A CJNE A CJNE A,#10#10,L1L14.3 4.3 分支结构程序分支结构程序L1L1:JC L2 JC L2 ;C=1C=1,X X1010转转L2L2MOV R0MOV R0,#41#41;先假设;先假设X X1515 CJNE A CJNE A,#10H#10H,L3 L3;与;与1616比较比较
47、 L3L3:JNC L4 JNC L4;C=0C=0,X X1515转转L4L4 MOV A MOV A,R1R1 ADD A ADD A,#8#8;10X1510X15,Y=XY=X2 2+8+8 MOV R0 MOV R0,AA SJMP L4 SJMP L4 L2 L2:MOV AMOV A,R1R1CLR CCLR CSUBB ASUBB A,#01#01 ;X X1010,Y=XY=X2 2-1-14.3 4.3 分支结构程序分支结构程序 MOV R0 MOV R0,AA L4 L4:MOV 5BHMOV 5BH,R0 R0;存结果;存结果 SJMP$SJMP$END END 由于本
48、题的具体情况,在判别由于本题的具体情况,在判别(A)(A)1010和和(A)(A)1515时时采用的是采用的是“CJNE”CJNE”和和“JC”JC”以及以及“CJNE”CJNE”和和“JNC”JNC”两条两条指令相结合的方法。指令相结合的方法。条件分支程序与简单程序的区别在于:条件分支程序与简单程序的区别在于:分支程序存分支程序存在两个或两个以上的结果。要根据给定的条件进行判断,在两个或两个以上的结果。要根据给定的条件进行判断,以得到某一个结果。这样,就要用到比较命令、测试指以得到某一个结果。这样,就要用到比较命令、测试指令以及无条件令以及无条件/条件转移指令。条件转移指令。条件分支程序设计
49、条件分支程序设计 的技的技巧,就在于正确而巧妙地使用这些命令。巧,就在于正确而巧妙地使用这些命令。4.3 4.3 分支结构程序分支结构程序例题:例题:求符号函数的值。已知片内求符号函数的值。已知片内RAMRAM的的40H40H单元内有一单元内有一自变量自变量X X,编制程序按如下条件求函数,编制程序按如下条件求函数Y Y的值,并将其存入的值,并将其存入片内片内RAMRAM的的41H41H单元中。单元中。1 1 X0X0Y=0 Y=0 X=0 X=0 -1-1X0X255s255,因此单重循环程序无法实现,可采用,因此单重循环程序无法实现,可采用双重循环的方法编写双重循环的方法编写50ms50m
50、s延时程序。延时程序。程序如下:程序如下:ORG 1000H DELAY:MOV R7,#200 ;设置外循环次数(此条指令需要设置外循环次数(此条指令需要1个个机器周期)机器周期)DLY1:MOV R6,#123 ;设置内循环次数设置内循环次数 DLY2:DJNZ R6,DLY2 ;(R6)1=0,则顺序执行,否则转,则顺序执行,否则转回回DLY2继续循环,延时时间为继续循环,延时时间为2 s123=246 s NOP ;延时时间为延时时间为1 s DJNZ R7,DLY1 ;(R7)1=0,则顺序执行,否则转,则顺序执行,否则转回回DLY1继续循环,延时时间为继续循环,延时时间为(2462