MCS51-汇编语言程序设计_第1页
MCS51-汇编语言程序设计_第2页
MCS51-汇编语言程序设计_第3页
MCS51-汇编语言程序设计_第4页
MCS51-汇编语言程序设计_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机原理及应用 汇编语言程序设计测控技术与仪器教研室 王民慧第第4章章 汇编语言程序设计汇编语言程序设计 4.1 4.1 汇编语言的构成汇编语言的构成4.2 4.2 汇编语言源程序的汇编语言源程序的设计与汇编设计与汇编4.3 4.3 简单与分支程序设计简单与分支程序设计4.4 4.4 循环与查表程序循环与查表程序设计设计4.5 4.5 子程序与运算程序设计子程序与运算程序设计4.6 4.6 程序设计举例程序设计举例4.14.1汇编语言的构成汇编语言的构成 一、程序设计语言一、程序设计语言 1 1机器语言机器语言机器语言是用二进制代码表示的计机器语言是用二进制代码表示的计算机能直接识别和执行的

2、一种机器指令算机能直接识别和执行的一种机器指令的集合。的集合。机器语言能被计算机直接识别和执机器语言能被计算机直接识别和执行,但是不便于记忆,不易阅读,容易行,但是不便于记忆,不易阅读,容易出错。出错。 2 2汇编语言汇编语言用英文字母组成用英文字母组成的助记符表示操作的助记符表示操作码码用符号代替地址用符号代替地址汇编语言汇编语言汇编语言程序汇编语言程序执行速度比较快,执行速度比较快,不能脱离具体的机不能脱离具体的机器器汇编语言汇编语言(Assembly Language)(Assembly Language)是一种低级的面向是一种低级的面向机器的程序设计语言。机器的程序设计语言。3 3高级

3、语言高级语言 高级语言,例如高级语言,例如BASICBASIC、FORTRANFORTRAN、PASCALPASCAL及及C C语言等,是参照数学语言而设计语言等,是参照数学语言而设计的近似于日常会话的语言,不但直观,易学的近似于日常会话的语言,不但直观,易学易懂,而且通用性强,容易移植到不同类型易懂,而且通用性强,容易移植到不同类型的机器上。的机器上。 源程序源程序 目标程序目标程序 低级语言低级语言机器语言机器语言汇编汇编高级语言高级语言机器语言机器语言编译编译反汇编反汇编反编译反编译二、二、 汇编语言语句格式汇编语言语句格式汇编语言的语句一般由四部分组成,其格式如下:汇编语言的语句一般由

4、四部分组成,其格式如下: 标号:操作码标号:操作码 操作数操作数 ;注释;注释 (1 1)标号)标号 指令地址的标志符号,通常由指令地址的标志符号,通常由1 18 8个字符组成。第一个个字符组成。第一个字符必须是字母,其它可以是字母、数字或者下划线等,与字符必须是字母,其它可以是字母、数字或者下划线等,与指令操作码之间用冒号指令操作码之间用冒号“:”隔开。隔开。不能用指令助记符、伪不能用指令助记符、伪指令或寄存器名来作标号。指令或寄存器名来作标号。 (2 2)操作码)操作码 操作码是指令的助记符,用来说明语句执行什么操作,操作码是指令的助记符,用来说明语句执行什么操作,也可以是伪指令,与后面的

5、操作数之间用空格分开。也可以是伪指令,与后面的操作数之间用空格分开。 (3 3)操作数)操作数 操作数是指参加运算(或其它操作)的数据或数据的地操作数是指参加运算(或其它操作)的数据或数据的地址。一条语句中可以无操作数,也可以有一个或者二个操作址。一条语句中可以无操作数,也可以有一个或者二个操作数。两个操作数之间,用逗号数。两个操作数之间,用逗号“,”隔开。隔开。 (4 4)注释)注释 由分号由分号“;”开头,是说明语句或程序段的功能或性质开头,是说明语句或程序段的功能或性质的文字,不属语句功能部分。的文字,不属语句功能部分。三、三、 汇编语言构成汇编语言构成 在汇编语言源程序中用在汇编语言源

6、程序中用MCS-51MCS-51指令助记指令助记符编写的程序,一般都可以一一对应地符编写的程序,一般都可以一一对应地产生产生机器码机器码,这种指令是,这种指令是真正意义上的指令真正意义上的指令。 如:如:MOV AMOV A,#68H#68H的机器码为的机器码为74H74H、68H68H LJMP 2000HLJMP 2000H的机器码为的机器码为02H02H、20H20H、00H00H 但还有一些指令不产生机器码,即没有但还有一些指令不产生机器码,即没有对应的机器码,也就是说它不是对应的机器码,也就是说它不是CPUCPU能执行能执行的指令,只是提供汇编控制信息,以便在的指令,只是提供汇编控制

7、信息,以便在汇编时执行一些特殊的操作,这种指令称汇编时执行一些特殊的操作,这种指令称为为伪指令伪指令。 如:如:1000H1000H: DB 20H DB 20H 没有对应的没有对应的机器码,但这条伪指令所要完成的功能是机器码,但这条伪指令所要完成的功能是将地址为将地址为1000H1000H的存储单元的内容定义成的存储单元的内容定义成20H20H。 1. 1. 汇编起始地址命令汇编起始地址命令ORGORG 格式:格式:ORG 16ORG 16位地址位地址 用在源程序或数据块的前面,说明源程序或数用在源程序或数据块的前面,说明源程序或数据块汇编后在存储器中存放的起始地址。据块汇编后在存储器中存放

