《第4章汇编语言程序设计PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第4章汇编语言程序设计PPT讲稿.ppt(86页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第4章汇编语言程序设计第1页,共86页,编辑于2022年,星期一 MCS-51 MCS-51单片机汇编语言源程序的格式单片机汇编语言源程序的格式本章内容本章内容本章内容本章内容 汇编语言程序设计讲解汇编语言程序设计讲解第2页,共86页,编辑于2022年,星期一 了解汇编语言源程序的基本格式了解汇编语言源程序的基本格式 掌握汇编语言程序设计的一般步骤掌握汇编语言程序设计的一般步骤以及算逻处理程序、数制转换程序、以及算逻处理程序、数制转换程序、分支程序、延时程序的设计方法。分支程序、延时程序的设计方法。学习目的学习目的学习目的学习目的第3页,共86页,编辑于2022年,星期一4.1 4.1 汇编语
2、言源程序的格式及设计汇编语言源程序的格式及设计一一.汇编语言源程序的格式汇编语言源程序的格式 语句格式:语句格式:标号:操作码标号:操作码 操作数操作数 1,操作数,操作数2;注释;注释 第4页,共86页,编辑于2022年,星期一标标号号:一一条条指指令令或或一一段段程程序序的的标标记记,即即符符号号地地址址。加加在在指指令令之之前前,标标号号必必须须以以字字母母开开始始,后后跟跟1-81-8个个字字母母或或数数字字,并并以以“:”结结尾尾,用用户户定定义义的的标标号号不不能能和和汇汇编编保保留留符符号号(包包括括指指令令操操作作码码助助记记符符以及寄存器名等)重复。标号的值是它后面的指令存储
3、地址。以及寄存器名等)重复。标号的值是它后面的指令存储地址。操操作作码码:指指令令的的英英文文缩缩写写表表示示,即即助助记记符符。由由是是用用与与指指令令功功能一致的能一致的2-52-5个英文字母所组成,如个英文字母所组成,如JBJB、MOVMOV、CJNECJNE、LCALLLCALL等。等。第5页,共86页,编辑于2022年,星期一操操作作数数:是是参参与与该该指指令令操操作作的的操操作作数数或或操操作作数数所所在在的的地地点点。是是参参与与操操作作的的数数据据来来源源和和操操作作结结果果存存放放的的目目的的单单元元。它它以以一一个个或或几几个个空空格格和和操操作作码码隔隔开开,根根据据指
4、指令令功功能能的的不不同同,操操作作数数可可以以有有1 1、2 2、3 3个个或或没没有有(如如NOPNOP)。无无操操作作数数指指令令其其操操作作数数隐隐含含在在操操作作码码中中。操操作作数数之之间间以以“,”分分开开。操操作作码码和和操作数一起便是指令自身。操作数一起便是指令自身。注释:注释:用来说明语句或程序的功能,以用来说明语句或程序的功能,以“;”开始。开始。第6页,共86页,编辑于2022年,星期一1.1.标号标号通常由通常由1 16 6个字符组成个字符组成第一个字符必须是英文字母第一个字符必须是英文字母与指令的操作码之间用冒号分开与指令的操作码之间用冒号分开没有必要每条指令都采用
5、标号没有必要每条指令都采用标号第7页,共86页,编辑于2022年,星期一2.2.地址单元和机器码地址单元和机器码地址单元:地址单元:指明每条指令在程序存储器中的指明每条指令在程序存储器中的存放首地址存放首地址机器码:机器码:本行指令译出的机器码本行指令译出的机器码放在标号前面放在标号前面第8页,共86页,编辑于2022年,星期一二二.单单片片机机MCS-51汇汇编编语语言言程程序序设设计计步步骤骤(1/3):1 分析问题分析问题确定问题的任务确定问题的任务工作过程工作过程现有条件:已知的数据,对运算的精度和速度现有条件:已知的数据,对运算的精度和速度的要求等的要求等硬件设计硬件设计第9页,共8
6、6页,编辑于2022年,星期一二二.单单片片机机MCS-51汇汇编编语语言言程程序序设设计计步步骤骤(2/3):2 确定算法确定算法将实际问题转化为数学算法将实际问题转化为数学算法分析有几种可能的数学算法分析有几种可能的数学算法对不同的数学算法进行分析、比较,选择最佳对不同的数学算法进行分析、比较,选择最佳的算法的算法 3 设计程序流程图设计程序流程图用各种符号、图形及有向线段等来直观地描述用各种符号、图形及有向线段等来直观地描述程序设计的过程程序设计的过程第10页,共86页,编辑于2022年,星期一二二.单单片片机机MCS-51汇汇编编语语言言程程序序设设计计步步骤骤(3/3):4 分配内存
7、单元分配内存单元 5 编写汇编语言源程序编写汇编语言源程序格式:格式:标号标号:操作码操作码 操作数操作数 注释注释。编写时应加注注释编写时应加注注释,以加强程序的可读性。以加强程序的可读性。6 调试程序调试程序第11页,共86页,编辑于2022年,星期一三三.MCS-51MCS-51汇汇编编语语言言程程序序设设计计方方法法和和技技巧巧(1/2)(1/2):1 模块化的程序设计方法模块化的程序设计方法划分模块的原则划分模块的原则每个模块具有独立的功能,产生一个明确的结每个模块具有独立的功能,产生一个明确的结果果;模块之间的控制偶合模块之间的控制偶合(指模块的进入和退出条件指模块的进入和退出条件
8、及方式及方式)应尽量简单应尽量简单;模块之间的数据偶合模块之间的数据偶合(指信息交换的方式指信息交换的方式,交换交换量的多少及频繁程度量的多少及频繁程度)应尽量少应尽量少;模块长度适中。太长调试困难失去了其优越性模块长度适中。太长调试困难失去了其优越性;太短则模块连接又太复杂。太短则模块连接又太复杂。第12页,共86页,编辑于2022年,星期一三三.MCS-51MCS-51汇汇编编语语言言程程序序设设计计方方法法和和技技巧巧(1/2)(1/2):2 编程技巧编程技巧尽量采用循环结构和子程序。可以大大减少程尽量采用循环结构和子程序。可以大大减少程序的总容量,提高效率,节省空间;序的总容量,提高效
9、率,节省空间;尽量少用无条件转移指令,使程序条理更清楚,尽量少用无条件转移指令,使程序条理更清楚,减少错误;减少错误;累加器是信息传递的枢纽,在子程序中一般不累加器是信息传递的枢纽,在子程序中一般不必把累加器内容压入堆栈。必把累加器内容压入堆栈。第13页,共86页,编辑于2022年,星期一四四.汇编语言程序的基本结构汇编语言程序的基本结构 1 顺顺序序结结构构:程程序序中中没没有有分分支支,循循环环,调调用用,只只按按顺序一条一条地执行,是最简单的程序结构。顺序一条一条地执行,是最简单的程序结构。2 分分支支结结构构:根根据据条条件件对对程程序序的的执执行行进进行行判判断断,满满足条件程序则发
10、生转移足条件程序则发生转移,否则按顺序执行。否则按顺序执行。3 循循环环结结构构:当当需需要要连连续续重重复复某某个个算算法法,可可以以在在程程序序中中设设计计可可以以反反复复执执行行的的程程序序段段(称称为为循循环环体体)来来实实现现。这既可以简化程序,还使程序结构紧凑,可读性好。这既可以简化程序,还使程序结构紧凑,可读性好。4(中中断断)子子程程序序结结构构:对对于于需需要要多多次次应应用用、完完成成相相同同功功能能的的算算法法,常常把把它它们们独独立立出出来来,作作为为一一个个程程序序段段来调用(子程序调用来调用(子程序调用ACALL/LCALL或中断调用)。或中断调用)。第14页,共8
11、6页,编辑于2022年,星期一4.2 4.2 顺序程序设计顺序程序设计 例例1.将将外外部部数数据据存存储储器器的的000EH和和000FH单单元的内容交换。元的内容交换。方方法法:没没有有直直接接作作外外部部存存储储器器数数据据交交换换的的指指令令。只只有有通通过过A并并用用MOVX指指令令来来访访问问外外部部存存储储器器。并并用用20H作作为为中中间间暂暂存存环环节节,R0,R1间间址址表表示示两两单单元元的的低低8位位地地址址,高高8位位地地址址由由P2(地地址址总总线线输出高输出高8位地址位地址)表示。表示。第15页,共86页,编辑于2022年,星期一相应的程序如下:相应的程序如下:相
12、应的程序如下:相应的程序如下:ORG0000HMOVP2,#00H;送地址高位至;送地址高位至P2口口MOVR0,#0EH;R0=0EHMOVR1,#0FH;R1=0FHMOVXA,R0;A=(000EH),即即(000EH)中的数据送到中的数据送到A中中MOV20H,A;(;(20)=(000EH),即即(000EH)中的数据送到中的数据送到20H中中MOVXA,R1;A=(000FH),即即(000FH)中的数据送到中的数据送到A中中XCHA,20H;(20H)A,使得,使得A=(000EH),(20H)=(000FH)MOVXR1,A;A=(000EH)(000FH),(000EH)中的
13、数据送到中的数据送到(000FH)中中MOVA,20H;A=(000FH)。(000FH)中的数据送到中的数据送到A中中MOVXR0,A;A=(000FH)(000EH),送回变换后的数据送回变换后的数据SJMP$;$表示本指令首地址表示本指令首地址,跳转到本指令开始处跳转到本指令开始处,即原地循环即原地循环,;实现动态停机实现动态停机END第16页,共86页,编辑于2022年,星期一例例2.将将内内部部数数据据存存储储器器的的(31H)和和(30H)单单元元中中的的16位位数数求求其其补补码码后后放放回回原原单单元。元。方方法法:数数M的的补补码码计计算算:+(M)补补=(M)原原,-(M)
14、补补=(M)反反+1。计计算算步步骤骤:(1)判判断断数数的的正正负负。(2)低低8位位取取反反加加1,高高8位位取取反反加加低低位位的的进进位位。注注意意:不不能能用用INC(增增1)指指令令,因因为为,该指令不影响标志位该指令不影响标志位C。第17页,共86页,编辑于2022年,星期一相应的程序如下:相应的程序如下:相应的程序如下:相应的程序如下:相应的程序如下:相应的程序如下:ORG0000HMOVA,31H;送数据高位至;送数据高位至AJBACC.7,CPLL;检查;检查A第第7位是否是位是否是1(负负)。若是就转移到。若是就转移到;CPLL,否则,继续。,否则,继续。SJMP$;是正
15、数;是正数,补码补码=原码,结束。原码,结束。CPLL:MOVA,30H;送低位数据到;送低位数据到A中中CPLA;A取反取反ADDA,#01H;A+1A,低,低8位加位加1。MOV30H,A;送回求补后的低位数据到;送回求补后的低位数据到30H中中MOVA,31H;送高位数据到;送高位数据到A中中CPLA;A取反取反ADDCA,#00H;A+CA,加低,加低8位的进位。位的进位。ORLA,#80H;A.7与与1或。使或。使A.7为为1,恢复负号恢复负号MOV31H,A;送回求补后的高位数据到送回求补后的高位数据到31H中中SJMP$;结束。;结束。END第18页,共86页,编辑于2022年,
16、星期一例例3.设设变变量量放放在在片片内内RAM的的20H单单元元,取取值值范范围围为为00H,01H,02H,03H,04H,05H,要要求求编编一一个个查查表表程程序序,查查出出变变量量的的平平方方值值,并并放放入入片片内内RAM的的21H单元中。单元中。方方法法:查查表表方方法法分分近近程程和和远远程程两两种种。此此例例用远程方法更好用远程方法更好,即用即用DPTR作为间址指针。作为间址指针。第19页,共86页,编辑于2022年,星期一相应的程序如下:相应的程序如下:相应的程序如下:相应的程序如下:相应的程序如下:相应的程序如下:ORG0000HMOVDPTR,#TAB;建立地址指针;建
17、立地址指针,DPTR指向表首地址指向表首地址MOVA,20H;从;从20H中读数据。中读数据。MOVCA,A+DPTR;TAB+(20H)A。查表。查表(远程查表)(远程查表)MOV21H,A;送查好的数据到;送查好的数据到21H中中SJMP$;结束。;结束。TAB:DB00H,01H,04H,09H,10H,19H;平方表平方表0,1,4,9,16,25ENDORG0000HMOVA,20H;从;从20H中读数据。中读数据。ADDA,#04H;调整地址指针调整地址指针,表格地址与查表指令差表格地址与查表指令差4个字节个字节MOVCA,A+PC;PC+(20H)+2A。查表。查表(近程查表)(
18、近程查表)MOV21H,A;送查好的数据到;送查好的数据到21H中中SJMP$;结束。;结束。TAB:DB00H,01H,04H,09H,10H,19H;平方表平方表0,1,4,9,16,25END第20页,共86页,编辑于2022年,星期一方法:方法:8 8位无符号数最大值是位无符号数最大值是(0)255,除以,除以100100得得2.55,2.55,所以商就是百位。同理所以商就是百位。同理,余数除以余数除以1010得十位得十位,余下余下的就是个位。由于商为的就是个位。由于商为0000 xxxx0000 xxxx,要求为压缩,要求为压缩BCDBCD码,码,故可以将十位变成故可以将十位变成xx
19、xx 0000 xxxx 0000,再与个位,再与个位0000 xxxx0000 xxxx合并,合并,形成形成xxxx xxxxxxxx xxxx的形式。程序中已假定,标号均用伪指的形式。程序中已假定,标号均用伪指令定义了具体地址。如令定义了具体地址。如 M MH H EQU 20H EQU 20H。例例4 4:将:将A A中二进制数转换成中二进制数转换成3 3位压缩位压缩BCDBCD码数,百位数码数,百位数放放M MH H单元中,十位、个位数放在单元中,十位、个位数放在MLML中。中。第21页,共86页,编辑于2022年,星期一MOV B,#100DIVABMOVMH,AMOV A,#10X
20、CHA,BDIVABSWAP AADDA,BMOV ML,ARETBINBCD:;将十进制;将十进制100送到送到B中中;A(商商)A/B,计算百位,计算百位;MHA(百位百位);A10(十进制十进制);A(10)和和B(余数余数)交换数据交换数据;A(商商)A/B,商商-十位十位,余数余数-个位个位;A高低两半字节数据内容交换高低两半字节数据内容交换;AA+B(个位与十位合并个位与十位合并);MLA(保存个位与十位保存个位与十位);返回;返回第22页,共86页,编辑于2022年,星期一4.3 4.3 分支程序设计分支程序设计例例1.在在内内部部RAM的的40H和和41H地地址址单单元元中中,
21、有有2个个无无符符号号数数。试试比比较较这这两两数数的的大大小小,并并将将大大数数存存放放在在内内部部RAM的的GR单单元元,小小数数寸寸放放在在LE单元,若两数相等,则分别存放在单元,若两数相等,则分别存放在GR和和LE中。中。方方法法:CJNE指指令令具具有有比比较较功功能能。可可以以直直接判断接判断2数的大小。并影响标志位数的大小。并影响标志位C。第23页,共86页,编辑于2022年,星期一ORG0000HMOV A,40HCJNE A,41H,NoEQMOV GR,AMOVLE,ASJMP$JCLESSMOV GR,AMOVLE,41HSJMP$MOV LE,AMOVGR,41HSJM
22、P$EQU30HEQU31HENDNoEQ:;A40H,从,从40H中取数中取数;比较;比较40H和和41H,不等转,不等转NoEQ;相等;相等40H数送数送GR;相等;相等40H数送数送LE;结束;结束;如果;如果C=1(40H41H,40H(大大)数送数送GR;40H(小小)数送数送LE;结束;结束;40H0)Y=20H(X=0);X+5(X0)试编程序试编程序,根据根据X的值求出的值求出Y,并放回原单元并放回原单元方方法法:用用JZ指指令令对对X与与0比比较较。用用位位操操作作指指令令或或逻辑运算方法判断逻辑运算方法判断X的正负。的正负。第25页,共86页,编辑于2022年,星期一ORG
23、0000HMOV A,30HJZNEXTANLA,#80HJZEDMOV A,#05HADDA,30HMOV30H,ASJMP EDMOV30H,#20SJMP$;A30H,从,从30H中取数中取数;A=0?不等则继续,等跳转?不等则继续,等跳转;A与与10000000相与,判断符号相与,判断符号;A=0?为?为0则为正,结果不变则为正,结果不变;X10)Y=20H(X=10);X+25(X10)试编程序试编程序,根据根据X的值求出的值求出Y,并放回原单元并放回原单元第27页,共86页,编辑于2022年,星期一ORG0000HMOV A,55HCZNEA,#10,NEXTMOV30H,#20S
24、JMP DONEANLA,#80HJZPOSTMOVA,#25ADDA,30HMOV30H,ASJMPDONEMOV A,30HCLRCSUBB A,#2MOV30H,ASJMP$;A55H,从,从55H中取数中取数;A=10?不等则跳转,等继续?不等则跳转,等继续;X=10,Y20;结束结束;A与与10000000相与,判断符号相与,判断符号;A=0?为?为0则为正,跳转则为正,跳转;X0,A30H;清清C标志标志;AA-2;将;将Y=X-2送回原单元送回原单元30H;结束;结束NEXT:DONE:POST:第28页,共86页,编辑于2022年,星期一方法方法:注意到注意到R3R3的内容与的
25、内容与PRPR的下标有对应关系的下标有对应关系,都是都是0 0n n。故可以将。故可以将PRPR0 0PRPRn n的入口地址列成表的入口地址列成表格格,每一项占用每一项占用2 2个单元。因此,可以用个单元。因此,可以用2xn2xn作作为偏移量。例如,从为偏移量。例如,从R3R3中取数中取数i i,那么,那么2i2i就是就是偏移量,从偏移量,从2i2i和和2i+12i+1中取中取(高高8 8位和低位和低8 8位位)数。数。然后,就用间接长转移指令然后,就用间接长转移指令JMP JMP A+DPTR A+DPTR 转转移到移到PRPR2i2i中。中。例例3 3:根据根据R3R3的内容转向对应的程
26、序,的内容转向对应的程序,R3R3的内容的内容为为0 0n,n,处理程序的入口符号地址分别为处理程序的入口符号地址分别为PRPR0 0PRPRn n(n128)(n128)。第29页,共86页,编辑于2022年,星期一程序为:程序为:程序为:程序为:PR0EQU0110HPR0EQU0110HPR1EQU0220HPR1EQU0220HPR2EQU0330HPR2EQU0330HORG0000HORG0000HMOVA,R3MOVA,R3ADDA,ACCADDA,ACCMOVDPTR,#TABMOVDPTR,#TABPUSHACCPUSHACCMOVCA,A+DPTRMOVCA,A+DPTRM
27、OVB,AMOVB,AINCDPLINCDPLPOPACCPOPACCMOVCA,A+DPTRMOVCA,A+DPTRMOVDPL,AMOVDPL,AMOVDPH,BMOVDPH,BCLRACLRAJMPA+DPTRJMPA+DPTRDWPR0,PR1,PRnDWPR0,PR1,PRnENDENDTAB:TAB:;定义定义定义定义PR0PR0;PR1;PR1;PR1;PR1;A;AR3(R3(取数取数取数取数0n)0n);A;AA*2(A*2(乘乘乘乘2)2);用用用用DPTRDPTR建立地址指针建立地址指针建立地址指针建立地址指针;把把把把AA压入堆栈压入堆栈压入堆栈压入堆栈(保护数据保护数
28、据保护数据保护数据);取取取取地址表的地址表的地址表的地址表的高字节高字节高字节高字节(A(A改变改变改变改变);B;BA(A(保存保存保存保存高字节数据高字节数据高字节数据高字节数据);DPTR;DPTR低低低低8 8位加位加位加位加1 1;恢复恢复恢复恢复ACCACC数据数据数据数据(A*2)(A*2);取取取取地址表的地址表的地址表的地址表的低字节低字节低字节低字节;低字节数据低字节数据低字节数据低字节数据 DPTRDPTR低低低低8 8位位位位;高字节数据高字节数据高字节数据高字节数据 DPTRDPTR高高高高8 8位位位位;清除清除清除清除A=0A=0;跳转到跳转到跳转到跳转到PRn
29、PRn中中中中;PR1,PRn;PR1,PRn第30页,共86页,编辑于2022年,星期一例例4.设设有有5个个按按键键0,1,2,3,4,其其编编码码分分别别是是3AH,47H,65H,70H,8BH,要要求求根根据据按按下下的的键键转转向向不不同同的的处处理理程程序序,分分别别为为PR0,PR1,PR2,PR3,PR4,设设按按键值已读出并存在键值已读出并存在B寄存器中。试编程序。寄存器中。试编程序。方方法法:用用CJNE指指令令将将读读出出键键值值与与键键码码表表比比较较。若若相相等等就就转转移移到到对对应应的的处处理理程程序序中中,用用AJMP指指令令调调用用。调调用用相相应应的的处处
30、理理程程序序用用查查表表方方法法。因因AJMP指令占指令占2字节字节,查表时采用乘查表时采用乘2的方法改变偏移地址。的方法改变偏移地址。第31页,共86页,编辑于2022年,星期一PR0EQU0110HPR1EQU0220HPR4EQU0550HORG0000HMOVDPTR,#TABMOVA,#0PUSHACCMOVCA,A+DPTRCJNEA,B,AGANPOPACCRLAMOVDPTR,#JPTJMPA+DPTRPOPACCINCACJNEA,#5,NEXTSJMP$AJMPPR0AJMPPR1AJMPPR4DB3AH,47H,65H,70H,8BHEND;建立地址指针,置键码表首地址建
31、立地址指针,置键码表首地址;A=0,表的起始位的偏移量为,表的起始位的偏移量为0;保存保存A数据数据;读按键编码表数据读按键编码表数据;将输入值将输入值B与按键编码表比较,相等继续与按键编码表比较,相等继续;恢复;恢复A值值;左移左移A一次(一次(A乘乘2),),;建立地址指针,置处理程序表首地址建立地址指针,置处理程序表首地址;跳转到处理程序表,执行相应程序跳转到处理程序表,执行相应程序;若不等,改变若不等,改变A再比较下一个再比较下一个;A=A+1;是否比较了是否比较了5次,是就结束次,是就结束;结束结束;处理程序表处理程序表;键码表键码表NEXT:JPT:AGAN:TAB:第32页,共8
32、6页,编辑于2022年,星期一4.4 4.4 循环程序设计循环程序设计例例1.设设计计一一个个延延时时10ms的的延延时时子子程程序序,假假设单片机使用的晶振为设单片机使用的晶振为6MHz。方方法法:1个个机机器器周周期期为为12个个时时钟钟周周期期。1个个时时钟钟周周期期为为1.67x10-7秒秒(1/6MHz)。所所以以,1个个机机器器周周期期为为2s。利利用用单单循循环环可可以以实实现现1ms的的延延时时,再再外外循循环环10次次,就就可可以以达达到到10ms的的延延时时目的。目的。第33页,共86页,编辑于2022年,星期一相应的程序如下:相应的程序如下:相应的程序如下:相应的程序如下
33、:相应的程序如下:相应的程序如下:机器周期数机器周期数ORG0020H1MOVR0,#0AH;外循环;外循环10次次1DL2:MOVR1,#7DH;内循环;内循环125次次1DL1:NOP;空操作,延长时间;空操作,延长时间1NOP;空操作,延长时间;空操作,延长时间2DJNZR1,DL1;若未循环;若未循环125次就返回次就返回DL1,否则结束,否则结束2DJNZR0,DL2;若未循环;若未循环10次就返回次就返回DL2,否则结束,否则结束2RET时间延长计算:时间延长计算:内循环:(内循环:(1+1+2)2s 125=8s 125=1000s(125次循环)次循环)外循环:外循环:1+(1
34、+1+2)125+2 10 2s=10060s(10次循环)次循环)总循环:总循环:1+(1+1+2)125 10+2 2s=10062ms第34页,共86页,编辑于2022年,星期一例例2:编编写写多多字字节节乘乘1010的的程程序序。假假设设内内部部RAMRAM以以20H20H为为首首的的一一片片单单元元中中存存放放着着一一个个多多字字节节无无符符号号数数,字字节节数数目目存存放放在在R7R7中中,存存放放方方式式为为低低字字节节在在低低地址,高字节在高地址,并乘积仍存放在该单元。地址,高字节在高地址,并乘积仍存放在该单元。方方法法:利利用用乘乘法法运运算算指指令令MUL MUL ABAB
35、运运算算结结果果是是A A放放低低8 8位位,B B放放高高8 8位位,取取一一位位乘乘1010后后,将将加加低低位位的的进进位位和和高高位位相相加加。用用R1R1作作为为低低位位地地址址指指针针,R2R2作作为为高高位暂存单元。位暂存单元。第35页,共86页,编辑于2022年,星期一ORG0000HCLRCMOVR1,#20HMOVR2,#0MOVA,R1MOVB,#0AHPUSHPSWMULABPOPPSWADDCA,R2MOVR1,AMOVR2,BINCR1DJNZR7,SH10MOVR1,BSJMP$END;清进位标志;清进位标志;建立地址指针,置多字节首地址;建立地址指针,置多字节首
36、地址;清;清R2,作为高字节暂存处,作为高字节暂存处;取一字节准备相乘;取一字节准备相乘;将;将10送入送入B;保存位标志;保存位标志C,乘法总是清,乘法总是清C标志标志;A乘乘10;恢复位标志;恢复位标志;前一高字节与低字节带进位相加前一高字节与低字节带进位相加;乘积送回原单元乘积送回原单元;乘积的高字节送;乘积的高字节送R2;R1加加1,指向下一个高位字节,指向下一个高位字节;检查是否乘完,未完成则返回;检查是否乘完,未完成则返回;最后乘积高字节送回原单元;最后乘积高字节送回原单元;结束;结束SH10:第36页,共86页,编辑于2022年,星期一例例3.把片内把片内RAM中地址中地址30H
37、39H中的中的10个大小不等个大小不等的无符号数逐一比较的无符号数逐一比较,并按从小到大的顺序依次排列在该片并按从小到大的顺序依次排列在该片单元中。试编程序。单元中。试编程序。方法方法:用减法指令来比较两个数的大小。依次取相用减法指令来比较两个数的大小。依次取相邻两个数来比较,若前者大就调换位置,否则,保持顺邻两个数来比较,若前者大就调换位置,否则,保持顺序不变。然后大数继续与下一个数再作比较。重复上面序不变。然后大数继续与下一个数再作比较。重复上面做法做法,直到直到1010个数比较完。个数比较完。注意注意:书上的方法不能保证所有数都能按大小顺序书上的方法不能保证所有数都能按大小顺序排列。排列
38、。第37页,共86页,编辑于2022年,星期一程序为:程序为:程序为:程序为:ORGORG0000H0000HCLRCLR00H00HCLRCLRCCMOVMOVR7,#0AHR7,#0AHMOVMOVR0,#30HR0,#30HMOVMOVA,R0A,R0INCINCR0R0MOVMOVR2,AR2,ASUBBSUBBAA,R0R0MOVMOVA,R2A,R2JCJCNEXTNEXTSETBSETB00H00HXCHXCHA,R0A,R0DECDECR0R0XCHXCHA,R0A,R0INCINCR0R0MOVMOVA,R0A,R0DJNZDJNZ R7,LOOPR7,LOOPJBJB00H
39、,START00H,STARTSJMPSJMP$ENDENDSTART:START:;清清清清00H00H单元,作为前数大的标志单元,作为前数大的标志单元,作为前数大的标志单元,作为前数大的标志;清清清清CC标志位标志位标志位标志位;设置记数值设置记数值设置记数值设置记数值1010;设置地址指针设置地址指针设置地址指针设置地址指针,首地址值首地址值首地址值首地址值30H30H;A;A30H(30H(从从从从30H30H中取数中取数中取数中取数);地址指针加地址指针加地址指针加地址指针加1(1(指向后数指向后数指向后数指向后数);R2;R2A,A,保存前一个数据保存前一个数据保存前一个数据保存前
40、一个数据;前后两个数比较前后两个数比较前后两个数比较前后两个数比较,不够减不够减不够减不够减C=1C=1;还原前一个数还原前一个数还原前一个数还原前一个数,存于存于存于存于AA中中中中;前数小前数小前数小前数小(C=1)(C=1)时转移到时转移到时转移到时转移到NEXTNEXT;前数大时前数大时前数大时前数大时,置置置置00H00H为为为为1 1;两数交换两数交换两数交换两数交换,使大数在下单元中使大数在下单元中使大数在下单元中使大数在下单元中,小数在小数在小数在小数在AA中中中中;地址指针减地址指针减地址指针减地址指针减1,1,指向前数指向前数指向前数指向前数;两数交换两数交换两数交换两数交
41、换,使小数在前单元中使小数在前单元中使小数在前单元中使小数在前单元中;地址指针加地址指针加地址指针加地址指针加1,1,指向后数指向后数指向后数指向后数;大数放入下单元大数放入下单元大数放入下单元大数放入下单元AA中中中中;是否循环是否循环是否循环是否循环1010次次次次;当当当当00H=100H=1时,跳转(即如果有前数大)时,跳转(即如果有前数大)时,跳转(即如果有前数大)时,跳转(即如果有前数大)LOOP:LOOP:NEXT:NEXT:第38页,共86页,编辑于2022年,星期一例例4 4:编写多字节编写多字节BCDBCD码减法程序。码减法程序。问题问题1 1:减法的计算不能使用减法的计算
42、不能使用DADA指令(由于指令(由于BCDBCD码的调整指码的调整指令令DADA只用于加法)。只用于加法)。问题问题2 2:没有十进制数的补码计算指令。没有十进制数的补码计算指令。方法:方法:1 1)变减法为加法变减法为加法补码。补码。2 2)补码计算利用补码计算利用XX补补=100-|X|=100-|X|。即。即XX补补=9AH-=9AH-|X|X|(参见(参见P.11P.11),其中其中100100称为模。称为模。3 3)补码加法实际上是减法,所以相加时有进位,补码加法实际上是减法,所以相加时有进位,表明实际无借位;反之,无进位表明实际有借位。表明实际无借位;反之,无进位表明实际有借位。第
43、39页,共86页,编辑于2022年,星期一例:例:64-10=64+(-10)=5464-10=64+(-10)=54。解:解:6464补补=40H=0100 0000B=40H=0100 0000B 1010补补=0AH=0000 1010B=0AH=0000 1010B-10-10补补=1111 0110B=1111 0110B 减法减法 0100 0000B 0100 0000B 加法加法 0100 0000B 0100 0000B -0000 1010B +1111 0110B -0000 1010B +1111 0110B 0011 0110B 0011 0110B 进位进位 1 0
44、011 0110B1 0011 0110B 自然丢失自然丢失第40页,共86页,编辑于2022年,星期一例例:两两BCDBCD码减法码减法 8943H-7649H=8943H+2451H=1294H 8943H-7649H=8943H+2451H=1294H。低位字节补码计算低位字节补码计算:10011010(9AH):10011010(9AH)-01001001(49H)-01001001(49H)01010001(01010001(得补码得补码51H)51H)+01000011(+01000011(加加43,43,得得94H)94H)10010100(10010100(无进位无进位,即有借
45、位即有借位)高位字节补码计算高位字节补码计算:10011010(9AH):10011010(9AH)-01110110(49H)-01110110(49H)00100100(00100100(得补码得补码24H)24H)-00000001(-00000001(减低位借位减低位借位1)1)00100011(00100011(得补码得补码23H)23H)+10001001(+10001001(加加89,89,得得ABH)ABH)10101100(10101100(加加6666修正结果修正结果,十进制调整十进制调整DA)DA)+01100110(+01100110(修正结果为修正结果为12,12,进
46、位进位1,1,无借位无借位)00010010 00010010第41页,共86页,编辑于2022年,星期一ORG0000HSTAR:MOVR3,#00H;用;用R3作为差值的字节数,设置为作为差值的字节数,设置为0CLR07H;用;用07H作为结果的符号标志,设置为作为结果的符号标志,设置为0CLRC;清进位(借位)标志;清进位(借位)标志SUBCD:MOVA,#9AH;设置模数设置模数100SUBBA,R0;X补补=100-减数,计算低位减数,计算低位BCD码的补码码的补码AADDA,R1;被减数;被减数(R1中中)-减数减数(A中中),补码加法补码加法DAA;十进制调整;十进制调整MOVR
47、0,A;将结果送回到;将结果送回到R0中中INCR0;减数低位地址指针加减数低位地址指针加1,准备高位相减准备高位相减INCR1;被减数低位地址指针加被减数低位地址指针加1,准备高位相减准备高位相减INCR3;差值的字节数差值的字节数加加1(若有高位若有高位,就加就加1)CPLC;进位求反进位求反,形成正确借位形成正确借位DJNZR2,SUBCD;若未减完若未减完,返回返回SUBCD,否则继续否则继续JNCDONE;若若C=0(无借位无借位),结束计算结束计算,否则设置借位标志否则设置借位标志SETB07H;设置借位标志设置借位标志,07H=1DONE:SJMP$;结束结束假设被减数低字节地址
48、用假设被减数低字节地址用R1指示指示,减数及差的地址用减数及差的地址用R0指示指示,BCD码的字节数用码的字节数用R2指示指示,用用R3作为差值的字节数作为差值的字节数,用用07H作作为结果的符号标志为结果的符号标志(0为正为正,1为负为负)第42页,共86页,编辑于2022年,星期一例例5:编编写写将将十十进进制制转转换换成成二二进进制制的的程程序序。假假定定一一个个4 4位位十十进进制制数数以以非非压压缩缩BCDBCD码码的的形形式式依依高高到到低低次次序序存存在在40H43H单单元元中中,要要求求转转换换成成二二进进制制数数并存入并存入R2(高位高位)R3(低位低位)单元中。单元中。方法
49、:方法:利用算法如下利用算法如下:一个十进制数可以表示为一个十进制数可以表示为A=(A=(D(Dn n 10+10+D Dn-1n-1)10+10+D Dn-2n-2)10+10+)+)+D D0 04326=4326=(4 4 10+10+3 3)10+210+2 10+610+6若用二进制数直接计算,就可以得到结果。若用二进制数直接计算,就可以得到结果。第43页,共86页,编辑于2022年,星期一举例:举例:26=26=2 2 10+6=1AH,526=(510+6=1AH,526=(5 10+2)10+2)10+6=20EH10+6=20EH 00000010(2H)00000010(2
50、H)00000101(5H)00000101(5H)00001010(10H)00001010(10H)00001010(10H)00001010(10H)000000100 000000100 00001010 00001010+00000010(+00000010(高高8 8位为位为0)+000010100)+00001010 00010100(14H)00010100(14H)00110010(32H)00110010(32H)+00000110(6H)+00000110(6H)+00000010(2H)+00000010(2H)00011010(1AH)00110100(34H)000