《03程序设计(精品).ppt》由会员分享,可在线阅读,更多相关《03程序设计(精品).ppt(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第三章第三章MCS-51单片机汇编语言单片机汇编语言程序设计程序设计3.1概述概述MCS-51单单片片机机的的编编程程语语言言可可以以是是汇汇编编语语言言也也可可以以是是高高级级语语言言(如如C语语言言),高高级级语语言言编编程程快快捷捷,但但程程序序长长,占占用用存存储储空空间间大大,执执行行慢慢;汇汇编编语语言言产产生生的的目目标标程程序序简简短短,占占用用存存储储空空间间小小,执执行行快快,能能充充分分发发挥挥计计算算机机的的硬硬件件功功能能。无无论论是是高高级级语语言言还还是是汇汇编编语语言言,源源程程序序都都要要转转换成目标程序(机器语言)单片机才能执行。换成目标程序(机器语言)单片
2、机才能执行。支支持持写写入入单单片片机机或或仿仿真真调调试试的的目目标标程程序序有有两两种种文文件格式:件格式:BIN文件和文件和HEX文件,文件,BIN文文件件是是由由编编译译器器生生成成的的二二进进制制文文件件,是是程程序的机器码,序的机器码,HEX文文件件是是由由INTER公公司司定定义义的的一一种种格格式式,这这种种格格式式包包括括地地址址、数数据据和和校校验验码码,并并用用ASCII码码来来存存储储,可可供供显显示示和和打打印印。HEX文文件件需需通通过符号转换程序过符号转换程序OHS51进行转换进行转换两种语言的操作过程见图两种语言的操作过程见图3-1。连接连接/定位器定位器L51
3、汇编语言汇编语言源程序源程序汇编器汇编器A51符号转换程序符号转换程序OHS51绝对地址绝对地址目标程序目标程序.BINC语言程序语言程序浮浮动动地地址址目目标标程程序序编译器编译器C51HEX图图3-1两种语言源程序转换成目标程序两种语言源程序转换成目标程序目目前前很很多多公公司司将将编编辑辑器器、汇汇编编器器、编编译译器器、连连接接/定定位位器器、符符号号转转换换程程序序做做成成集集成成软软件件包包,用用户户进进入入该该集集成成环环境境,编编辑辑好好程程序序后后,只只需需点点击击相相应应菜菜单单就可以完成上述的各步,如就可以完成上述的各步,如WAVE、KEIL,WAVE集成软件的使用见附录
4、集成软件的使用见附录。汇汇编编:将将汇汇编编语语言言源源程程序序转转换换成成机机器器语语言言目目标标程序的过程称为汇编。程序的过程称为汇编。汇汇编编程程序序:能能将将汇汇编编语语言言源源程程序序转转换换成成机机器器语语言言目标目标程序的系统软件称为汇编程序。程序的系统软件称为汇编程序。汇编的方法:汇编的方法有两种汇编的方法:汇编的方法有两种1.手工汇编:手工汇编:人工查指令表,查出程序中每条指令对应的机器人工查指令表,查出程序中每条指令对应的机器代码。早期的计算机使用。代码。早期的计算机使用。2.机器汇编:机器汇编:用计算机中的汇编程序对用户源程序进行汇编。用计算机中的汇编程序对用户源程序进行
5、汇编。用机器汇编要提供给汇编一些信息,遵循汇编程序用机器汇编要提供给汇编一些信息,遵循汇编程序的一些约定。这些由伪指令指定。的一些约定。这些由伪指令指定。1)确定程序中每条汇编语言指令的指令机器码确定程序中每条汇编语言指令的指令机器码2)确定每条指令在存储器中的存放地址确定每条指令在存储器中的存放地址3)提供错误信息提供错误信息4)提供目标执行文件提供目标执行文件(*.OBJ/*.HEX)和列表文件和列表文件(*.LST)地址地址机器码机器码源程序源程序ORG 2000H2000H7830 MAIN:MOVR0,#30H2002HE6MOVA,R0汇编的主要任务:汇编的主要任务:1.机器指令:
6、指令系统中的全部指令。每条机器机器指令:指令系统中的全部指令。每条机器指令都有对应的机器代码,可以被指令都有对应的机器代码,可以被CPU执行。执行。2.伪指令:伪指令:汇编控制指令,没有指令代码,只用汇编控制指令,没有指令代码,只用于汇编过程,为汇编程序提供汇编信息。于汇编过程,为汇编程序提供汇编信息。一一.汇编语言指令类型汇编语言指令类型3 3.宏指令宏指令 宏汇编功能:将需要反复多次执行的程序段定义宏汇编功能:将需要反复多次执行的程序段定义成一个宏指令名(宏定义)。编程时,可在程序中成一个宏指令名(宏定义)。编程时,可在程序中使用宏指令名来替代被定义的程序段(宏调用)。使用宏指令名来替代被
7、定义的程序段(宏调用)。宏定义过程宏定义过程:宏调用过程:宏调用过程:宏指令名宏指令名 实际参数实际参数 宏指令名宏指令名 实际参数实际参数宏指令名宏指令名 MACRO 形式参数形式参数 ;被定义的程序段;被定义的程序段 ENDM二伪指令二伪指令常用伪指令及功能:常用伪指令及功能:1.起始指令起始指令ORGnn功能:定义程序或数据块的起始地址。功能:定义程序或数据块的起始地址。指示此语句后指示此语句后面的程序或数据块以面的程序或数据块以nn为起始地址,连续存放在程序为起始地址,连续存放在程序存储器中。存储器中。指令地址指令地址机器码机器码源程序源程序ORG 2000H2000H7830 MAI
8、N:MOVR0,#30H2002HE6MOVA,R0ORG3000H3000H23TAB:DB23H,100,A3001H643002H412.字节定义字节定义标号:标号:DB(字节常数,或字符或表达式)(字节常数,或字符或表达式)功能:功能:指示在程序存储器中以标号指示在程序存储器中以标号为起始地址的单元里存放的数为为起始地址的单元里存放的数为字节数据(八位二进制数)。字节数据(八位二进制数)。例如例如LN:DB32,C,25H,-1;LNLN+2地址单元依次存放地址单元依次存放20H,43H,25H,FFH地址地址 数据数据LN20LN+143LN+225LN+3FF3.字定义字定义标号:
9、标号:DW(字常数或表达式)字常数或表达式)作用:作用:指示在程序存储器中以标号为指示在程序存储器中以标号为起始地址的单元里存放的数为字数据起始地址的单元里存放的数为字数据(即(即16位的二进制数),例如:位的二进制数),例如:GH:DW1234H,5678H,08GH1234GH+25678GH+400085.等值指令等值指令标号标号EQU(数值表达式)(数值表达式)表示表示EQU两边的量等值,用于为标号或标识符赋值。两边的量等值,用于为标号或标识符赋值。例如:例如:X1EQU2000HX2EQU0FHMAIN:MOVDPTR,#X1;DPTR=2000HADDA,#X2;A=A+0FH4保
10、留字节保留字节标号:标号:DS(数值表达式)数值表达式)作用:作用:指示在程序存储器中保留以标号为起始地指示在程序存储器中保留以标号为起始地址的若干字节单元,其单元个数由数值表达式指定。址的若干字节单元,其单元个数由数值表达式指定。例如例如L1:DS32;从从L1地址开始保留地址开始保留32个存储单元。个存储单元。6.位定义位定义标号标号BIT 位地址位地址 作用:作用:同同EQU指令,不过定义的是位操作地址。指令,不过定义的是位操作地址。例如例如AICBITP1.1。7.汇编结束汇编结束 END作用:作用:指示源程序段结束。指示源程序段结束。END指令放在程序的最后。指令放在程序的最后。A5
11、1汇编程序还有一些其它的伪指令,列在教材表汇编程序还有一些其它的伪指令,列在教材表3-1中,中,以备查阅。以备查阅。4-2 4-2 汇编语言程序设计步骤汇编语言程序设计步骤一一.确定方案和计算方法确定方案和计算方法二二.了解应用系统的硬件配置、性能指标了解应用系统的硬件配置、性能指标三三.建立系统数学模型,确定控制算法和操作步骤建立系统数学模型,确定控制算法和操作步骤四四.合理分配存储器单元和了解合理分配存储器单元和了解I/O接口地址接口地址五五.编制源程序编制源程序1.按功能设计程序,明确各程序之按功能设计程序,明确各程序之间的相互关系间的相互关系2.用流程图表示程序结构和功能用流程图表示程
12、序结构和功能开始开始1YN?3.程序中用注释说明指令在程序中程序中用注释说明指令在程序中的作用,方便阅读、调试和修改的作用,方便阅读、调试和修改顺序程序设计顺序程序设计例例3-1编程将外部数据存储编程将外部数据存储器的器的000EH和和000FH单单元的内容相换。元的内容相换。常用程序结构常用程序结构顺序程序、分支程序、顺序程序、分支程序、循环程序、子程序循环程序、子程序000EH000FH000EH000FH000EH000FH000EH000FH分析分析:外部数据存储器的数据操外部数据存储器的数据操作只能用作只能用MOVX指令,且只能指令,且只能和和A之间传送,因此必须用一个之间传送,因此
13、必须用一个中间环节作暂存,设用中间环节作暂存,设用20H单元。单元。用用R0、R1指示两单元的低八位指示两单元的低八位地址,高八位地址由地址,高八位地址由P2指示。指示。编程过程如下:编程过程如下:000EH000FH000EH000FH000EH000FHORG0000HMOVP2,#0H;送地址高八位至送地址高八位至P2口口MOVR0,#0EH;R0=0EHMOVR1,#0FH;R1=OFHMOVXA,R0;A=(000EH)MOV20H,A;(20H)=(000EH)MOVXA,R1;A=(000FH)XCHA,20H;A=(000EH),(20H)=(000FH)MOVXR1,AMOV
14、A,20HMOVXR0,A;交换后的数送各单元交换后的数送各单元SJMP$END4-3顺序程序顺序程序顺序程序顺序程序(简单程序简单程序),程序走向只有一条路径,程序走向只有一条路径例例3-2:将:将R4R5双字节符号数求补程序。双字节符号数求补程序。ORG0000HMOVA,R5;取低字节取低字节CPLAADDA,#1;低字节变补低字节变补MOVR5,AMOVA,R4;取高字节取高字节CPLAADDCA,#0;高字节变补高字节变补ORLA,#80H;恢复负号恢复负号MOVR4,AEND例例3-3分解压缩式分解压缩式BCD码码,使其成为非压缩式使其成为非压缩式BCD码。码。ORG0000HMO
15、VR0,#40H;设指针设指针MOVA,R0;取一个字节取一个字节MOVR2,A;暂存暂存ANL A,#0FH;清清0高半字节高半字节INC R0MOVR0,A;保存数据个位保存数据个位片内片内RAM42H41H40H65MOVA,R2SWAPA;十位换到低半字节十位换到低半字节ANL A,#0FHINC R0MOVR0,A;保存数据十位保存数据十位END05050606地址数据TAB0TAB+1 1TAB+2 4TAB+3 9TAB+4 16HTAB+5 25H例例3-5设变量放在片内设变量放在片内RAM的的20H单元单元,其值为其值为00H05H之间之间,要求编查表程序要求编查表程序,查出
16、变量的平方值查出变量的平方值,并放入片内并放入片内RAM的的21H单元。单元。ORG0000HMOVDPTR,#TABMOVA,20HMOVCA,A+DPTR;查表查表MOV21H,ASJMP$TAB2:DB00H,01H,04H,09H,16H,25HEND分析分析:在程序存储器安排一张平方表,首地址为:在程序存储器安排一张平方表,首地址为TAB,以以DPTR指向表首址,指向表首址,A存放变量值,利用查表指令存放变量值,利用查表指令MOVCA,A+DPTR,即可求得。,即可求得。表中数据用表中数据用BCD码存放合乎人们的习惯码存放合乎人们的习惯.如果平方值为两个字节,程序应如何编。如果平方值
17、为两个字节,程序应如何编。DPTRA ORG 0000HORG 0000HMOVA,R2 JNBACC.7,N;为正数?;为正数?CPLA;负数变补;负数变补 INCA MOVR2,AN:SJMP$;结束;结束3.4 3.4 分支程序的设计分支程序的设计由条件转移指令构成程序判断框部分由条件转移指令构成程序判断框部分,形成分支结构形成分支结构3.5.1 3.5.1 单分支程序单分支程序一个判断决策框,两种分支结构图。一个判断决策框,两种分支结构图。条件满足条件满足?N影响条件影响条件Y处理段处理段条件满足条件满足?N影响条件影响条件Y处理处理1处理处理2例例1 1 求求8 8位有符号数的绝对值
18、。位有符号数的绝对值。方法:正数不变,负数变补方法:正数不变,负数变补例例2用单片机加重力传感器作磅秤,秤出重量后算出用单片机加重力传感器作磅秤,秤出重量后算出行李运费价格,其秤出的重量以行李运费价格,其秤出的重量以10kg为为1个计价单位个计价单位G,G已存入已存入40H单元。计价方法单元。计价方法为为50kg以内按以内按3元元,50kg以上以上分段计价分段计价:50kg按按3元计价元计价,超过部分按,超过部分按2元计价。元计价。由此列出算式:由此列出算式:G3+(G-5)2;当当G5M=G3;当;当G53G因重复使用,先暂存在因重复使用,先暂存在R2。流程见左流程见左,程序如下:程序如下:
19、ORG0100HFRT:MOVA,40H;取行李重量计价单位取行李重量计价单位GMOVR3,AMOVB,#03H;运费运费M=G3MULABMOVR2,A;暂存;暂存3GMOVA,R3;取回;取回GCJNEA,#05H,L1;G5?SJMPWETCL1:JC WETC;是,转至;是,转至WETCSUBBA,#05H;否则;否则M=3G+2(G-5)RLCAADDA,R2MOVR2,AWETC:MOV41H,R2;存运费;存运费MRET多分支散转程序的设计多分支散转程序的设计有一类分支程序有一类分支程序,它根据不同的输入条件或它根据不同的输入条件或不同的运算结果不同的运算结果,转向不同的处理程序
20、转向不同的处理程序,称之为称之为散转程序。这类程序通常利用散转程序。这类程序通常利用JMPA+DPTR间接转移指令实现转移。有如下两种设计方法:间接转移指令实现转移。有如下两种设计方法:1.查转移地址表查转移地址表:将将转移地址转移地址列成表格,将表格的内容作转移列成表格,将表格的内容作转移的目标地址。的目标地址。2.查转移指令表查转移指令表:将转移到不同程序的将转移到不同程序的转移指令转移指令列成表格,列成表格,判断条件后查表,转到表中指令执行判断条件后查表,转到表中指令执行,下面用两下面用两个例子说明。个例子说明。1.利用转移地址表实现转移利用转移地址表实现转移例例3-7根据根据R3的内容
21、转向对应的程序,的内容转向对应的程序,R3的内容为的内容为0n,处理程序的入口符号地址分别为处理程序的入口符号地址分别为PR0PRn(n128)。分析:将分析:将PR0PRn入口地址列在表格中,每一项占两个入口地址列在表格中,每一项占两个单元,单元,PRn在表中的偏移量为在表中的偏移量为2n,因此将,因此将R3的内容乘的内容乘2即得即得PRn在表中的偏移地址,从偏移地址在表中的偏移地址,从偏移地址2n和和2n+1两个两个单元分别取出单元分别取出PRn的高八位地址和低八位地址送的高八位地址和低八位地址送DPTR寄存器,用寄存器,用JMPA+DPTR指令(指令(A先清零)即转移到先清零)即转移到P
22、Rn入口执行。入口执行。这里设这里设PR0-PRn地址地址PR0 EQU0110H;用伪指令定义用伪指令定义PRn的具体地址的具体地址PR1EQU0220H PR2EQU0330HORG 0000HMOV A,R3 ;R3AADD A,ACC ;A*2MOV DPTR,#TABPUSH ACCMOVC A,A+DPTR;取地址表中高字节MOV B,A ;暂存于BINC DPLPOP ACCMOVC A,A+DPTR;取地址表中低字节MOV DPL,AMOV DPH,B ;DPTR为表中地址CLR A ;A=0JMP A+DPTR ;转移TAB:DW PR0,PR1,PR2,.,PRn;转移地址
23、表END01100220.TABTAB+2DPHDPL例如例如R3=1的操作的操作02202.利用转移指令表实现转移利用转移指令表实现转移 例例3-8设有五个按键设有五个按键0、1、2、3、4其编码分别为其编码分别为3AH、47H、65H、70H、8BH,要求根据按下的键转向不同的处理程序,分,要求根据按下的键转向不同的处理程序,分别为别为PR0、PR1、PR2、PR3、PR4,设按键的编码已在,设按键的编码已在B寄存寄存器中,编出程序。器中,编出程序。分析分析:将键码排成表,将键码表中的值和将键码排成表,将键码表中的值和B中的键编码比对,记下中的键编码比对,记下在键码表中和在键码表中和B中的
24、键编码相等的序号,另安排一个转移表中的键编码相等的序号,另安排一个转移表,安排安排AJMP指令指令(机器码机器码),因每条,因每条AJMP指令占二字节,将刚才记下的指令占二字节,将刚才记下的序号乘序号乘2即为转移表的偏移地址,利用即为转移表的偏移地址,利用JMPA+DPTR执行表内的执行表内的AJMP指令,从而实现多分支转移,指令,从而实现多分支转移,设设JPT的地址为的地址为001AH、PR0入口地址为入口地址为0110H、,参考,参考2.4.2节,节,求求AJMPPR0的机器码的机器码0000000100010000001000010000(2110h)a10a9a8a7a6a5a4a3a
25、2a1a0AJMPPR0的机器码为的机器码为2110H,PR1入口地址为入口地址为0220HAJMPPR1的机器码为的机器码为4120H,转移指令表转移指令表JPT的内容如下所示。设的内容如下所示。设B=65H,键值为键值为2:2041JPT+42002JPT+21021JPTAJMP PR0AJMP PR1AJMP PR2TAB3AHTAB+147HTAB+265HTAB+370H转移指令表转移指令表JPT键码表键码表TAB65HA2B2AA=1A=2A=065H65HORG0000HMOVDPTR,#TAB;置键码表首址置键码表首址MOVA,#0;表的起始位的偏移量为表的起始位的偏移量为0
26、NEXT:PUSHACCMOVCA,A+DPTR;A=键码表的编码键码表的编码CJNEA,B,AGAN;将将B中值和键码表的值比较中值和键码表的值比较POPACCRLA;如相等如相等,序号乘序号乘2得分支表内偏移得分支表内偏移量量MOVDPTR,#JPT;置分支表首址置分支表首址JMPA+DPTRAGAN:POPACC;不相等比较下一个不相等比较下一个INCA;序号加序号加1CJNEA,#5,NEXTSJMP$;键码查完还没有键码查完还没有B中按键编码程序结束中按键编码程序结束JPT:AJMPPR0;分支转移表分支转移表AJMPPR1AJMPPR2AJMPPR3AJMPPR4TAB:DB3AH
27、,47H,65H,70H,8BH;键码表键码表END当程序中的某些指令需要反复执行多次时,采用循当程序中的某些指令需要反复执行多次时,采用循环程序的方式,这样会使程序缩短,节省存储单元(并不环程序的方式,这样会使程序缩短,节省存储单元(并不节省执行时间)。节省执行时间)。循环次数的控制,有两种控制方式循环次数的控制,有两种控制方式:第一种方法第一种方法先判断再处理即先判断满不满足循环条件,如不满足,就先判断再处理即先判断满不满足循环条件,如不满足,就不循环,多以循环条件控制。不循环,多以循环条件控制。第二种方法第二种方法先处理再判断,即循环执行一遍后,下一轮还需不需要进先处理再判断,即循环执行
28、一遍后,下一轮还需不需要进行,多以计循环次数控制。循环可以有单重循环和多重循行,多以计循环次数控制。循环可以有单重循环和多重循环,在多重循环中,内外循环不能交叉,也不允许外循环环,在多重循环中,内外循环不能交叉,也不允许外循环跳入内循环。下面通过几个实例说明循环程序的设计方法。跳入内循环。下面通过几个实例说明循环程序的设计方法。3.5循循环环程程序序设设计计例例3-9设计一个延时设计一个延时10ms的延时子程序,已知单片的延时子程序,已知单片机使用的晶振为机使用的晶振为6MHz。分析分析延时时间与两个因素有关延时时间与两个因素有关:晶振频率和循环晶振频率和循环次数。由于晶振采用次数。由于晶振采
29、用6MHz,一个机器周期是,一个机器周期是2s,用单循环可以实现,用单循环可以实现1ms延时,外循环延时,外循环10次即可次即可达达10ms延时。延时。内循环如何实现内循环如何实现1ms延时呢,程序中可先以延时呢,程序中可先以未知数未知数MT代替,从附录代替,从附录A查每条指令机器周期查每条指令机器周期计算程序的执行时间。计算程序的执行时间。ORG0020HMOVR0,#0AH;外循环;外循环10次次DL2:MOVR1,#MT;内循环;内循环MT次次DL1:NOPNOP;空操作指令;空操作指令DJNZR1,DL1DJNZR0,DL2RET111122内循环内循环DL1到指令到指令DJNZR1,
30、DL1的计算:的计算:(1+1+2)2SMT=1000SMT=125=7DH将将7DH代入上面程序的代入上面程序的MT,计算总的延时时间:,计算总的延时时间:1+1+(1+1+2)125+28102S=10062S=10.062mS若需要延时更长时间,可以采用多重循环。若需要延时更长时间,可以采用多重循环。机器周期数机器周期数内内外外例例3-10编写多字节数编写多字节数10程序。程序。内部内部RAM以以20H为首址的一片单元中存放着为首址的一片单元中存放着一个多字节符号数,字节数存放在一个多字节符号数,字节数存放在R7中,存放方中,存放方式为低位字节在低地址,高位字节在高地址,要求式为低位字节
31、在低地址,高位字节在高地址,要求乘乘10后的积仍存放在这一片单元中。后的积仍存放在这一片单元中。分析分析用用R1作该多字节的作该多字节的地址指针,部分积的低位仍地址指针,部分积的低位仍存放于本单元,部分积的高存放于本单元,部分积的高位存放于位存放于R2,以便和下一,以便和下一位的部分积的低位相加。位的部分积的低位相加。以以R7作字节数计数。作字节数计数。编程如下:编程如下:345H0AH32H28H2BH1EH20BHORG0000HCLRC;清进位位;清进位位CMOVR1,#20H;R1指示地址指示地址MOVR2,#00H;存积的高八位寄存器;存积的高八位寄存器R2清清0S10:MOVA,R
32、1;取一字节送;取一字节送AMOVB,#0AH;10送送BPUSHPSWMULAB;字节乘;字节乘10POPPSWADDCA,R2;上次积高八位加本次积低八位;上次积高八位加本次积低八位MOVR1,A;送原存储单元;送原存储单元MOVR2,B;积的高八位送;积的高八位送R2INCR1;指向下一字节;指向下一字节DJNZR7,S10;未乘完去;未乘完去SH10,否则向下执行,否则向下执行MOVR1,B;存最高字节积的高位;存最高字节积的高位SJMP$例如例如1223650989比较大小比较大小不交换不交换(0)12236509191223650919交换交换(1)1223096519不交换不交换
33、(0)交换交换(1)12236509191223091965最大最大交换交换(1)不交换不交换(0)12230919651209231965交换交换(1)1209192365不交换不交换(0)交换交换(1)12230919651209192365最大最大12091923650912192365091219236509121923650912192365MCS-51单片机有着优异的位逻辑功能单片机有着优异的位逻辑功能,可以可以方便的实现各种复杂的逻辑运算方便的实现各种复杂的逻辑运算.这种用软件替这种用软件替代硬件的方法代硬件的方法,可以大大简化甚至完全不用硬件可以大大简化甚至完全不用硬件,但比硬
34、件要多花运算时间。但比硬件要多花运算时间。例例3-17编写一程序编写一程序,以实现图以实现图3-7中的逻辑运算电路中的逻辑运算电路.3.6位操作程序设计位操作程序设计其中其中P1.1和和P2.2分别是端口线上的信息分别是端口线上的信息,TF0和和IE1分别是定时器定时溢出标志和外部中请求标志分别是定时器定时溢出标志和外部中请求标志,25H和和26H分别是两个位地址分别是两个位地址,运算结果由端口线运算结果由端口线P1.3输出。输出。.图图3-4硬件逻辑运算电路硬件逻辑运算电路程序如下:程序如下:START:MOVC,P2.2ORLC,TF0ANLC,P1.1MOVF0,CMOVC,IE1ORL
35、C,/25HANLC,F0ANLC,/26HMOVP1.3,CSJMP$例例3-18 设累加器A的各位ACC.0ACC.7分别记为X0X7,编制程序用软件实现下式:Y=X0X1X2+X0X1X2+X0X1X2X3+X4X5X6X7 X0 BIT ACC.0 X1 BIT ACC.1 X2 BIT ACC.2 X3 BIT ACC.3 X4 BIT ACC.4 X5 BIT ACC.5 X6 BIT ACC.6 X7 BIT ACC.7 ORG 0000H MOV C,X0ANL C,X1ANL C,X2MOV 00H,C ;X0X1X2MOV C,X0ANL C,/X1 MOV 01H,C ;
36、X0X1ANL C,/X2ORL C,00HMOV 00H,C MOV C,X2ANL C,01H ANL C,X3 ;X0X1X2X3 ORL C,/00H MOV 00H,C MOV C,X7ANL C,/X6ANL C,/X5ANL C,/X4 ;X4 X5 X6 X7ORL C,00H ;最终结果 YC SJMP$子程序是构成单片机应用程序必不可少的部子程序是构成单片机应用程序必不可少的部分,通过分,通过ACALL和和LCALL两条子程序调用指令,两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。可以十分方便地用来调用任何地址处的子程序。子程序节省占用的存储单元,使程序简短
37、、子程序节省占用的存储单元,使程序简短、清晰,善于灵活的使用子程序,是程序设计的重清晰,善于灵活的使用子程序,是程序设计的重要技巧之一。要技巧之一。子程序必须以子程序必须以RET指令结尾指令结尾.在调用子程序时,有以下几点应注意:在调用子程序时,有以下几点应注意:3.7子程序子程序当一段程序需多次应用当一段程序需多次应用,或为多人应用时或为多人应用时,这这段程序编为子程序段程序编为子程序.1)保护现场。)保护现场。如果在调用前主程序已经使用了某些存储单元或寄存如果在调用前主程序已经使用了某些存储单元或寄存器,在调用时,这些寄存器和存储单元又有其他用途,器,在调用时,这些寄存器和存储单元又有其他
38、用途,就应先把这些单元或寄存器中的内容压入堆栈保护,调就应先把这些单元或寄存器中的内容压入堆栈保护,调用完后再从堆栈中弹出以便加以恢复。如果有较多的寄用完后再从堆栈中弹出以便加以恢复。如果有较多的寄存器要保护,应使主、子程序使用不同的寄存器组。存器要保护,应使主、子程序使用不同的寄存器组。2)设置入口参数和出口参数。)设置入口参数和出口参数。用之前主程序要按子程序的要求设置好地址单元或存用之前主程序要按子程序的要求设置好地址单元或存储器(称为入口参数),以便子程序从指定的地址单元储器(称为入口参数),以便子程序从指定的地址单元或存储器获得输入数据;或存储器获得输入数据;子程序经运算或处理后的结
39、果存放到指定的地址单元子程序经运算或处理后的结果存放到指定的地址单元或寄存器(称为出口参数),主程序调用后从指定的地或寄存器(称为出口参数),主程序调用后从指定的地址单元或寄存器读取运算或处理后的结果,只有这样,址单元或寄存器读取运算或处理后的结果,只有这样,才能完成子程序和主程序间的数据的正确传递。才能完成子程序和主程序间的数据的正确传递。3)子程序中可包括对另外子程序的调用,称为)子程序中可包括对另外子程序的调用,称为子程序嵌套。子程序嵌套。例例3-19用程序实现用程序实现c=a2+b2,设,设a,b均小于均小于10。a存放在存放在31H单元,单元,b存放在存放在32H单元,把单元,把c存
40、入存入34H和和33H单元。(和要求为单元。(和要求为BCD码)。码)。解:因该算式两次用到平方值,所以在程序中解:因该算式两次用到平方值,所以在程序中采用把求平方编为子程序的方法。求平方采用查表采用把求平方编为子程序的方法。求平方采用查表法法,主程序和子程序编写如下:主程序和子程序编写如下:主程序:主程序:ORG0000HMOVSP,#3FHMOVA,31H;取;取aLCALLSQR;求求a方方MOVR1,AMOVA,32H;取;取bLCALLSQR;求求b方方ADDA,R1;求和求和DAA;调整;调整MOV33H,AMOVA,#0ADDCA,0MOV34H,ASJMP$子程序:子程序:OR
41、G0030HSQR:INCAMOVCA,A+PCRETTAB:DB00H,01H,04HDB09H16H,25H,DB36H,49H64H,81HEND3.8小小结结1、程序设计的关键在于指令熟悉和算法、程序设计的关键在于指令熟悉和算法(思路思路)正确、清晰,对复杂的程序应先画出流程图。只正确、清晰,对复杂的程序应先画出流程图。只有多做练习多上机调试,熟能生巧,才能编出高有多做练习多上机调试,熟能生巧,才能编出高质量的程序。质量的程序。2、伪指令是非执行指令,提供汇编程序以汇编、伪指令是非执行指令,提供汇编程序以汇编信息,应正确使用。信息,应正确使用。3、本章应掌握顺序程序、分支程序、循环程序、本章应掌握顺序程序、分支程序、循环程序、子程序等各类程序的设计方法,并能熟练应用查子程序等各类程序的设计方法,并能熟练应用查表技术简化程序的设计。表技术简化程序的设计。