8、的起始地址。1616位地址位地址一般为绝对地址,也可以用标号或表达式表示。源一般为绝对地址,也可以用标号或表达式表示。源程序中如果有多个程序中如果有多个ORGORG伪指令,其地址由小到大,不伪指令,其地址由小到大,不能重叠。如果没有能重叠。如果没有ORGORG伪指令,则汇编得到的目的程伪指令,则汇编得到的目的程序将从序将从0000H0000H单元开始存放。单元开始存放。 例如:例如: ORG 2000H MOV SP, 60H( 栈指针寄存器栈指针寄存器SP的地址的地址=81H ) MOV R0, 2FH MOV R2, 0FFH ORG伪指令说明其后面程序的目标代码在程序存储器中存伪指令说明

9、其后面程序的目标代码在程序存储器中存放的起始地址是放的起始地址是2000H, 即即 存储器地址存储器地址 目标程序目标程序 2000H 75 81 60 2003H 78 2F 2005H 7A FF :758160782F7AFF:程序存储器程序存储器2000H2006H 2. 2.汇编结束命令汇编结束命令ENDEND 格式:格式: 标号:标号: END END 标号标号 用在源程序的末尾,表示汇编结束。用在源程序的末尾,表示汇编结束。ENDEND命令通命令通知汇编程序结束汇编。在知汇编程序结束汇编。在ENDEND之后,所有的汇编语言之后,所有的汇编语言指令均不予以处理。指令均不予以处理。如

10、果如果ENDEND用在子程序末尾,其后用在子程序末尾,其后的标号可以省去,如果用在主程序的末尾,其后的的标号可以省去,如果用在主程序的末尾,其后的标号应当是该主程序第一条指令的符号地址。一个标号应当是该主程序第一条指令的符号地址。一个源程序只能有一个源程序只能有一个ENDEND伪指令。伪指令。 方括号表示任选项。方括号表示任选项。 每一个完整的汇编语言源程序的后面必每一个完整的汇编语言源程序的后面必须有须有ENDEND,否则,编译程序在对汇编语言源程,否则,编译程序在对汇编语言源程序进行编译时,因找不到尾端而无法进行编序进行编译时,因找不到尾端而无法进行编译。译。3. 3. 定义字节数据命令定

11、义字节数据命令DBDB格式:格式: 标号:标号: DB 8 DB 8位数据项或数据项表位数据项或数据项表其中,其中,数据数据项或项或数据数据项表是指一个字节的数、项表是指一个字节的数、字符串或以引号括起来的字符串或以引号括起来的ASCIIASCII码字符串码字符串( (一个字符一个字符用用ASCIIASCII码表示,就相当于一个字节码表示,就相当于一个字节) )。 该指令的功能是把项或项表的数值存入从该指令的功能是把项或项表的数值存入从标号开始的连续单元中,标号开始的连续单元中,用来定义字节数据或用来定义字节数据或ASCIIASCII码字符。码字符。例如:例如: ORG 1000H SEG1:

12、 DB 53H,78H,2 SEG2: DB DAY END则:则: (1000H)=53H (1001H)78H (1002H)=32H (1003H)44H (1004H)=41H (1005H)=59H 并且并且SEG1代表代表1000H、SEG2代表代表1003H注意:作为操作数部分的项或项表,若为数值,其取值范注意:作为操作数部分的项或项表,若为数值,其取值范围应为围应为0000FFHFFH;若为字符串,其长度应限制在;若为字符串,其长度应限制在8080个字符个字符内。内。:537832444159:程序存储器程序存储器1000H1005H 汇编时,汇编时,DBDB伪指令中的数据依次

13、存入标号伪指令中的数据依次存入标号SEG1SEG1和和SEG2SEG2所指示的字节区域中。这里,所指示的字节区域中。这里,SEG1SEG1表示的表示的地址为地址为1000H1000H。后一。后一DBDB伪指令中的数紧跟在前一伪伪指令中的数紧跟在前一伪指令中最后一个数据项的后面。指令中最后一个数据项的后面。4 4. . 定义双倍字节数据命令定义双倍字节数据命令DWDW格式:格式: 标号:标号: DW 16 DW 16位数据项或数据项表位数据项或数据项表DWDW的基本含义与的基本含义与DBDB相同,不同的是相同,不同的是DWDW定义定义1616位数据,位数据,常用来建立地址表,常用来建立地址表,用

14、来定义用来定义1616位的双字节数据。位的双字节数据。例如:例如: ORG 2010H DW 2583H,7589H END程序汇编后,数据存放如下:程序汇编后,数据存放如下: (2010H)=25H (2011H)=83H (2012H)=75H (2013H)=89H5. 5. 定义存储区命令定义存储区命令DSDS格式:格式: 标号:标号: DS 16 DS 16位数或表达式位数或表达式用来预留若干个空白存储单元。用来预留若干个空白存储单元。该指令的功能该指令的功能是由标号指定单元开始,定义一个存储区,以备是由标号指定单元开始,定义一个存储区,以备源程序使用。存储区内预留的存储单元个数由表

15、源程序使用。存储区内预留的存储单元个数由表达式的值决定。达式的值决定。例如例如 TAB DS 10TAB DS 10从从TABTAB代表的地址开始保留代表的地址开始保留1010个空白存储单元。个空白存储单元。6. 6. 赋值命令赋值命令EQUEQU格式:符号名格式:符号名 EQU EQU 数据或表达式数据或表达式把把EQUEQU右边的数据或表达式赋给左边的符号名。右边的数据或表达式赋给左边的符号名。 赋值后的符号名可以是数据、地址或表达式。赋值后的符号名可以是数据、地址或表达式。例如例如 REG EQU R0REG EQU R0 MOV A MOV A,REGREG等价于等价于 MOV AMO

