1、第第4 4章章 汇编语言程序设计汇编语言程序设计 80C5180C51汇编语言语句结构的基本格式汇编语言语句结构的基本格式 伪指令的功能和应用伪指令的功能和应用 汇编的概念汇编的概念 程序设计的步骤和基本方法程序设计的步骤和基本方法 顺序程序顺序程序 分支程序分支程序 循环程序循环程序 查表程序查表程序 散转程序散转程序本章要点本章要点标号:操作码标号:操作码 目的操作数,源操作数目的操作数,源操作数;注释;注释4-1 4-1 汇编语言程序设计基本概念汇编语言程序设计基本概念4.1.1 4.1.1 汇编语言及其语句结构汇编语言及其语句结构汇编语言程序设计中的数汇编语言程序设计中的数计算机只能识
2、别二进制数计算机只能识别二进制数机器指令,它原本是机器指令,它原本是不认识常用的十六进制数和十进制数的。不认识常用的十六进制数和十进制数的。机器指令机器指令/目标代码:目标代码:由由0/10/1代码组成的操作码与操作数。代码组成的操作码与操作数。BCDBCD码:用二进制数表达的十进制数。码:用二进制数表达的十进制数。(0 09 9表示为表示为:0000:00001001B 1001B 后缀后缀:B/b,H/h:B/b,H/h)二进制数:由二进制数:由0/10/1组成、组成、“逢逢2 2进进1 1”的数制。的数制。如:如:01011110B 01011110B (0 01 1 后缀:后缀:B/b
3、B/b)十六进制数:便于读写记忆的二进制数的简写形式。十六进制数:便于读写记忆的二进制数的简写形式。(0 09 9,A AF F 后缀:后缀:H/hH/h)汇编语言编程基本规则汇编语言编程基本规则汇编语言汇编语言:用助记符描述的指令的集合。用助记符描述的指令的集合。指令中以指令中以 A AF F 开头的十六进制数前必须添一个开头的十六进制数前必须添一个 “0 0”。二进制数必须带后缀二进制数必须带后缀“B B”或或“b b”;十六进制数十六进制数必须带后缀必须带后缀“H H”或或“h h”;十进制数的后缀是十进制数的后缀是“D D”或或“d d”或无或无.标号标号:操作码操作码 目的操作数目的
4、操作数,源操作数源操作数;注释注释 汇编程序汇编程序:汇编语言编写的程序借助编译工具汇编语言编写的程序借助编译工具编译成为目标代码编译成为目标代码,计算机才能识别。这个编译工具计算机才能识别。这个编译工具称为汇编程序。称为汇编程序。4.1.2 4.1.2 伪指令伪指令 在汇编时起控制作用,自身在汇编时起控制作用,自身并不产生并不产生机器码,而机器码,而仅是为汇编服务的一些指令,称为仅是为汇编服务的一些指令,称为伪指令伪指令。伪指令不属。伪指令不属于于80C5180C51指令系统。指令系统。常用的伪指令有以下几种:常用的伪指令有以下几种:起始伪指令起始伪指令 ORG(OriginORG(Orig
5、in)功能:规定功能:规定ORGORG下面目标程序的起始地址下面目标程序的起始地址。格式:格式:ORG 16ORG 16位位地址地址 ORG 0100HORG 0100H START START:MOV AMOV A,#05H#05H ADD A ADD A,#08H#08H MOV 20H MOV 20H,A A ORG 0100H ORG 0100H表示该伪指令下面第一条指令的起始地址表示该伪指令下面第一条指令的起始地址是是0100H0100H,即,即MOV AMOV A,#05H#05H指令的第一个字节地址为指令的第一个字节地址为0100H0100H,或标号或标号STARTSTART代表
6、的地址为代表的地址为0100H0100H。功能:将一个数据或特定的汇编符号赋予规定功能:将一个数据或特定的汇编符号赋予规定 的字符名称。的字符名称。结束伪指令结束伪指令 ENDEND功能:汇编语言源程序的结束标志。功能:汇编语言源程序的结束标志。在在ENDEND后面的指令,汇编程序不再处理后面的指令,汇编程序不再处理。格式:格式:ENDEND 等值伪指令等值伪指令 EQUEQU(EquateEquate)格式:格式:字符名称字符名称 EQUEQU 数据或汇编符号数据或汇编符号例如:例如:PP EQU R0 PP EQU R0 ;PP=R0PP=R0 MOV A MOV A,PP PP ;A R
7、0A R0 这里将这里将PPPP等值为汇编符号等值为汇编符号R0R0,在指令中在指令中PPPP就可以代替就可以代替R0R0来使用。来使用。数据地址赋值伪指令数据地址赋值伪指令 DATADATA格式:格式:字符名称字符名称 DATADATA 表达式表达式功能:将数据地址或代码地址赋予规定的功能:将数据地址或代码地址赋予规定的 字符名称。字符名称。定义字节伪指令定义字节伪指令DBDB(Define ByteDefine Byte)格式:格式:DB 8DB 8位二进制数表位二进制数表功能:从指定的地址单元开始,定义若干功能:从指定的地址单元开始,定义若干 个个8 8位内存单元的数据。位内存单元的数据
8、。数据与数据之间用数据与数据之间用“,”分割。分割。例如:例如:ORG 4000HORG 4000H TAB TAB:DB 73HDB 73H,4545,“A A”,“2 2”TAB1 TAB1:DB 101BDB 101B 以上指令经汇编后,将对以上指令经汇编后,将对4000H4000H开始的若干内存单开始的若干内存单元赋值。元赋值。(4000H)=73H(4000H)=73H,(4001H)(4001H):2DH(2DH(注:注:4545的的1616进制数进制数),格式:格式:字符名称字符名称 BITBIT 位地址位地址 定义字伪指令定义字伪指令DWDW(Define WordDefine
9、 Word)格式:格式:DW 16DW 16位二进制数表位二进制数表功能:从指定的地址单元开始,定义功能:从指定的地址单元开始,定义 若干个若干个1616位数据。位数据。定义位地址伪指令定义位地址伪指令BITBIT功能:将位地址赋予所规定的字符名称。功能:将位地址赋予所规定的字符名称。AQ BIT P0.0AQ BIT P0.0 DEF BIT 30H DEF BIT 30H 把把P0P00 0的位地址赋给字符的位地址赋给字符AQAQ,把位地址把位地址30H30H赋给字赋给字符符DEFDEF。在其后的编程中,在其后的编程中,AQAQ可作可作P0.0P0.0使用,使用,DEFDEF可作可作位地址
10、位地址30H30H使用。使用。三三.汇编汇编 将汇编语言源程序转换为计算机所能识别将汇编语言源程序转换为计算机所能识别的机器语言代码程序的过程称为汇编。的机器语言代码程序的过程称为汇编。汇编可分为:汇编可分为:手工汇编手工汇编 计算机汇编计算机汇编【例例4-14-1】对下段程序进行手工汇编。对下段程序进行手工汇编。汇编和调试汇编和调试四四.程序设计的基本方法程序设计的基本方法编写程序要求:编写程序要求:不仅要完成规定的功能任务,而且还要求:不仅要完成规定的功能任务,而且还要求:执行速度快执行速度快、占用内存少占用内存少、条理清晰条理清晰、阅读方便阅读方便、便于移植便于移植、巧妙而实用巧妙而实用
11、。一般应按以下几个步骤进行:一般应按以下几个步骤进行:分析问题,确定算法或解题思路分析问题,确定算法或解题思路 画流程图画流程图 编写源程序编写源程序 流程图符号和说明流程图符号和说明:顺序程序是指按顺序依次执行的程序,也顺序程序是指按顺序依次执行的程序,也称为简单程序或直线程序。称为简单程序或直线程序。顺序程序结构虽然比较简单,但也能完成顺序程序结构虽然比较简单,但也能完成一定的功能任务,是构成复杂程序的基础。一定的功能任务,是构成复杂程序的基础。第二节第二节 汇编语言程序设计举例汇编语言程序设计举例一一.顺序程序顺序程序ORGORG 0000H 0000HCONT:MOVCONT:MOV
12、A,R0 A,R0;读低读低8 8位位CPLCPL A A;取反取反ADDADD A,#1 A,#1;加加1 1MOVMOV R2,A R2,A;存低存低8 8位位MOVMOV A,R1 A,R1;读高读高8 8位位CPLCPL A A;取反取反ADDCADDC A,#80H A,#80H;加进位及符号位加进位及符号位MOV R3,AMOV R3,A;存高存高8 8位位ENDEND;【例例4-2】已知已知1616位二进制负数存放在位二进制负数存放在R1R0R1R0中,中,试求其补码,并将结果存在试求其补码,并将结果存在R3R2R3R2中。中。解:二进制负数的求补方法可归结为解:二进制负数的求补
13、方法可归结为“求反加求反加1 1”,符号,符号位不变。利用位不变。利用CPLCPL指令实现求反;加指令实现求反;加1 1时,则应低时,则应低8 8位先加位先加1 1,高,高8 8位再加上低位的进位。注意这里不能用位再加上低位的进位。注意这里不能用INCINC指令,因指令,因为为INCINC指令不影响标志指令不影响标志位。位。程序如下:程序如下:ORG 0000HORG 0000HBCD2BBCD2B:MOV AMOV A,R2 ;R2 ;取入口数据取入口数据 ANL AANL A,#0F0H ;#0F0H ;取出十位取出十位 SWAP A ;SWAP A ;高高4 4位位 低低4 4位位 MO
14、V BMOV B,#0AH#0AH MUL AB ;MUL AB ;十位乘十位乘1010 MOV R3 MOV R3,A ;A ;积暂存进积暂存进R3R3 MOV A MOV A,R2 ;R2 ;再取入口数据再取入口数据 ANL AANL A,#0FH ;#0FH ;取出个位取出个位 ADD AADD A,R3R3 MOV R2 MOV R2,A ;A ;结果结果 R2R2 END;END;若若不是子程序可用不是子程序可用END END 例例4-3:4-3:将将R2R2中中BCDBCD码数转为二进制数存进码数转为二进制数存进R2R2。(此子程序在下一例中还要用到)此子程序在下一例中还要用到)根
15、据不同条件转向不同的处理程序,根据不同条件转向不同的处理程序,这种结构的程序称为分支程序。这种结构的程序称为分支程序。80C5180C51指令系统中的指令系统中的条件转移指令条件转移指令、比较转移指令比较转移指令和和位转移指令位转移指令,可以实现分,可以实现分支程序。支程序。二二.分支程序分支程序【例例4 45 5】已知已知X X、Y Y均为均为8 8位二进制有符号数,位二进制有符号数,分别存在分别存在30H30H31H31H中,试编制能实现下列符号函中,试编制能实现下列符号函数的程序:数的程序:实现程序如下实现程序如下:【例例4 46 6】将将ASCIIASCII码转换为十六进制数。设码转换
16、为十六进制数。设ASCIIASCII码放在累加器码放在累加器A A中,转换结果放到中,转换结果放到B B中。中。解:由解:由ASCIIASCII码表码表(表表1-4)1-4)可知,可知,30H30H39H39H为为0 09 9的的ASCIIASCII码,码,41H41H46H46H为为A AF F的的ASCIIASCII码。将码。将ASCIIASCII码减码减30H(030H(09)9)或或37H(A37H(AF)F)就可获得对应的就可获得对应的十六进制数。程序如下:十六进制数。程序如下:S0S0单独按下,单独按下,红灯亮红灯亮,其余灯其余灯灭;灭;S1S1单独按下,单独按下,绿灯亮绿灯亮,其
17、余其余灯灯灭;灭;其余情况,其余情况,黄灯亮。黄灯亮。【例例4.8】已知电路如图已知电路如图4-54-5所示,要求实现:所示,要求实现:解:程序如下解:程序如下SGNL:ANL P1,#11100011BSGNL:ANL P1,#11100011B;红绿黄灯灭红绿黄灯灭 ORL P1,#00000011BORL P1,#00000011B;置置P1.0P1.0、P1.1P1.1输入态输入态,P1.5P1.5P1.7P1.7状态不变状态不变SL0:JNB P1.0,SL1SL0:JNB P1.0,SL1 ;P1.0=0,S0;P1.0=0,S0未按下未按下,转判转判S1S1 JNB P1.1,R
18、ED JNB P1.1,RED ;P1.0=1,S0;P1.0=1,S0按下按下;且且P1.1=0,S1P1.1=0,S1未按下未按下,转红灯亮转红灯亮YELW:SETB P1.4YELW:SETB P1.4 ;黄灯亮黄灯亮 CLR P1.2CLR P1.2 ;红灯灭红灯灭 CLR P1.3CLR P1.3 ;绿灯灭绿灯灭 SJMP SL0SJMP SL0 ;转循环转循环SL1:JNB P1.1,YELWSL1:JNB P1.1,YELW ;P1.0=0,S0;P1.0=0,S0未按下未按下;P1.1=0,S1;P1.1=0,S1未按下未按下,转黄灯亮转黄灯亮GREN:SETB P1.3GRE
19、N:SETB P1.3 ;绿灯亮绿灯亮 CLR P1.2CLR P1.2 ;红灯灭红灯灭 CLR P1.4CLR P1.4 ;黄灯灭黄灯灭 SJMP SL0SJMP SL0 ;转循环转循环RED:SETB P1.2RED:SETB P1.2 ;红灯亮红灯亮 CLR P1.3CLR P1.3 ;绿灯灭绿灯灭 CLR P1.4CLR P1.4 ;黄灯灭黄灯灭 SJMP SL0SJMP SL0 ;转循环转循环 课堂练习题:课堂练习题:电路及灯亮灭要求同上述电路及灯亮灭要求同上述【例例】题,其中第题,其中第3 3、4 4两条指令两条指令JNB P1.0JNB P1.0和和JNB P1.1JNB P1.
20、1按下列要求修改,按下列要求修改,试重新编程。试重新编程。JBJBP1.0P1.0,JBJBP1.1P1.1,JBJBP1.0P1.0,JNB P1.1JNB P1.1,JNB P1.0JNB P1.0,JBJBP1.1P1.1,循环程序一般包括以下几个部分:循环程序一般包括以下几个部分:循环初值;循环初值;循环体;循环体;循环修改;循环修改;循环控制;循环控制;以上四部分可以有两种组织形式,以上四部分可以有两种组织形式,其结构如其结构如图图4-64-6所所示。示。三三.循环程序循环程序【例例4.10】设设XiXi均为单字节数,并按顺序存放在以均为单字节数,并按顺序存放在以50H50H为首地址
21、的内为首地址的内RAMRAM存储单元中,数据长度(个数)存储单元中,数据长度(个数)N N存存在在R2R2中,试编程求和中,试编程求和S=XS=X1 1+X+X2 2+X+XN N,并将并将S S(双字双字节)存放在节)存放在R3R4R3R4中,(设中,(设S S6553665536)。)。解:程序如下:解:程序如下:SXN:MOV R2,#NSXN:MOV R2,#N ;置数据长度置数据长度(循环次数循环次数)MOV R3,#00H MOV R3,#00H;和单元和单元(高高8 8位位)清清0 0 MOV R4,#00H MOV R4,#00H;和单元和单元(低低8 8位位)清清0 0 MO
22、V R0,#50H MOV R0,#50H;求和数据区首址求和数据区首址LOOP:MOV A,R4LOOP:MOV A,R4 ;读前次低读前次低8 8位和位和 ADD A,R0ADD A,R0 ;低低8 8位累加位累加 MOV R4,AMOV R4,A ;存低存低8 8位和位和 CLR A CLR A ;ADDC A,R3 ADDC A,R3 ;高高8 8位加进位位加进位 MOV R3,A MOV R3,A ;存高存高8 8位和位和 INC R0 INC R0 ;指向下一数据指向下一数据 循环修改循环修改 DJNZ R2,LOOP DJNZ R2,LOOP;判判N N个数据累加完否?个数据累加
23、完否?循环控制循环控制 RET RET ;退出循环退出循环 退出循环退出循环 置置循循环环初初值值循循环环体体简单循环结构:循环体中不套循环。简单循环结构:循环体中不套循环。例例4-114-11:求:求n n个单字节数据的累加,设数据串已在个单字节数据的累加,设数据串已在43H43H起始起始单元,数据串长度在单元,数据串长度在42H42H单元,累加和不超过单元,累加和不超过2 2个字节。个字节。SUMSUM:MOVMOVR0R0,#42H#42H;设指针设指针MOVMOVA A,R0R0MOVMOVR2R2,A A ;循环计数器循环计数器n nCLRCLRA A ;结果单元清结果单元清0 0M
24、OVMOVR3R3,A AADD1ADD1:INCINCR0R0 ;修改指针修改指针ADDADDA A,R0 R0 ;累加累加JNC NEXTJNC NEXT ;处理进位处理进位INCINCR3R3 ;有进位,高字节加有进位,高字节加1 1NEXT:NEXT:DJNZ DJNZ R2,ADD1 R2,ADD1;循环控制:数据是否加完循环控制:数据是否加完?MOVMOV40H40H,A A ;循环结束,保存结果循环结束,保存结果MOVMOV41H41H,R3R3RETRET【例例4 41212】设在内设在内RAM 40HRAM 40H开始的存储区有若干个字符开始的存储区有若干个字符和数字,已知最
25、后一个为字符和数字,已知最后一个为字符“$”(并且只有惟一一个并且只有惟一一个),试统计这些字符和数字的个数,统计结果存人试统计这些字符和数字的个数,统计结果存人30H30H单元。单元。解:程序如下:解:程序如下:【例例4 41313】内部内部RAM 20HRAM 20H单元开始存有单元开始存有8 8个数,个数,试找出其中最大的数,送入试找出其中最大的数,送入MAXMAX单元。单元。解:程序如下:解:程序如下:特征控制:设定循环结束标志实现循环控制。特征控制:设定循环结束标志实现循环控制。例例4-144-14:找正数表最小值。正数表存在片外:找正数表最小值。正数表存在片外RAMRAM中以中以L
26、ISTLIST为起始单元,用为起始单元,用-1-1作为结束标志。作为结束标志。STARTSTART:MOVMOVDPTRDPTR,#LIST#LIST ;数表首地址数表首地址 MOVMOVB B,#127#127 ;预置最小值预置最小值NEXTNEXT:MOVX AMOVX A,DPTRDPTR ;取数取数 INCINCDPTRDPTR ;修改指针修改指针 CJNE ACJNE A,#-1#-1,NEXT1NEXT1;是否为数表结尾?是否为数表结尾?SJMP DONESJMP DONE ;循环结束循环结束NEXT1NEXT1:CJNE ACJNE A,B B,NEXT2NEXT2 ;比较比较N
27、EXT2NEXT2:JNCJNCNEXT ;C=0NEXT ;C=0时时,A,A大转大转NEXTNEXT MOV MOVB B,A A ;保存较小值保存较小值 SJMP NEXTSJMP NEXTDONEDONE:SJMP DONESJMP DONE习题习题统计一班考试为统计一班考试为100100分和不及格人数,成绩单在分和不及格人数,成绩单在41H41H起始单元。起始单元。当用当用PCPC作基址寄存器时作基址寄存器时,其表格首地址与,其表格首地址与PCPC值间距值间距不能超过不能超过256256字节,且编程要事先计算好偏移量,比较麻字节,且编程要事先计算好偏移量,比较麻烦。烦。因此,一般情况
28、下用因此,一般情况下用DPTRDPTR作基址寄存器作基址寄存器。四四.查表程序查表程序用于查表的指令有两条:用于查表的指令有两条:MOVC A,A+MOVC A,A+DPTRDPTR MOVC A,A+MOVC A,A+PCPC 当用当用DPTRDPTR作基址寄存器时作基址寄存器时,查表的步骤分三步:,查表的步骤分三步:基址值(表格首地址)基址值(表格首地址)DPTRDPTR;变址值(表中要查的项与表格首地址之间的变址值(表中要查的项与表格首地址之间的 间隔字间隔字节数)节数)A A;执行执行MOVC AMOVC A,A+DPTRA+DPTR。解:编程如下:解:编程如下:CHAG:MOV DP
29、TR,#TABDCHAG:MOV DPTR,#TABD;置共阴字段码表首址置共阴字段码表首址MOV A,30H MOV A,30H ;读显示数字读显示数字 MOVC A,A+DPTR MOVC A,A+DPTR;查表查表,转换为显示字段码转换为显示字段码 MOV 30H,A MOV 30H,A ;存显示字段码存显示字段码TABD:DB 3FH,06H,5BH,4FH,66HTABD:DB 3FH,06H,5BH,4FH,66H;0;04 4共阴字段码表共阴字段码表 DB 6DH,7DH,07H,7FH,6FHDB 6DH,7DH,07H,7FH,6FH;5;59 9共阴字段码表共阴字段码表 E
30、NDEND【例例4.15】在单片机应用系统中,常用在单片机应用系统中,常用LEDLED数码管显数码管显示数码,但显示数字示数码,但显示数字(9)9)与显示数字编码并不相同,与显示数字编码并不相同,需要将显示数字转换为显示字段码,通常是用查表需要将显示数字转换为显示字段码,通常是用查表的方法。现要求将的方法。现要求将30H30H中的显示数字转换为显示字段中的显示数字转换为显示字段码并存入码并存入30H30H。已知共阴字段码表首址为已知共阴字段码表首址为TABDTABD。【课堂练习题课堂练习题】已知已知8 8位显示数字已存入首址为位显示数字已存入首址为30H30H的内的内RAMRAM中,试将其转换
31、为共阴显示字中,试将其转换为共阴显示字段码,存入首址为段码,存入首址为40H40H的内的内RAMRAM中。中。解:编程如下:解:编程如下:CUBE:CUBE:MOV DPTR,#TAB MOV DPTR,#TAB;置立方表首址置立方表首址MOV A,30HMOV A,30H ;读数据读数据ADD A,30HADD A,30H ;数据数据2A2AMOV 30H,AMOV 30H,A ;暂存立方表数据序号暂存立方表数据序号 MOVC A,A+DPTRMOVC A,A+DPTR;读立方数据高读立方数据高8 8位位XCH A,30H XCH A,30H ;存立方数据高存立方数据高8 8位位,立方表数据
32、序号立方表数据序号 ;A;AINC AINC A ;指向立方数据低指向立方数据低8 8位位MOVC A,A+DPTR MOVC A,A+DPTR;读立方数据低读立方数据低8 8位位 MOV 31H,AMOV 31H,A ;存立方数据低存立方数据低8 8位位TAB:DB 0,0,0,1,0,8,0,27,0,64 TAB:DB 0,0,0,1,0,8,0,27,0,64 ;0;04040立方表立方表 DB 0,125,0,216,DB 0,125,0,216,0FAH,00H,0FAH,00H;END END说明:数据说明:数据2A2A原因是立方表数据为双字节原因是立方表数据为双字节【例例4.1
33、6】用查表程序求用查表程序求0 04040之间整数的立方。已知该整之间整数的立方。已知该整数存在内数存在内RAM 30HRAM 30H中,查得立方数存内中,查得立方数存内RAM 30HRAM 30H(高(高8 8位)位)31H31H。已知立方表已知立方表(双字节双字节)首地址为首地址为TABTAB。例例 4-17 设设有有一一个个巡巡回回检检测测报报警警装装置置,需需对对 96 路路输输入入进进行行控控制制,每每路路有有一一个个额额定定的的最最大大值值,是是双双字字节节数数。当当检检测测量量大大于于该该路路对对应应的的最最大大值值时时,就就越越限限报报警警。假假设设R2 为为保保存存检检测测路
34、路数数的的寄寄存存器器,其其对对应应的的最最大大额额定定值值存存放放于于 31H和和 32H单单元中。元中。查找最大额定值查找最大额定值的程序如下的程序如下:FMAX:MOV A,R2 ADD A,R2 ;表中一个额定值为表中一个额定值为2个字节个字节 MOV 31H,A MOV DPTR,TAB;表首址表首址 MOVC A,A+DPTR;查表读取第一个字节查表读取第一个字节 XCH A,31H ;第一个字节内容存入第一个字节内容存入31H INC DPTR MOVC A,A+DPTR;查表读取第二个字节查表读取第二个字节 MOV 32H,A;第二字节的内容存入第二字节的内容存入32H TAB
35、:DW 1230H,1450H,.DW 2230H,2440H,.DW 3120H,3300H,.散散转转程程序序是是分分支支程程序序的的一一种种,它它可可根根据据运运算算结结果果或或输输入入数数据据将将程程序序转转入入不不同同的的分分支支。MCS-51 指指令令系系统统中中有有一一条条跳跳转转指指令令JMPA+DPTR,用用它它可可以以很很容容易易地地实实现现散散转转功功能能。该该指指令令把把累累加加器器的的 8 位位无无符符号号数数与与 16 位位数数据据指指针针的的内内容容相相加加,并并把把相相加加的的结结果果装装入入程程序序计计数数器器PC,控控制制程程序序转转向向目目标标地地址址去去
36、执执行行。此此指指令令的的特特点点在在于于,转转移移的的目目标标地地址址不不是是在在编编程程或或汇汇编编时时预预先先确确定定的的,而而是是在在程程序序运运行行过过程程中中动动态态地地确确定定的的。目目标标地地址址是是以以数数据据指指针针 DPTR的的内内容容为为起起始始的的 256 字字节节范范围围内内的的指指定定地地址址,即即由由 DPTR的的内内容容决决定定分分支支转转移移程程序序的的首首地地址址,由由累累加加器器 A的的内内容容来来动动态态选选择择其其中中的的某某一一个个分分支支转转移程序。移程序。五五.散转程序散转程序 例例 根根据据工工作作寄寄存存器器R0 内内容容的的不不同同,使使
37、程程序序转转入入相相应应的分支。的分支。(R0)=0 对应的分支程序标号为对应的分支程序标号为PR0;(R0)=1 对应的分支程序标号为对应的分支程序标号为PR1;(R0)=N 对应的分支程序标号为对应的分支程序标号为PRN。程序如下程序如下:LP0:MOV DPTR,TAB ;取表头地址取表头地址 MOV A,R0 ADD A,R0 ;R0内容乘以内容乘以2JMP A+DPTR;跳至散转表中相应位置跳至散转表中相应位置 TAB:AJMP PR0 AJMP PR1 AJMP PRN 在单片机系统中设置在单片机系统中设置+、四个运算命四个运算命令键,它们的键号分别为令键,它们的键号分别为0 0、
38、1 1、2 2、3 3。当其中一。当其中一个键按下时,进行相应的运算。操作数由个键按下时,进行相应的运算。操作数由P1P1口和口和P3P3口输入,运算结果仍由口输入,运算结果仍由P1P1口和口和P3P3口输出。具体口输出。具体如下:如下:P1P1口输入被加数、被减数、被乘数和被除口输入被加数、被减数、被乘数和被除数,输出运算结果的低数,输出运算结果的低8 8位或商;位或商;P3P3口输入加数、口输入加数、减数、乘数和除数,输出进位(借位)、运算结减数、乘数和除数,输出进位(借位)、运算结果的高果的高8 8位或余数。键盘号已存放在位或余数。键盘号已存放在30H30H中。中。散转程序是散转程序是一
39、种并行多分支程序。一种并行多分支程序。【例例4-18】单片机四则运算系统。单片机四则运算系统。解:程序如下:解:程序如下:PRGM:MOV P1,#0FFH PRGM:MOV P1,#0FFH ;P1;P1口置输入态口置输入态 MOV P3,#0FFH MOV P3,#0FFH ;P3;P3口置输入态口置输入态 MOV DPTR,#TBJ MOV DPTR,#TBJ ;置置“”表首地址表首地址 MOV A,30H MOV A,30H ;读键号读键号 RL A RL A ;键号键号 2A2A ADD A,30H ADD A,30H ;键号键号 3A3A JMP A+DPTR JMP A+DPTR
40、 ;散转散转TBJ:LJMP TBJ:LJMP PRGM0PRGM0 ;转转PRGM0(PRGM0(加法加法)LJMP LJMP PRGM1PRGM1 ;转转PRGM1(PRGM1(减法减法)LJMP LJMP PRGM3PRGM3 ;转转PRGM3(PRGM3(除法除法)LJMP LJMP PRGM2PRGM2 ;转转PRGM2(PRGM2(乘法乘法)PRGM0:MOV A,P1 PRGM0:MOV A,P1 ;读加数读加数 ADD A,P3 ADD A,P3 ;P1+P3;P1+P3 MOV P1,A MOV P1,A ;和和P1P1 CLR A CLR A ;ADDC A,#00H AD
41、DC A,#00H ;进位进位A A MOV P3,A MOV P3,A ;进位进位P3P3 RET RET ;PRGM1:MOV A,P1 PRGM1:MOV A,P1 ;读被减数读被减数 CLR C CLR C ;SUBB A,P3 SUBB A,P3 ;P1-P3;P1-P3 MOV P1,A MOV P1,A ;差差P1P1 CLR A CLR A ;RLC A RLC A ;借位借位A A MOV P3,A MOV P3,A ;借位借位P3P3 RET RET ;PRGM2:MOV A,P1 PRGM2:MOV A,P1 ;读被乘数读被乘数MOV B,P3 MOV B,P3 ;置乘数
42、置乘数 MUL ABMUL AB;P1;P1P3P3 MOV P1,A MOV P1,A;积低积低8 8位位P1P1 MOV P3,B MOV P3,B;积高积高8 8位位P3P3 RET RET;PRGM3:MOV A,P1 PRGM3:MOV A,P1 ;读被除数读被除数 MOV B,P3 MOV B,P3 ;置除数置除数 DIV ABDIV AB;P1;P1P3P3 MOV P1,A MOV P1,A ;商商P1P1 MOV P3,B MOV P3,B ;余数余数P3P3 RET RET ;说明:由于说明:由于LJMPLJMP为为3 3字节指令,因此键号需先乘字节指令,因此键号需先乘3
43、3,以便转到正确的位置。以便转到正确的位置。例例4-19 4-19 比较两个数据串是否完全相等,若比较两个数据串是否完全相等,若完全相等,完全相等,A=0A=0;否则否则A=FFHA=FFH。PMTPMT:MOVMOVR2R2,A A;设数串长度设数串长度CHCCHC:MOVMOVA A,R0R0;各取数串中的一个数各取数串中的一个数MOVMOV42H42H,R1R1CJNE CJNE A A,42H42H,NOMNOM;是否相等?不相等转移是否相等?不相等转移INCINCR0R0;相等,修改指针相等,修改指针INCINCR1R1DJNZ DJNZ R2R2,CHCCHC;全部比较完?全部比较
44、完?MOVMOVA A,#0#0;完全相等完全相等SJMP SJMP PENDPENDNOMNOM:MOVMOVA A,#0FFH#0FFH;不完全相等不完全相等PENDPEND:RETRET【例例4.20】已知已知P1P1口数据每隔口数据每隔10ms10ms刷新一次,刷新一次,试求其试求其1s1s内的平均值内的平均值,平均值存平均值存30H30H。解:本题需求解:本题需求100100个数据的平均值,个数据的平均值,一般有两种方法:一般有两种方法:一种是全部累加后再平均;一种是全部累加后再平均;另一种是边平均边累加,另一种是边平均边累加,现给出两种方法的程序。现给出两种方法的程序。AVRG1:
45、MOV R2,#0AVRG1:MOV R2,#0 ;低低8 8位累加寄存器清位累加寄存器清0 0 MOV R3,#0 MOV R3,#0 ;高高8 8位累加寄存器清位累加寄存器清0 0 MOV R4,#100 MOV R4,#100 ;置平均次数置平均次数ALOP:MOV A,P1ALOP:MOV A,P1;读读P1P1口数据口数据 ADD A,R2ADD A,R2;低低8 8位累加位累加 MOV R2,AMOV R2,A;回存回存 CLR ACLR A;高高8 8位与进位累加位与进位累加 ADDC A,R3ADDC A,R3;MOV R3,A MOV R3,A;回存回存 LCALL DY10
46、msLCALL DY10ms ;延时延时10ms10ms DJNZ R4,ALOP DJNZ R4,ALOP;判判100100次累加完否?未完继续次累加完否?未完继续 MOV A,R3MOV A,R3;100;100次累加完次累加完,求平均值求平均值,被除数被除数A A、B B MOV B,R2 MOV B,R2;MOV R0,30H MOV R0,30H ;置商间址置商间址 MOV R6,#0MOV R6,#0;置除数置除数100,100,除数除数R6R5R6R5 MOV R5,#100 MOV R5,#100;LCALL SUM LCALL SUM;(A;(A、B)B)(R6(R6、R5)
47、=R5)=商商 R0,R0,余数余数A A CJNE A,#50,NEXT CJNE A,#50,NEXT;四舍五入四舍五入NEXT:JCNEXT:JC GRET GRET;C=1,;C=1,50,50,舍舍 INCINC 30H 30H;C=0,50,;C=0,50,入入GRET:RETGRET:RET;全全部部累累加加后后再再平平均均注:SUM子程序可参阅例4-9AVRG2:AVRG2:MOV MOV 30H,#030H,#0;商累加寄存器清商累加寄存器清0 0MOVMOV31H,#031H,#0;余数累加寄存器清余数累加寄存器清0 0 MOVMOVR4,#100R4,#100;置平均次数
48、置平均次数ALOP:ALOP:MOVMOVA,P1A,P1;读读P1P1口数据口数据 MOVMOVB,#100B,#100;置除数置除数(平均次数平均次数)DIVDIVABAB;P1;P1口数据除以口数据除以100100ADDADDA,30HA,30H;商累加商累加MOV MOV 30H,A30H,A;回存回存MOV MOV A,BA,B;ADDADDA,31HA,31H;余数累加余数累加MOVMOV31H,A31H,A;回存回存CLRCLRC C;SUBBSUBBA,#100A,#100;JCJCGONGON;余数累加余数累加100,100,余数累加寄存器不变余数累加寄存器不变INCINC3
49、0H30H;余数累加余数累加100,100,商累加寄存器商累加寄存器+1+1MOVMOV31H,A31H,A;减去减去100100后差后差余数累加寄存器余数累加寄存器GON:GON:LCALLLCALLDY10msDY10ms;延时延时10ms10msDJNZDJNZR4,ALOPR4,ALOP ;判判100100次累加完否?未完继续次累加完否?未完继续MOVMOVA,31HA,31H;100;100次累加完毕次累加完毕,余数累加四舍五入余数累加四舍五入CJNECJNEA,#50,NEXTA,#50,NEXT;NEXT:NEXT:JCJCGRETGRET;C=1,;C=1,50,50,舍舍IN
50、CINC30H30H;C=0,50,;C=0,50,入入GRET:GRET:RET RET ;边边平平均均边边累累加加多重循环多重循环:循环体中套循环结构。以双重循环使用较多。循环体中套循环结构。以双重循环使用较多。例例4-21:4-21:将内存一串单字节无符号数升序排序。将内存一串单字节无符号数升序排序。步骤步骤:每次取相邻单元的两个数比较,决定是否需要交换数据位置。每次取相邻单元的两个数比较,决定是否需要交换数据位置。第一次循环,比较第一次循环,比较N-1N-1次,取到数据表中最大值。次,取到数据表中最大值。第二次循环,比较第二次循环,比较N-2N-2次,取到次大值。次,取到次大值。第第N