《第四章汇编语言程序设计春精选PPT.ppt》由会员分享,可在线阅读,更多相关《第四章汇编语言程序设计春精选PPT.ppt(88页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第四章 汇编语言程序设计春第1页,此课件共88页哦 4.1.1 程序的设计步骤与方法程序的设计步骤与方法 汇编和高级语言程序设计的过程:汇编和高级语言程序设计的过程:首首先先对对问问题题进进行行分分析析,然然后后确确定定算算法法,再再根根据据算算法法流流程编写程序,最后是调试程序。程编写程序,最后是调试程序。汇编语言程序设计的汇编语言程序设计的独特点独特点在于:在于:(1)用用汇汇编编语语言言进进行行程程序序设设计计时时,对对数数据据的的存存放放、寄寄存存器器和和工工作作单单元元的的使使用用等等要要由由设设计计者者安安排排。而而高高级级语语言言程程序序设设计计时时,这这些些工工作都由计算机软件
2、安排,程序设计者不必考虑。作都由计算机软件安排,程序设计者不必考虑。第2页,此课件共88页哦(2)汇编语言程序设计要求设计人员必须对所使用的汇编语言程序设计要求设计人员必须对所使用的计计算机的硬件结构有较为详细的了解算机的硬件结构有较为详细的了解。特别是对。特别是对各类寄存器、各类寄存器、端口、定时器端口、定时器/计数器、中断等计数器、中断等内容要熟悉,以便在程序设内容要熟悉,以便在程序设计时能熟练使用。计时能熟练使用。第3页,此课件共88页哦汇编语言程序的设计步骤:汇编语言程序的设计步骤:(1)分析问题,抽象出描述问题的数学模型)分析问题,抽象出描述问题的数学模型(2)确定解决问题的算法)确
3、定解决问题的算法(3)分配存储空间及工作单元)分配存储空间及工作单元(4)根据算法绘制流程图)根据算法绘制流程图(5)编写源程序)编写源程序(6)上机调试)上机调试第4页,此课件共88页哦程序质量的判断标准:程序质量的判断标准:程序的执行时间短;占用的内存单元少;程序的语句行数少。程序的执行时间短;占用的内存单元少;程序的语句行数少。第5页,此课件共88页哦4.1.2 汇编语言源程序的编辑和汇编汇编语言源程序的编辑和汇编1.汇编语言源程序的编辑汇编语言源程序的编辑编辑好的源程序应以“.ASM”扩展名存盘 2.汇编语言源程序的汇编汇编语言源程序的汇编源程序经机器汇编之后,若无语法错误,一般将生成
4、两个新文件,它们的扩展名分别是.OBJ和.LST。第6页,此课件共88页哦例例4-1 将内部将内部RAM从从30H开始的开始的10个单元的内容相加,个单元的内容相加,其和保存于其和保存于A(假设其和仍为(假设其和仍为8位数)。位数)。列表文件(列表文件(.LST)信息如下:)信息如下:地址地址 机器码机器码汇编语言源程序汇编语言源程序 注释注释 ORG2000H ;定义程序起始地址;定义程序起始地址2000 7830 START:MOVR0,#30H;初始地址送;初始地址送R02002 7A0A MOVR2,#10;循环初始值送;循环初始值送R22004 7400 MOVA,#00H;累加和初
5、始值送;累加和初始值送A2006 26 LOOP:ADDCA,R0;完成累加;完成累加2007 08 INCR0 ;修改地址;修改地址2008 DAFC DJNZR2,LOOP;循环判断;循环判断200A 80FE SJMP$;暂停;暂停 END ;程序结束;程序结束INCLUDE IN HASHTABSTART:2000LOOP:2006目标文件(目标文件(.OBJ)信息如下:)信息如下:2000200C78307A0A74002608DAFC80FE 第7页,此课件共88页哦4.2 4.2 汇编语言源程序的基本结构汇编语言源程序的基本结构共有四种结构形式:共有四种结构形式:顺序结构、循环结
6、构、分支结构和子程顺序结构、循环结构、分支结构和子程序结构。序结构。第8页,此课件共88页哦方方法法一一:用用逻逻辑辑指指令令将将高高、低低半半字字节节分分开开,对对数数字字09加加上上30H即即可可得得到到所所对对应应的的ASCII码码30H39H。ORG2000HMOVA,40H;取数;取数ANLA,#0FH;分离出低半字节;分离出低半字节ADDA,#30H;变为;变为ASCII码码MOV42H,A;保存;保存MOVA,40H;重新取数;重新取数SWAPA;高、低半字节交换;高、低半字节交换ANLA,#0FH;分离出高半字节;分离出高半字节 ADDA,#30H;变为变为ASCII码码MOV
7、41H,A;保存;保存END例例4-2 将将40H单元的高、低半字节的两个单元的高、低半字节的两个BCD码拆开并变成其码拆开并变成其ASCII码,并分别存入码,并分别存入41H和和42H单元单元 4.2.1 4.2.1 顺序结构顺序结构第9页,此课件共88页哦方法二:采用方法二:采用BCD数除以数除以10H的方法,可把处于高、低半字节的两个的方法,可把处于高、低半字节的两个BCD码分别移到码分别移到A和和B的低的低4位,然后再各自与位,然后再各自与30H相相“或或”即变为即变为ASCII码。参考程序如下:码。参考程序如下:ORG2000HMOVA,40H;取数;取数MOVB,#10H;送被除数
8、;送被除数DIVAB;分离高、低半字节;分离高、低半字节ORLB,#30H;低;低4位调整为位调整为ASCII码码MOV42H,BORLA,#30H;高;高4位调整为位调整为ASCII码码MOV41H,AEND例例4-2 将将40H单元的高、低半字节的两个单元的高、低半字节的两个BCD码拆开并变成其码拆开并变成其ASCII码,并分别存入码,并分别存入41H和和42H单元单元 第10页,此课件共88页哦例(附例(附1 1)求两个求两个8 8位无符号数的和。位无符号数的和。设设两两个个8 8位位无无符符号号数数分分别别存存放放在在内内部部RAM RAM 20H20H和和21H21H单单元元,所所求
9、求和和(不不超超过过255255)存存放放在在22H22H单单元。元。ORG 2000HSTART:MOV R0,#20HMOVA,R0INCR0ADDA,R0INC R0MOVR0,ASJMP$END只只有有这这一一种种方方法法吗吗?第11页,此课件共88页哦例(附例(附2 2)求两个求两个8 8位无符号数的和。位无符号数的和。设设两两个个8 8位位无无符符号号数数分分别别存存放放在在内内部部RAM RAM 20H20H和和21H21H单单元元,所所求求和和(不不超超过过255255)存存放放在在22H22H单单元。元。ORG 2000HSTART:MOV A,20HADDA,21HMOV2
10、3H,ASJMP$END第12页,此课件共88页哦4.2.2 循环程序设计循环程序设计 循环初态循环初态第13页,此课件共88页哦图图a a为先执行后判断,相当于为先执行后判断,相当于直到(直到(untiluntil)型循环)型循环。图图b b为先判断后执行,相当于为先判断后执行,相当于当(当(do-whiledo-while)型循环)型循环。第14页,此课件共88页哦 循环程序一般由四个主要部分组成循环程序一般由四个主要部分组成:(1)初初始始化化部部分分:为为循循环环程程序序做做准准备备,如如规规定定循循环环次次数数、给给各各变变量量和地址指针预置初值。和地址指针预置初值。(2)处处理理部
11、部分分:为为反反复复执执行行的的程程序序段段,是是循循环环程程序序的的实实体体,也也是循环程序的主体。是循环程序的主体。(3)循循环环控控制制部部分分:这这部部分分的的作作用用是是修修改改循循环环变变量量和和控控制制变变量量,并判断循环是否结束并判断循环是否结束,直到符合结束条件时直到符合结束条件时,跳出循环为止。跳出循环为止。(4)结束部分结束部分:这部分主要是对循环程序的结果进行分析、这部分主要是对循环程序的结果进行分析、处理处理和存放。和存放。第15页,此课件共88页哦循环:单重循环循环:单重循环 多重循环(二重以上)循环嵌套。多重循环(二重以上)循环嵌套。在在多多重重循循环环程程序序中
12、中,只只允允许许外外重重循循环环嵌嵌套套内内重重循循环环程程序序,而而不不允允许许循循环环体体互互相相交交叉叉,另另外外,也也不不允允许许从从循循环环程程序序的的外外部部跳跳入入循循环环程程序序的的内部。内部。第16页,此课件共88页哦例例4-3 4-3 把外部把外部RAM 5000H50FFHRAM 5000H50FFH单元的内容清零单元的内容清零。ORG 2000HSTART1:MOVDPTR,#5000H;循环初始化;循环初始化MOVR0,#00HMOVA,#00HLOOP1:MOVXDPTR,A;循环体;循环体INCDPTRINCR0DJNZR0,LOOP1;循环控制;循环控制END第
13、17页,此课件共88页哦例例4-4 4-4 将内部将内部RAMRAM从从40H40H开始连续单元的数据传送到外部开始连续单元的数据传送到外部RAMRAM从从2000H2000H开始的连续单元中,当所传送的数据为开始的连续单元中,当所传送的数据为0FFH0FFH时,时,传送停止。传送停止。解:解:ORG2000H MOV R0,#40H ;循环初始化;循环初始化MOVDPTR,#2000HLOOP:MOVA,R0 CJNE A,#0FFH,LOOP1;循环控制循环控制 SJMPNEXTLOOP1:MOVX DPTR,A ;循环体;循环体 INC R0 INC DPTR SJMP LOOP NEX
14、T:SJMP$END 第18页,此课件共88页哦例例4-5 4-5 从从P1P1口重复口重复256256次读数并取平均值,平均值的整次读数并取平均值,平均值的整数和小数部分分别保存于内部数和小数部分分别保存于内部RAMRAM的的30H30H和和31H31H单元中。单元中。解:假设将解:假设将R2 R3作为作为16位寄存器以保存连续位寄存器以保存连续 256次读数的累加和次读数的累加和 ORG 4000HINTEGER EQU30HDECIMAL EQU31HAVR:MOV R2,#0;循环初始化;循环初始化 MOV R3,#0 MOV R4,#0;累加次数为;累加次数为256AVR1:MOV
15、A,P1;循环体;循环体 ADD A,R3;累加至低;累加至低 8位位 JNC AVR2;无进位则暂存结果;无进位则暂存结果 INC R2;有进位则高;有进位则高8位加增位加增 1AVR2:MOV R3,A ;暂存低;暂存低 8位位 DJNZ R4,AVR1;循环控制;循环控制 MOV INTEGER,R2MOVDECIMAL,R3END第19页,此课件共88页哦例例(附附2 2)设设单单片片机机外外部部数数据据存存储储器器起起始始地地址址为为3000H3000H的的数数据据块块中中有有100100个个补补码码,要要求求逐逐一一检检查查,若若为为负负数数则则求求补补后后放放回回,正数则不变。正
16、数则不变。ORG 1000HSTART1:MOVR7,#64H;设设置循置循环环初始初始值值MOVDPTR,#3000HLOOP1:MOVX A,DPTR JNBACC.7,LOOP2CPLAINCAMOVX DPTR,ALOOP2:INCDPTR;外部;外部RAM单单元加元加1DJNZ R7,LOOP1END第20页,此课件共88页哦例例(附附3 3)有有1010个个无无符符号号数数依依次次存存放放在在内内部部RAM RAM 30H30H开开始始的的单单元元中中,求求其其和和,并并将将结果放在结果放在R2R2和和R3R3中。中。ORG 2000HMOVR0,#30HMOVR2,#00HMOV
17、R3,#00HMOVR7,#0AHNEXT:MOVA,R0;设设置循置循环环初始初始值值ADDA,R3MOVR3,AMOVA,R2ADDCA,#00HMOVR2,AINCR0DJNZR7,NEXTSJMP$END第21页,此课件共88页哦例例4.64.6设设MCS-51MCS-51单单片片机机的的时时钟钟频频率率为为fosc fosc=12 12 MHzMHz,试试设设计计延延时时50ms50ms的延时程序的延时程序。延延时时程程序序所所花花费费的的时时间间是是该该程程序序指指令令的的总总机机器器周周期期数数与与机机器器周周期期的乘积。的乘积。通常,延时程序采用通常,延时程序采用MOV和和DJ
18、NZ指令来实现。指令来实现。单循环延时程序,最大的循环次数位单循环延时程序,最大的循环次数位256,则程序段为:,则程序段为:MOV R0,#00H ;机器周期数为;机器周期数为1 DJNZ R0,$;机器周期数为;机器周期数为2若单片机晶振为若单片机晶振为12MHz,则一个机器周期为,则一个机器周期为1us。延时时间:(延时时间:(1+2562)1s513s。需采用多重循环。需采用多重循环。第22页,此课件共88页哦MOV R1,#M LOOP:MOV R2,#NNOPDJNZR2,$DJNZ R1,LOOP内内 层层 循循 环环 的的 机机 器器 周周 期期 数数 为为 Tn=1+1+2*
19、N,总总 机机 器器 周周 期期 数数 为为 Tm(Tn+2)*M+1.设设N=123,M=200,则延时时间为,则延时时间为50.001ms。第23页,此课件共88页哦修改后程序清单:修改后程序清单:ORG2000HMOVR1,#0C8H(200)LOOP:MOV R2,#7BH(123)NOPDJNZ R2,$DJNZ R1,LOOPSJMP$END第24页,此课件共88页哦补充例补充例4 4 设三字节无符号数相加设三字节无符号数相加被加数:内部被加数:内部RAM 22H20H单元(低位在低字节),单元(低位在低字节),加数:加数:内部内部RAM 32H30H单元(低位在低字节),单元(低
20、位在低字节),结果:存于内部结果:存于内部RAM 22H20H单元,进位位存于单元,进位位存于23H单元。单元。利用利用ADDC指令进行多字节加法运算。指令进行多字节加法运算。第25页,此课件共88页哦ORG4200H MOV R0,#20H;被加数的低字节地址;被加数的低字节地址MOV R1,#30H;加数的低字节地址;加数的低字节地址MOV R2,#03H;循环次数;循环次数CLRCLOOP:MOV A,R0ADDC A,R1;低字;低字节节相加相加MOV R0,A;存放字;存放字节节相加相加结结果果INC R0INC R1DJNZ R2,LOOP;循;循环环控制控制MOV A,#00HA
21、DDC A,#00HMOV R0,A;进进位位送位位送23HEND第26页,此课件共88页哦4.2.3 分支程序分支程序 分支程序的基本结构:单分支和多分支。分支程序的基本结构:单分支和多分支。其特点是:各处理模块是相互排斥的。其特点是:各处理模块是相互排斥的。第27页,此课件共88页哦13条条件转移指令,条条件转移指令,分别为分别为:JZ,JNZ:累加器判零转移指令;累加器判零转移指令;CJNE:比较条件转移指令;比较条件转移指令;DJNZ:减减1条件转移指令条件转移指令;JC,JNC,JB,JNB,JBC:位控制条件转移指令等四类。位控制条件转移指令等四类。第28页,此课件共88页哦(1)
22、单重分支结构单重分支结构例例4-7 4-7 片片内内RAM RAM DATA1DATA1和和DATA2DATA2两两个个单单元元中中各各存存有有一一个个无无符符号号数字,将两个数中的小者存入数字,将两个数中的小者存入MINMIN单元。单元。ORG 4000HMINEQU30HDATA1EQU31HDATA2EQU32HMOVA,DATA1;第一数送;第一数送ACLRCCJNEA,DATA2,UNEQU;两数比较;两数比较SJMPSTORE;相等,;相等,DATA1作为小的数作为小的数UNEQU:JCSTORE;有借位,;有借位,DATA1为小为小MOVA,DATA2;无借位,;无借位,DATA
23、2为小为小STORE:MOVMIN,A;小者送;小者送RAMEND第29页,此课件共88页哦例例4-8 4-8 片内片内RAMRAM两个单元中存有不相等的有符号数字两个单元中存有不相等的有符号数字X X和和Y Y,比,比较两数的大小,并将大数存入较两数的大小,并将大数存入MAXMAX单元。单元。若若X-Y0,则当(,则当(OV)0时,时,XY;当(当(OV)1时,时,XY;若若X-Y0,则当(,则当(OV)0时,时,XY;当(当(OV)1时,时,XY。图4-6 例4-8的流程图第30页,此课件共88页哦ORG1000HXDEQU31HYDEQU32HMAXEQU30HCLRCMOVA,XDSU
24、BBA,YD;X-Y,形成,形成OV标志标志JZXMAX;若;若X=Y,则转向,则转向FINISH JBACC.7,NEG;若;若(X-Y)X,存存YSJMPFINISHXMAX:MOVA,XD;XY,存存XFINISH:MOVMAX,A;大数送;大数送MAX单元单元END例例4-8 4-8 片内片内RAMRAM两个单元中存有不相等的有符号数字两个单元中存有不相等的有符号数字X X和和Y Y,比较两,比较两数的大小,并将大数存入数的大小,并将大数存入MAXMAX单元。单元。第31页,此课件共88页哦(2)多重分支结构)多重分支结构例附例附5 5 设设x,yx,y分别存放在内部分别存放在内部RA
25、M 30HRAM 30H和和40H40H中,根据中,根据x x的值,给的值,给y y赋赋值为值为01H,00H,0FFH(-1).01H,00H,0FFH(-1).第32页,此课件共88页哦第33页,此课件共88页哦ORG2000HMOVA,30HJZDONEJBACC.7,LOOPMOVA,#01HSJMPDONELOOP:MOVA,#0FFHDONE:MOV40H,ASJMP$END 第34页,此课件共88页哦(3)散转结构散转结构例例 设设R7的的内内容容为为0n,对对应应的的处处理理程程序序入入口口地地址址分分别别为为PROG0PROGn,编写散转程序。,编写散转程序。跳转方法:逐个比
26、较,类似跳转方法:逐个比较,类似CASE。使用散转指令使用散转指令JMP A+DPTR。设(设(R7)0 n,对应的处理程序入口地址分别为,对应的处理程序入口地址分别为 PROG0PROGn,且按照一定的规律排列,且按照一定的规律排列。第35页,此课件共88页哦 ORG 2000H MOV DPTR,#TAB ;设置处理程序入口首地址;设置处理程序入口首地址 MOV A,R7 CLRC RLC A ;JNCNEXT INCDPHNEXT:JMP A+DPTR ;转向形成的散转地址入口;转向形成的散转地址入口 TAB:AJMP PROG0 ;直接转移地址表;直接转移地址表 AJMP PROG1
27、AJMP PROGn第36页,此课件共88页哦例例4-9 4-9 在在内内部部RAM RAM 20H20H和和21H21H单单元元中中有有两两个个无无符符号号的的数数,由由22H22H中中的的值值决决定定对对该该数数完完成成加加、减减、乘乘或或除除运运算算(20H20H单单元元的的数数为为被被减减数数或或被除数),运算规则及结果保存处见表被除数),运算规则及结果保存处见表4-14-1。表表4-1 例例4-9说明说明(22H)操作操作结果保存处结果保存处0加加30H(低字节),(低字节),31H(高字节高字节)1减减40H2乘乘50H(低字节),(低字节),51H(高字节高字节)3除除60H(余
28、数),(余数),61H(商商)第37页,此课件共88页哦ORG1000HMOVA,22HMOVB,21HRLAMOVDPTR,#TABJMPA+DPTRNOPTAB:AJMPADDM;散转表;散转表AJMPSUBMAJMPMULMAJMPDIVMADDM:MOVA,20H;加法运算;加法运算ADDA,BMOV30H,AMOVA,#0ADDCA,#0MOV31H,ASJMPFINISH第38页,此课件共88页哦SUBM:MOVA,20H;减法运算;减法运算SUBBA,BMOV40H,ASJMPFINISHMULM:MOVA,20H;乘法运算;乘法运算MULABMOV51H,B MOV50H,AS
29、JMPFINISHDIVM:MOVA,20H;除法运算;除法运算DIVABMOV61H,AMOV60H,BFINISH:END第39页,此课件共88页哦 4.2.4 子程序设计子程序设计 子子程程序序与与一一般般程程序序的的主主要要区区别别是是在在子子程程序序的的末末尾尾有有一一条条子子程程序序返返回回指指令令(RET),其其功能是执行完子程序后通过将堆栈内的断点地址弹出到功能是执行完子程序后通过将堆栈内的断点地址弹出到PC而返回到主程序中。而返回到主程序中。在编写子程序时应注意以下几点:在编写子程序时应注意以下几点:(1)要给每个子程序赋一个名字。要给每个子程序赋一个名字。实际上是一个入口地
30、址的代号。实际上是一个入口地址的代号。(2)在子程序的末尾必须有子程序返回指令)在子程序的末尾必须有子程序返回指令RET。(3)要能正确地传递参数。要能正确地传递参数。首首先先要要有有入入口口条条件件,说说明明进进入入子子程程序序时时它它所所要要处处理理的的数数据据如如何何得得到到,另另外外,要要有有出出口条件,即处理的结果是如何存放的。口条件,即处理的结果是如何存放的。第40页,此课件共88页哦(4)注意保护现场和恢复现场。注意保护现场和恢复现场。注意保存主程序和子程序共同涉及的,但值不同的累加器、寄存器和单元的注意保存主程序和子程序共同涉及的,但值不同的累加器、寄存器和单元的内容。内容。保
31、护现场:保护现场:PUSH 恢复现场:恢复现场:POP(5)注意子程序的通用性。注意子程序的通用性。主程序调用子程序的指令:主程序调用子程序的指令:“LCALL”,“ACALL”。子程序返回指令:子程序返回指令:RET。子程序可以嵌套,子程序可以嵌套,嵌套次数从理论上说是无限的,但实际上由于受堆栈深度的影响,嵌套嵌套次数从理论上说是无限的,但实际上由于受堆栈深度的影响,嵌套次数是有限的。次数是有限的。第41页,此课件共88页哦例例4-10 4-10 在图在图3-11 3-11 的的P1P1口与口与LEDLED的连接示意图中,若使得的连接示意图中,若使得LED0LED7LED0LED7依次点亮,
32、其延时时间分别从依次点亮,其延时时间分别从1s1s至至8s8s,LED7LED7点亮之后又点亮之后又从从LED0LED0开始循环。编写汇编语言源程序实现该功能开始循环。编写汇编语言源程序实现该功能。第42页,此课件共88页哦ORG1000HMOVA,#1;主程序;主程序NEXT1:MOV20H,#0MOV R3,#8NEXT:INC20H MOV R4,20HMOVP1,AACALL DELAYRLA DJNZ R3,NEXTSJMPNEXT1DELAY:MOVR7,#10;1s延时子程序延时子程序DELAY3:MOV R6,#200 DELAY2:MOV R5,#125DELAY1:DJNZ
33、 R5,DELAY1;1254500s0.5msDJNZR6,DELAY2;0.5 ms2000.1sDJNZR7,DELAY3;0.1s2001sDJNZR4,DELAYRETEND第43页,此课件共88页哦例例4-11 4-11 两个无符号数据块的首地址分别为两个无符号数据块的首地址分别为30H30H和和40H40H,每个数据,每个数据块的第一个字节都存放着数据块的长度(小于块的第一个字节都存放着数据块的长度(小于1515),求各数据块),求各数据块中最大值的乘积,并将结果存入中最大值的乘积,并将结果存入50H50H(乘积低字节)和(乘积低字节)和51H51H(乘积(乘积高字节)。高字节)
34、。解:可将求最大值的过程编写成一个子程序,子程序的入口参数是数解:可将求最大值的过程编写成一个子程序,子程序的入口参数是数据块的首地址,存放在据块的首地址,存放在R1中,返回参数即为最大值,存放在中,返回参数即为最大值,存放在A中,参考程序如下:中,参考程序如下:ORG 1000H;主程序;主程序MOV R1,#30H;置入口条件参数;置入口条件参数ACALL FMAX;调用求最大值子程序;调用求最大值子程序MOV B,A;第一个最大值存放于;第一个最大值存放于BMOV R1,#40H;置入口条件参数;置入口条件参数ACALL FMAX;调用求最大值子程序;调用求最大值子程序MUL AB;求乘
35、积;求乘积MOV 50H,A;存乘积低字节;存乘积低字节MOV 51H,B;存乘积低高字节;存乘积低高字节SJMP$第44页,此课件共88页哦ORG 1200H;子程序;子程序FMAX:MOV A,R1;取数据块长度;取数据块长度 MOV R2,A;R2中存放数据块的长度中存放数据块的长度 INCR1;改变地址指针;改变地址指针MOVA,R1;将第一个数放入;将第一个数放入ADECR2;数据个数减;数据个数减1LOOP1:INC R1;修改地址指针;修改地址指针 CLR C SUBB A,R1;相减比较大小;相减比较大小 JNC LOOP2;A中的数为大,跳向中的数为大,跳向 MOV A,R1
36、;否则,更换大数到;否则,更换大数到A SJMP LOOP3LOOP2:ADD A,R1;恢复原最大值;恢复原最大值LOOP3:LOOP3:DJNZ R2,LOOP1;若未比较完,则循环;若未比较完,则循环 RET END第45页,此课件共88页哦例例:将将R0R0和和R1R1所所指指的的内内部部RAMRAM中中两两个个多多字字节节无无符符号号数数相相加加,结结果果存存入入R0R0所所指指的的内内部部RAMRAM中。中。NADD:CLRCNADD1:MOV A,R0ADDCA,R1MOVR0,AINC R0INCR1DJNZR7,NADD1JNCNADD2MOVR0,#01HINCR0NADD
37、2:DEC R0RET第46页,此课件共88页哦4.3 常用程序设计举例常用程序设计举例4.3.1 代码转换类程序代码转换类程序 计计算算机机内内部部的的运运算算一一般般都都是是用用二二进进制制,而而在在计计算算机机与与外外设设的的数数据据传传送送中中常常采采用用BCD码码、ASCII码码和和其其它它代代码码,因因此此,就就存存在在代代码码转转换换的问题。在程序设计中常采用的问题。在程序设计中常采用算法处理和查表方式算法处理和查表方式来实现代码转换。来实现代码转换。第47页,此课件共88页哦1.十六进制数与十六进制数与ASCII码之间的转换码之间的转换 将将A A中存放的一位十六进制数转换成其
38、所对应的中存放的一位十六进制数转换成其所对应的ASCIIASCII码存入码存入A A中。中。解:解:HEXAS:CLR C SUBBA,#10JC LOOPADDA,#7LOOP:ADDA,#10 ADDA,#30HEND第48页,此课件共88页哦例例4-12 4-12 将将从从30H30H单单元元开开始始的的连连续续8 8个个单单元元中中存存放放的的十十六六进进制制数数转转换成其所对应的换成其所对应的ASCIIASCII码,并分别存放在从码,并分别存放在从40H40H开始的开始的1616个单元中。个单元中。解:解:ORG2000HMOVR0,#30H;设定地址指针;设定地址指针MOVR1,#
39、40HMOVR7,#8;循环次数;循环次数NEXT:MOVA,R0;高字节转换;高字节转换 SWAPA ANLA,#0FH ACALLHEXAS MOVR1,A INCR1 MOVA,R0;低字节转换;低字节转换 ANLA,#0FH ACALL HEXAS MOVR1,A INCR1;修改地址指针;修改地址指针 INCR0 DJNZR7,NEXT NOP SJMP$第49页,此课件共88页哦HEXAS:CLR C ;十六进制转换成;十六进制转换成ASCII码子程序码子程序 SUBBA,#10JCLOOPADDA,#7LOOP:ADDA,#10;补偿减掉的;补偿减掉的10 ADDA,#30HRE
40、TEND 第50页,此课件共88页哦例例 把把外外部部RAM 30H3FH单单元元中中的的ASCII码码依依次次转转换换为为十十六六进进制制数数,并存入内部并存入内部RAM 60H67H单单元之中。元之中。假设:假设:被转换的被转换的ASCII为为十六十六进进制数制数(0F)的的ASCII,则,则,因为:因为:09 ASCII 3039H AFASCII 4146H 若若 (30H)41HA10 41H30H11H17 第51页,此课件共88页哦 因为一个字节可装两个转换后得到的十六进制数,即两次转换才能因为一个字节可装两个转换后得到的十六进制数,即两次转换才能拼装为一个字节。为了避免在程序中
41、重复出现转换程序段,因此通常采拼装为一个字节。为了避免在程序中重复出现转换程序段,因此通常采用子程序结构,把转换操作编写为子程序。用子程序结构,把转换操作编写为子程序。第52页,此课件共88页哦ORG 5000HMAIN:MOV R0,30H ;设设置置 ASCII码码地址指地址指针针 MOV R1,60H ;设设置十六置十六进进制数地址指制数地址指针针 MOV R7,08H ;字;字节节个数个数 AB:ACALL TRAN ;调调用用转换转换子程序子程序 SWAP A ;A高低字高低字节节交交换换 MOVXR1,A INC R0 ACALLTRAN ;调调用用转换转换子程序子程序 XCHDA
42、,R1 ;十六;十六进进制数拼装制数拼装 INCR0 INCR1 DJNZR7,AB 第53页,此课件共88页哦子程序(子程序(TRAN):):TRAN:CLRC MOVXA,R0;取;取ASCII码码 SUBBA,#30H CJNEA,#0AH,BB AJMPBCBB:JCDONEBC:SUBB A,#07H;大于等于;大于等于0AH,再减再减07HDONE:RET END第54页,此课件共88页哦例例4-13 将将两两字字节节十十六六进进制制整整数数转转换换成成三三字字节节的的BCD码码。若若待待转转换换的的双双字字节节十十六六进进制制整整数数在在R6、R7中中(R6中为高位),转换后的三
43、字节中为高位),转换后的三字节BCD码整数存于码整数存于R3、R4和和R5中(中(R3中为高位)。中为高位)。解:二进制数解:二进制数b7b6b5b4b3b2b1b0B所对应的十进制数所对应的十进制数X可按照下式计算可按照下式计算因此,只要按照十进制运算法则,将因此,只要按照十进制运算法则,将bi(i=7,6,1,0)按权相加,就可以得到相应)按权相加,就可以得到相应的十进制数的十进制数X。参考程序如下:。参考程序如下:ORG 2000HHEBCD:MOVA,#0;BCD码初始化码初始化MOVR3,AMOVR4,AMOVR5,A MOV R2,#16;循环次数;循环次数NEXT:CLR C M
44、OV A,R7;R7右移一位并送回右移一位并送回 RLC A MOV R7,A MOVA,R6;R6右移一位并送回右移一位并送回RLCAMOVR6,A 第55页,此课件共88页哦MOVA,R5;(;(R5)2并调整为并调整为BCD码码ADDCA,R5DAAMOVR5,AMOVA,R4;(;(R4)2并调整为并调整为BCD码码ADDCA,R4DAAMOVR4,AMOVA,R3ADDCA,R3MOVR3,A;若万位数不超过;若万位数不超过6,则不用调整,则不用调整DJNZR2,NEXT;处理完;处理完16位了吗?位了吗?NOP END第56页,此课件共88页哦4.3.2 查表程序查表程序 常用于非
45、线性修正、非线性函数转换以及代码转换等。常用于非线性修正、非线性函数转换以及代码转换等。专用的查表指令:专用的查表指令:MOVC A,A+DPTR;远程查表,;远程查表,64KB 通过通过以下三步操作实现查表。以下三步操作实现查表。将所查表格的将所查表格的首地址送入首地址送入DPTR;将要查找的将要查找的数据序号数据序号,即数据在表中的位置送入,即数据在表中的位置送入累加器累加器A中中;执行查表指令执行查表指令 MOVC A,A+DPTR 进行读数并存结果存进行读数并存结果存 于累加器于累加器A。第57页,此课件共88页哦MOVC A,A+PC ;近程查表,;近程查表,0+256B其实现查表也
46、可通过以下三步操作来完成。其实现查表也可通过以下三步操作来完成。将要查找的将要查找的数据序号数据序号,即数据在表中的位置,即数据在表中的位置送入累加器送入累加器A中;中;把从把从查表指令到表的首地址间的偏移量与查表指令到表的首地址间的偏移量与A值相加值相加;执行查表指令执行查表指令 MOVC A,A+PC 进行读数,查表结果送累加器进行读数,查表结果送累加器A。第58页,此课件共88页哦例例4-14 用用查查表表指指令令编编程程实实现现将将从从30H单单元元开开始始的的连连续续8个个单单元元中中存存放放的的十十六六进进制制数数转转换换成成其其所所对应的对应的ASCII码,并分别存放在从码,并分
47、别存放在从40H开始的开始的16个单元中。个单元中。ORG2000HASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H;ASCII码表码表 DB 38H,39H,41H,42H,43H,44H,45H,46HMOVR0,#30H;设定地址指针;设定地址指针MOVR1,#40HMOVR7,#8;循环次数;循环次数MOVDPTR,#ASCTABNEXT:MOVA,R0;高字节转换;高字节转换SWAPAANLA,#0FHMOVCA,A+DPTR;查表查表MOVR1,A INCR1MOVA,R0;低字节转换低字节转换ANLA,#0FHMOVCA,A+DPTR;查表查表M
48、OVR1,AINCR1;修改地址指针;修改地址指针INCR0DJNZR7,NEXTNOPEND 第59页,此课件共88页哦例例4-15 在一个巡回检测系统中,需对在一个巡回检测系统中,需对8路输入进行控制,每路都有一最大允许值,为双字节数,且不全相路输入进行控制,每路都有一最大允许值,为双字节数,且不全相同。控制时,需将输入值与最大值比较,若超过则进行报警。编写一子程序使其能查找每路的最大允许值。同。控制时,需将输入值与最大值比较,若超过则进行报警。编写一子程序使其能查找每路的最大允许值。解:该查表运算中自变量解:该查表运算中自变量X是单字节,而因变量是单字节,而因变量Y是两字节的数。假设被检
49、测路数存放在是两字节的数。假设被检测路数存放在R7中(入口中(入口参数),参数),07路的最大允许值依次存放在路的最大允许值依次存放在ROM中,查询得到的最大值存放在中,查询得到的最大值存放在30H(低字节)和(低字节)和31H(出口参数)中,则参考程序如下:(出口参数)中,则参考程序如下:ORG1000HMOVDPTR,#TABLEMOVA,R7RLA;乘;乘2进行地址修正进行地址修正MOVR7,AMOVCA,A+DPTR;查表取高字节;查表取高字节MOV31H,AINCDPTRMOVA,R7MOVCA,A+DPTR;查表取低字节;查表取低字节MOV30H,ATABLE:DW 1245H,2
50、345H,1022H,2390H;最大允许值表最大允许值表DW 3421H,2388H,2366H,2147HRET第60页,此课件共88页哦例例 若若累累加加器器A中中存存放放的的是是一一位位BCD码码。通通过过查查表表将将其其转转换换成成为为相相应应的七段显示码,并存入寄存器的七段显示码,并存入寄存器B中。中。七段数码显示管连接方式:共阳极和共阴极两种。七段数码显示管连接方式:共阳极和共阴极两种。共阳极是低电平为有效输入,共阳极是低电平为有效输入,共阴极为高电平为有效输入。共阴极为高电平为有效输入。假设数码显示管为共阴极。假设数码显示管为共阴极。09的的七七段段码码为为 3FH,06H,5