16、V A,R0R0 7. 7. 数据地址赋值命令数据地址赋值命令DATADATA 格式:符号名格式:符号名 DATA DATA 数据或表达式数据或表达式 把把DATADATA右边的数据或表达式赋给左边的符号名。在右边的数据或表达式赋给左边的符号名。在使用时与上述使用时与上述EQUEQU伪指令有些相似,但也有区别:伪指令有些相似,但也有区别: (1 1)EQU EQU 定义的标识符必须先定义后使用,因其汇定义的标识符必须先定义后使用,因其汇编时不登记在符号表中。而编时不登记在符号表中。而DATADATA伪指令定义的符号名可伪指令定义的符号名可以先使用后定义,因其汇编时登记在符号表中。以先使用后定义

17、,因其汇编时登记在符号表中。 (2 2)EQU EQU 伪指令可以把汇编符号赋给符号名,而伪指令可以把汇编符号赋给符号名,而DATADATA伪指令则不可以。伪指令则不可以。(3 3) DATADATA可以把一个表达式赋给字符名,只要表达可以把一个表达式赋给字符名,只要表达式是可求值的。式是可求值的。 DATADATA常用来在程序中定义数据地址。常用来在程序中定义数据地址。例如:例如: MAIN DATA 2000HMAIN DATA 2000H MAIN0 DATA MAIN+8 MAIN0 DATA MAIN+8 汇编后:汇编后: MAINMAIN的值为的值为2000H2000H MAIN0

18、 MAIN0的值为的值为2008H2008H 8. 8. 位定义命令位定义命令BITBIT 格式:符号名格式:符号名 BIT BIT 位地址或符号地址位地址或符号地址 把把BITBIT右边的位地址赋给左边符号名。定右边的位地址赋给左边符号名。定义后可用符号名表示右边的位地址。义后可用符号名表示右边的位地址。例如:例如: MN BIT Pl.7MN BIT Pl.7 G5 BIT 02H G5 BIT 02H 汇编后,位地址汇编后,位地址P1.7P1.7、02H02H分别赋给变分别赋给变量量MNMN和和G5G5。 在进行位操作时在进行位操作时MNMN和和P1.7P1.7、G5G5和和02H02H

19、的的意义完全相同。意义完全相同。 1、n读下面程序,指出执行各伪指令后相读下面程序,指出执行各伪指令后相关单元对应内容是什么?未知内容用关单元对应内容是什么?未知内容用“XX”表示。表示。ORG 0F00HDS 05HDB 0,1,4,9DW 1625HDB 0,1,4,9END2、指出下面一条指令的各部分的名称,并说明、指出下面一条指令的各部分的名称,并说明每部分的功能。每部分的功能。MAIN:ORL 56H,#56HXX,XX,XX,XX,XX00H,01H,04H,09H1625H30H,31H,34H,39H标号标号 操作码操作码 目的操作数目的操作数 源操作数源操作数4 4. .2

20、2 汇编语言源程序的设计与汇编汇编语言源程序的设计与汇编 汇编语言源程序的设计步骤汇编语言源程序的设计步骤 汇编语言源程序的汇编汇编语言源程序的汇编 一、一、汇汇编编语语言言源源程程序序的的计计步步骤骤 汇编语言程序设计实例引入n实例实例假设一个班有假设一个班有50个人,个人,共有共有3门选修课:门选修课:计算机算法计算机算法CAD设计设计单片机单片机请找出:请找出:同时选了三门课的同学;同时选了三门课的同学;重复重复49次次找出第一个学生找出第一个学生他选他选CADCAD吗?吗?他选单片机吗?他选单片机吗?记录要找的人记录要找的人还有学生吗?还有学生吗?下一个学生下一个学生N NN NY Y

21、N NY YY Y结束结束他选算法吗?他选算法吗?N NY Y符合人进行逻辑思考的习惯符合人进行逻辑思考的习惯计算机从根本上来说,没有任何逻辑计算机从根本上来说,没有任何逻辑性,性,所以,你必须告诉它,先做什么,所以,你必须告诉它,先做什么,后做什么,遇到什么情况又该做什么,后做什么,遇到什么情况又该做什么,等等等等流程图设计本身是一个逐步求精的过流程图设计本身是一个逐步求精的过程,最终将任务划分为若干能由机器程,最终将任务划分为若干能由机器指令实现的小模块指令实现的小模块程序设计的基本步骤程序设计的基本步骤n题意分析题意分析n画出流程图画出流程图n分配内存及端口分配内存及端口n编制源程序编制

22、源程序n仿真、调试程序仿真、调试程序n固化程序固化程序二、汇编语言源程序的汇编二、汇编语言源程序的汇编1. 1. 人工汇编人工汇编 2. 2. 机器汇编机器汇编 汇编语言汇编语言源程序源程序.ASM编辑程序编辑程序EDLIN/记事本记事本 汇汇 编编 程程 序序列表文件列表文件.LST目标文件目标文件.HEX单片机单片机开发系统开发系统RS-232C接口接口汇编过程示意图汇编过程示意图4.3 4.3 简单与分支程序设计简单与分支程序设计 一、简单程序设计一、简单程序设计 简单程序设计简单程序设计是按照算法要求编写是按照算法要求编写的顺序执行的程序,也称为顺序结构程的顺序执行的程序,也称为顺序结

23、构程序。序。顺序结构程序是一种最简单、最基顺序结构程序是一种最简单、最基本的程序,按照程序编写的顺序依次执本的程序,按照程序编写的顺序依次执行,编写这类程序主要应注意行,编写这类程序主要应注意正确地选正确地选择指令择指令,提高程序的执行效率提高程序的执行效率和和尽可能尽可能节省存储空间节省存储空间。【例【例4.14.1】 试编写计算试编写计算Y=M+N-QY=M+N-Q的程序的程序 解:设解:设M M、N N、Q Q三个数分别存放在内部三个数分别存放在内部RAMRAM的的40H40H、41H41H和和42H42H单元中,根据题意要求,先作单元中,根据题意要求,先作M+NM+N运算,再作运算,再

24、作减减Q Q的运算,结果存入的运算,结果存入43H43H单元中,程单元中,程序流程图如右图所示,程序设计如下:序流程图如右图所示,程序设计如下:ORG 2000H ORG 2000H MOV A, 40H MOV A, 40H ;A AM MADD A, 41H ADD A, 41H ;A AM+NM+NCLR C CLR C ;C C0 0SUBB A,42H SUBB A,42H ;A AM+N-QM+N-QMOV 43HMOV 43H,A A ;存结果;存结果END END 结 束AM+N 开 始 AM AM+N-Q Y(A)Y=M+N-Q流程图二、二、 分支程序设计分支程序设计 分支程

25、序是根据不同的条件分支程序是根据不同的条件, ,执行执行不同的程序段。不同的程序段。分支结构程序可根据分支结构程序可根据程序要求无条件或有条件地改变程序程序要求无条件或有条件地改变程序执行的顺序,选择程序流向。执行的顺序,选择程序流向。 编写这类结构的程序要正确使用编写这类结构的程序要正确使用转移指令,即无条件转移、条件转移转移指令,即无条件转移、条件转移和散转。和散转。 多分支程序是指程序中有多个条件,在这种情况下,多分支程序是指程序中有多个条件,在这种情况下,先把分支程序编上序号,按照序号进行转移。设最大序号先把分支程序编上序号,按照序号进行转移。设最大序号为为N N,则分支转移结构如下图

26、所示。实现多分支程序转移的,则分支转移结构如下图所示。实现多分支程序转移的方法有多种。方法有多种。 多分支流程图转向分支0散转处理i=?转向分支1转向分支n-1转向分支n【例【例4.2】已知已知VARVAR(30H30H单元)中有一变量单元)中有一变量X X,要求,要求编写一程序按下述要求给编写一程序按下述要求给Y Y赋值,结果存入赋值,结果存入FUNCFUNC(31H31H)单元。)单元。 +1, X0 Y = 0 , X = 0 1 , X0题意:根据X的不同,程序编写时有三个出口,即有三个分支! 想一想:程序怎么编写?0000,00111000,0011正数标志位负数标志位(1)(1)使

27、用条件转移指令,通过逐次比较,实现多使用条件转移指令,通过逐次比较,实现多分支程序转移。分支程序转移。分支程序实例-三分支程序开始 XAA= 1 A= 1存结果结束YYNN程序框图:A0?A=0?分支程序实例-三分支程序 源程序如下: ORG 2000H MOV A,30H JZ LP1 ;X = 0,转LP1处理 JNB ACC.7,LP2 ;X0,转LP2处理 MOV A,#0FFH ;X0,则Y= 1 SJMP LP1 LP2:MOV A,#01 ;X 0,Y=1 LP1:MOV 31H,A ;存结果 SJMP $ ;循环等待,$表示转至 本地址,此方法适用 于一字节的偏移量最高位为符号

28、位。 (2 2)使用变址寻址的转移指令)使用变址寻址的转移指令JMPJMP A+DPTRA+DPTR实现多实现多分支转移。设置一个转向各分支程序的转移指令表,表分支转移。设置一个转向各分支程序的转移指令表,表首地址送入首地址送入DPTRDPTR。根据给定条件可得序号,送入累加器。根据给定条件可得序号,送入累加器A A,这样可设计出如下多分支程序。这样可设计出如下多分支程序。 RL A ;序号;序号2 2 MOV DPTR, TAB ;DPTR DPTR 表首地址表首地址 JMP A+DPTR TAB:AJMP ROUT0 ;转向分支程序;转向分支程序0 0 AJMP ROUT1 ;转向分支程序

29、;转向分支程序1 1 AJMP ROUTN ;转向分支程序;转向分支程序N N 程序清单如下:程序清单如下:JMP-128: MOV A,R7 RL A ;R7 2A (修正变址值修正变址值) MOV DPTR,JPTAB ;跳转表首送数据指针跳转表首送数据指针 JMP A+DPTR ;转向形成的散转地址人口转向形成的散转地址人口JPTAB : AJMP BRAN0 ;直接转移地址表直接转移地址表 AJMP BRAN1 . AJMP BRANn【例【例4.3】 128种分支转移程序。种分支转移程序。根据根据R7的内容,转向各自对应的操作程序的内容,转向各自对应的操作程序 (R7= 0,转入转入

30、BRAN0;R7= 1,转入,转入BRAN1R7= n,转入,转入BRANn)通过前面的学习,我们知道通过前面的学习,我们知道AJMP addr11是是2字节指令,字节指令,所以这里所以这里2。如果将如果将AJMP addr11换换成成LJMP addr16,则这,则这里里3。 (3 3)使用查表指令)使用查表指令MOVC A,A+DPTR获取获取转移地址到表首地址的偏移量,来实现多分支转移。转移地址到表首地址的偏移量,来实现多分支转移。这种方式须建立一个偏移量表,存放各分支程序首这种方式须建立一个偏移量表,存放各分支程序首地址到该表首地址的偏移量。程序执行时,根据给地址到该表首地址的偏移量。

31、程序执行时,根据给定条件确定序号定条件确定序号i i,送累加器,送累加器A A,再使用查表指令求,再使用查表指令求得分支程序首地址到该表首地址的偏移量,然后使得分支程序首地址到该表首地址的偏移量,然后使用变址寻址的转移指令,转向某一分支程序。用变址寻址的转移指令,转向某一分支程序。 MOV A, i MOV DPTR, TAB ;DPTRDPTR表首地址表首地址 MOVC A, A+DPTR ;A A偏移量偏移量 JMP A+DPTR ;转向某一分支程;转向某一分支程TAB: DB ROOT0-TAB DB ROOT1-TAB DB ROOTn-TAB ROOT0: ;分支程序;分支程序0 0

32、ROOT1: ;分支程序;分支程序1 1 ROOTn: ;分支程序;分支程序n n使用这种方法,分支程序首地址到表首地址的偏移量限制在使用这种方法,分支程序首地址到表首地址的偏移量限制在256256之内。之内。 (4 4)使用查表)使用查表指令指令MOVC AMOVC A,A+DPTRA+DPTR获取转移获取转移地址,来实现多分地址,来实现多分支转移。建立一个支转移。建立一个各分支程序首地址各分支程序首地址表,在序号表,在序号i i确定确定以后,乘以后,乘2 2,查表,查表,获取转移地址,然获取转移地址,然后转向某一分支程后转向某一分支程序:序: MOV DPTR, TAB ;DPTR表首地址

33、表首地址 RL ;序号;序号2 JNC HADD ;序号;序号2在在0255之间转移之间转移 INC DPH ;序号;序号2大于大于255, DPTR+256 HADD:MOV R1,A MOVC A, A+DPTR ;查表取高;查表取高8位地址位地址 XCH A, R1 INC A MOVC A, A+DPTR ;查表取低;查表取低8位地址位地址 MOV DPL, A MOV DPH, R1 CLR A JMP A+DPTR ;转向某一分支程序;转向某一分支程序 TAB: DW ROOT0 DW ROOT1 DW ROOTn这种方式转移范围为这种方式转移范围为64K,分支数不大于,分支数不大

34、于256。 (5 5)使用压栈指令和返回指令实现多分支程序转移。)使用压栈指令和返回指令实现多分支程序转移。这种方式是在上述第这种方式是在上述第4 4种方式的基础上,通过压栈和返回指种方式的基础上,通过压栈和返回指令把转移地址送入程序计数器令把转移地址送入程序计数器PCPC,程序设计如下:,程序设计如下: MOV DPTR, TABRLAJNCHADDINCDPH HADD:MOVR1, AMOVC A, A+DPTR;查表取高;查表取高8 8位地址位地址XCHA, R1INCAMOVC A, A+DPTR ;查表取低;查表取低8 8位地址位地址PUSHA ;低;低8 8位地址压栈位地址压栈X

35、CHA, R1PUSHA ;高;高8 8位地址压栈位地址压栈 RET 4.4 4.4 循环与查表程序设计循环与查表程序设计 一、循环程序设计一、循环程序设计 在程序设计中,经常遇到需重复执行的程序段。这种程序称在程序设计中,经常遇到需重复执行的程序段。这种程序称为循环程序,这一程序段称为循环体。程序执行时,循环次数为循环程序,这一程序段称为循环体。程序执行时,循环次数由某一给定条件决定,以确定继续循环还是停止循环。循环程由某一给定条件决定,以确定继续循环还是停止循环。循环程序一般包括以下几个部分。序一般包括以下几个部分。 (1 1)循环准备)循环准备 确定循环初始状态,工作单元清确定循环初始状

36、态,工作单元清0 0,设置循环次数计数器,设置循环次数计数器及地址指针初值等。及地址指针初值等。 (2 2)循环体)循环体 要求重复执行的程序段。要求重复执行的程序段。 (3 3)循环修改)循环修改 修改循环计数器及地址指针等。修改循环计数器及地址指针等。 (4 4)循环控制)循环控制 控制循环体的执行或结束。即根据条件判断是控制循环体的执行或结束。即根据条件判断是否满足结束条件,如果不满足,继续循环;如果条否满足结束条件,如果不满足,继续循环;如果条件满足时,结束循环。件满足时,结束循环。 如果循环体中不再包括循环程序,则称为单重如果循环体中不再包括循环程序,则称为单重循环程序。如果还包含有

37、一个或几个循环程序,则循环程序。如果还包含有一个或几个循环程序,则称为多重循环程序。在多重循环程序中,只允许内称为多重循环程序。在多重循环程序中,只允许内层循环程序嵌套在外层循环体内,而不允许循环体层循环程序嵌套在外层循环体内,而不允许循环体互相交叉。互相交叉。【例【例4.4】传送数据块程序。设在以】传送数据块程序。设在以M为起始地址为起始地址的内部的内部RAM中存放有中存放有100个单字节数,试编一程序,个单字节数,试编一程序,把这把这100个数传送到以个数传送到以N为起始地址的外部为起始地址的外部RAM中。中。 解:编写循环程序,其流程图如后图所示,程序解:编写循环程序,其流程图如后图所示

38、,程序设计如下:设计如下: ORG 2000HSTART:MOVR0, #M MOV R1, #N MOV R2, #64H LP:MOV A, R0 ;A(R0) MOVX R1, A ;(R1) A INC R0 INC R1 DJNZ R2, LP ;(R2)-10则转移则转移 END传送数据块流程图Y结束R2-1=0?(R1)(R0)R0(R0)+1R1(R1)+1R0M R1NR264H开始N查找程序流程图NYNR0(R0)+1N0FFH结束开始R0M R164H(R1)-1=0?(R0)=a?N(R0)Y 【例例4.54.5】 查找程序。设在查找程序。设在以以M M为起始地址的内部

39、为起始地址的内部RAMRAM中连中连续存放有续存放有100100个单字节数,试个单字节数,试编一程序查找一个为编一程序查找一个为a a的数,的数,找到后把其地址送找到后把其地址送N N单元,若单元,若这个数不存存,则把这个数不存存,则把FFHFFH送送N N单单元。元。 解:使用比较指令查找,编解:使用比较指令查找,编写成循环程序,其流程图如右写成循环程序,其流程图如右图所示,程序设计如下:图所示,程序设计如下: ORG 1800HSTART:MOV R0, #M MOV R1, #64H LP1:CJNE R0, #a, LP2 ;比较,不相等转移;比较,不相等转移 MOV N, R0 ;找

40、到,;找到,N(R0) SJMP LP3 LP2:INC R0 DJNZ R1, LP1;(R1)-1=/0则转移则转移 MOV N, #0FFH;未找到,;未找到,N0FFH LP3: END【例【例4.6】软件延时程序软件延时程序 ORG 2000H 指令周期指令周期 MOV R0,#0AH 2个个T机器机器 DEL2: MOV R1,#MT 2个个T机器机器 DEL1: NOP 1个个T机器机器 NOP 1个个T机器机器 DJNZ R1,DEL1 2 个个T机器机器 DJNZ R0,DEL2 2个个T机器机器 RET指令周期、机器周期指令周期、机器周期T机器机器与时钟周期与时钟周期T时钟

41、时钟的关系:的关系: T机器机器=12T时钟时钟=12 1/fosc=1s (假设晶振频率(假设晶振频率fosc为为12M)延时时间的简化计算结果:延时时间的简化计算结果: (1+1+2) 1s 10 MT 延时时间怎样计算?若想延时若想延时10ms,只需修改计数初始值只需修改计数初始值MT,即,即 (1+1+2) 10 250s=10ms二、二、 查表程序设计查表程序设计 对于一些复杂的函数,事先把全部可能的答案按一定对于一些复杂的函数,事先把全部可能的答案按一定的规律列成表,当用户程序计算这一函数时直接按序号查的规律列成表,当用户程序计算这一函数时直接按序号查表,找到相应的答案。答案的地址

42、值等于表首地址加偏移表,找到相应的答案。答案的地址值等于表首地址加偏移量,而偏移量与序号成倍率关系。查表指令有以下两条。量,而偏移量与序号成倍率关系。查表指令有以下两条。 MOVC A,A+DPTR 查表时,表首地址送查表时,表首地址送DPTRDPTR,待查找数据的序号所对应,待查找数据的序号所对应的偏移量送累加器的偏移量送累加器A A,再使用该指令,即可将结果送,再使用该指令,即可将结果送A A。如。如果结果值是多字节,则须查找多次。果结果值是多字节,则须查找多次。 MOVC A,A+PC 该指令以程序计数器该指令以程序计数器PCPC的当前值为变址基值。查找范的当前值为变址基值。查找范围为围

43、为PCPC当前值向增地址方向的当前值向增地址方向的256256个单元。个单元。 【例【例4.74.7】 设在累加器设在累加器A A中有一个中有一个BCD码,通过查表程序将其转码,通过查表程序将其转换成共阴极显示代码,送换成共阴极显示代码,送R0中。中。 解解1 1:使用使用MOVC A, A+DPTR 指令来实现,程序流程图略,指令来实现,程序流程图略,程序设计如下:程序设计如下:CHA:MOV DPTR, TAB ;DPTR 表首地址表首地址 MOVC A, A+DPTR ;根据;根据A中的偏移量查表中的偏移量查表 MOV R0, A RETTAB:DB 3FH, 06H, 5BH, 4FH

44、, 66H, 6DH, 7DH, 07H, 7FH, 6FH 解解2:使用:使用MOVC A, A+PC指令来实现指令来实现, 程序设计如下:程序设计如下:CHB:ADD A, #02H ;加偏移量;加偏移量 MOVC A, A+PC ;根据;根据A中的偏移量查表中的偏移量查表 MOV R0, A RETTAB:DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH 4.5 4.5 子程序与运算程序设计子程序与运算程序设计 一、子程序设计一、子程序设计 子程序是具有某种功能的独立程序段,其子程序是具有某种功能的独立程序段,其末尾有一条子程序返回指

45、令末尾有一条子程序返回指令RET。在编写。在编写程序时可使用子程序,子程序执行完后返程序时可使用子程序,子程序执行完后返回到原来的程序。这种使用子程序的程序回到原来的程序。这种使用子程序的程序称为主程序或调用程序,使用子程序的过称为主程序或调用程序,使用子程序的过程称为子程序调用。子程序执行完后返回程称为子程序调用。子程序执行完后返回原来程序的过程称为子程序返回。原来程序的过程称为子程序返回。 调用子程序与返回示意图返回2转子2转子1返回1NN+1N+2N+3 MM+1M+2M+3子程序aabbRETLCALL aa bb LCALL aa bb主程序子程序1子程序2子程序3子程序嵌套示意图

46、LCALL指令示意图压栈高地址低地址(SP)栈底bbaaaa bbPCLCALLxxyy 在编写子程序时,需要注意以下几点:在编写子程序时,需要注意以下几点:n设置好主程序与子程序之间的入口参数与设置好主程序与子程序之间的入口参数与出口参数的传递。出口参数的传递。n注意保护现场和恢复现场。注意保护现场和恢复现场。参数传递一般可采用以下方法:参数传递一般可采用以下方法:q传递数据。将数据通过工作寄存器传递数据。将数据通过工作寄存器R0R7或累加器来传送。即主程序和子程序在交或累加器来传送。即主程序和子程序在交接处,上述寄存器和累加器存储的是同一接处,上述寄存器和累加器存储的是同一参数。参数。 q

47、传送地址。数据存放在数据寄存器中,参传送地址。数据存放在数据寄存器中,参数传递时只通过数传递时只通过R0、R1、DPTR传递数据传递数据所存放的地址。所存放的地址。q通过堆栈传递参数。在调用之前,先把要通过堆栈传递参数。在调用之前,先把要传送的参数压入堆栈,进入子程序之后,传送的参数压入堆栈,进入子程序之后,再将压入堆栈的参数弹出到工作寄存器或再将压入堆栈的参数弹出到工作寄存器或者其他内存单元。者其他内存单元。 【例【例4.8】 把外部把外部RAM 50H5FH单元中的单元中的ASCII码依次转换成十进制数,送入内部码依次转换成十进制数,送入内部RAM 30H3FH单元。如果不是十进制数,单元

48、。如果不是十进制数,相应单元置成相应单元置成FFH。 解:将解:将ASCII码减码减30H,若有借位,则是小,若有借位,则是小于于0的非十进制数;再与的非十进制数;再与0AH比较,若大于比较,若大于等于等于0AH,也非十进制数。入口参数和出,也非十进制数。入口参数和出口参数的传递通过累加器口参数的传递通过累加器A进行,程序设计进行,程序设计如下:如下:ORG5000HMAIN: MOVR0, #50H ;R0ASCII码首地址码首地址 MOVR1, #30H ;R1转换结果首地址转换结果首地址 MOVR2, #0FH ;R2计数初值计数初值MOV R3, #0FFH ;置非十进制数标志;置非十

49、进制数标志CALL: ACALL SUBR ;调用子程序;调用子程序 MOVR1,A ;存结果;存结果 INCR0 INCR1 DJNZR2,CALL SJMP$SUBR:CLR C MOVX A, R0 ;取;取ASCII码码 SUBBA, #30H ;减;减30H JC LP1 ;有错位转移;有错位转移 CJNEA, #0AH, LP2 ;比较,不相等转移;比较,不相等转移LP1:MOV A, R3 AJMP LP3LP2:JNC LP1LP3:RET 【例【例4.9】 把内部把内部RAM 30H单元开始存放在单元开始存放在10个组合十六进制数依次转换成个组合十六进制数依次转换成ASCII

50、码,码,送入送入50H开始的开始的20个单元中。个单元中。 解:当十六进制数在解:当十六进制数在09之间时加之间时加30H,在在AF之间时加之间时加37H。用累加器。用累加器A实现参实现参数传递,程序设计如下:数传递,程序设计如下:ORG 5500HMAIN:MOV R0, #30H ;R0十六进制数首地址十六进制数首地址 MOV R1,#50H ;R1结果单元首地址结果单元首地址 MOV R2, #0AH ;R2计数初值计数初值CALL:ACALL SUBR1 INC R0 INC R1 DJNZ R2, CALL SJMP $SUBR1:MOV A, R0 ;取十六进制数;取十六进制数 A

51、CALL SUBR2 ;转换;转换 MOV R1, A ;存结果;存结果 INC R1 MOV A, R0 ;再次取十六进制数;再次取十六进制数 SWAP A ;半字节交换;半字节交换 ACALL SUBR2 ;转换;转换 MOV R1, A ;存结果;存结果 RET SUBR2:AND A, #0FH ;取低单字节;取低单字节 CJNE A, #09H, LP1 ;比较;比较 AJMP LP2 LP1:JC LP2ADD A, #07H LP2:ADD A, #30H RET END1、读程序,回答问题、读程序,回答问题ORG 1000HMOV A,#39HMOV B,AANL A,#0FH

52、ADD A,#30HMOV R0,AMOV A,BANL A,#0F0HSWAP AADD A,#30HMOV R1,ASJMP $ENDR0=?、R1=?39331、已知、已知8051使用的晶振频率为使用的晶振频率为12MHZ,设计一个软件延时程序,延时时间为设计一个软件延时程序,延时时间为10MS。2、利用子程序知识,设计一程序求、利用子程序知识,设计一程序求A=23+43。 MOV R0,#50L2:MOV R1,#50L1:MOV R3,56H DJNZ R1,L1 DJNZ R0,L2 SJMP $ MOV R0,#2 ACALL L1 MOV R1,A MOV R0,#4 ACAL

53、L L1 ADD A,R1 SJMP $L1:MOV A, R0 MOV B,R0 MUL AB MOV B,R0 MUL AB RET4.64.6程序设计举例程序设计举例 1.1.查表类程序查表类程序【例【例4.104.10】 N N路散转子程序。设有三种存储器区域中的数要读路散转子程序。设有三种存储器区域中的数要读取,三种区域的地址由取,三种区域的地址由R0R0(和(和R1R1)决定。至于需在哪个区域中读)决定。至于需在哪个区域中读取数据,由主程序在取数据,由主程序在R3R3中设置。中设置。解:建立偏移量表,根据解:建立偏移量表,根据R3R3中的值查表获得偏移量,然后转移中的值查表获得偏移

54、量,然后转移到相应的程序段,读取数据。以子程序的方式设计,程序如下:到相应的程序段,读取数据。以子程序的方式设计,程序如下: ORG 2200HMEM EQU R3 MOV A, MEM ;A转移变量转移变量 MOV DPTR, JMPL ;DPTR表首地址表首地址 MOVC A, A+DPTR ;A偏移量偏移量 JMP A+DPTRJMPL: DB MEM0- -JMPL ;偏移量表偏移量表 DB MEM1- -JMPL DB MEM2- -JMPL DB MEM3-JMPL MEM0:MOV A, R0 ;读内部;读内部RAM区域区域 RETMEM1:MOVX A, R0 ;读外部低;读外

55、部低256字节字节RAM区域区域 RETMEM2:MOV DPL, R0 MOV DPH, R1 MOVX A, DPTR ;读外部;读外部64K RAM区域区域 RET 在调用该子程序之前除将转移变量送寄存器在调用该子程序之前除将转移变量送寄存器R3之外,之外,还需把相应的地址送还需把相应的地址送R0(和(和R1)。)。 图4.1 求立方数程序流程图结束查表,高位送11H单元查表,低位送10H单元A(11H)A2N开始DPTR表首地址AN11HA 【例【例4.114.11】 求立方数。求立方数。 解:设立方数表为双字节表,解:设立方数表为双字节表,表存放在起始地址为表存放在起始地址为TABT

56、AB的程序的程序存储器中。查表求出结果,送内存储器中。查表求出结果,送内部部RAMRAM中中10H10H和和11H11H中,流程图如中,流程图如图所示,所序设计如下:图所示,所序设计如下: ORG 1500H START:MOV DPTR, TAB ;DPTR表道地址表道地址 MOV A, #N ;A待查数待查数 RL A MOV 11H, A ;11H2N MOVC A, A+DPTR MOV 10H, A ;查表,低位送;查表,低位送10H单元单元 INC DPTR ;DPTR(DPTR)+1 MOV A, 11H ;A2N MOVC A, A+DPTR MOV 11H, A ;查表,高位

57、送;查表,高位送11H单元单元 END2.2.代码转换类程序代码转换类程序 【例【例4.124.12】 把单字节无符号数转换把单字节无符号数转换成成BCDBCD码。码。 解:单字节二进制无符号数最大为解:单字节二进制无符号数最大为255255,因此最多可转换为,因此最多可转换为3 3位位BCDBCD码。在这码。在这个二进制数中所包含的个二进制数中所包含的64H64H的个数,即为的个数,即为BCDBCD码的百位数;减去百位数后的余数中码的百位数;减去百位数后的余数中所包含的所包含的0AH0AH的个数,即为的个数,即为BCDBCD码的十位数码的十位数;减去十位数后的余数,即为;减去十位数后的余数,

58、即为BCDBCD码的个码的个位数。设二进制数的存储单元地址为位数。设二进制数的存储单元地址为FIRSTFIRST,结果的起始单元地址为,结果的起始单元地址为SECONDSECOND,且低位存储在先,高位存储在后,程序流且低位存储在先,高位存储在后,程序流程图如图所示,程序设计如下:程图如图所示,程序设计如下: 图4.2 二进制数转换成BCD码流程图存结果A74商 A30余数结束余数10开始A二进制数(A)100 R0商 ORG 2000HSTART:MOV DPTR, #FIRST MOVX A, DPTR ;A二进制数二进制数 MOV B, #64H ;B#64H DIV AB ;(A)除以

59、除以(B) MOV R0, A ;R0BCD码高位码高位 MOV A, #0AH ;A#0AH XCH A, B ;(A) (B) DIV AB ;(A)除以除以(B) SWAP A ;A半字节交换半字节交换 ADD A, B ;加加BCDBCD码个位码个位 MOV DPTR, #SECOND MOVX DPTR, A INC DPTR MOV A, R0 MOVX DPTR, A ;结果送结果送SECONDSECOND单元单元 END 【例【例4.134.13】 把把3 3位位BCDBCD码转码转换成二进制数。换成二进制数。 解:设解:设3 3位位BCDBCD码最大值为码最大值为255255

60、,百为数乘,百为数乘64H64H,加上十位,加上十位数乘数乘0AH0AH,再加上个位数,即得,再加上个位数,即得相应的二进制数。程序流程图相应的二进制数。程序流程图如图所示,程序设计如下:如图所示,程序设计如下:存结果图4.3 BCD码转换成二进制数流程图结 束A(A)64HA(A)0AHR0(A)+个位数ABCD码百位数开 始ABCD码十位数A(A)+(R0) ORG 2000HSTART:MOV DPTR, #FIRST MOVX A, DPTR ;ABCD码低码低2 2位位 MOV R0, A ;R0BCD码低码低2 2位位 ANL A, #0F0H SWAP A ;ABCD 码的十位数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论