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

下载本文档

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

文档简介

1、第第7 7章章 MCS-51MCS-51汇编语言程序设计基础汇编语言程序设计基础7.1 汇编语言程序设计概述7.2 汇编语言程序的基本结构形式第7章 MCS-51汇编语言程序设计基础7.2 7.2 汇编语言程序的基本结构形式汇编语言程序的基本结构形式 2 7.1 7.1 汇编语言程序设计概述汇编语言程序设计概述1ContentsClick to add title in here Click to add title in here Click to add title in here Click to add title in here 4123ThemeGallery is a Desig

2、n Digital Content & Contents mall developed by Guild Design Inc.7.1 7.1 汇编语言程序设计概述汇编语言程序设计概述 7.1.1 7.1.1 机器语言、汇编语言和高级语言机器语言、汇编语言和高级语言二进制代码表示的指令、数字和符号简称为二进制代码表示的指令、数字和符号简称为机器。语言不易懂,难记忆,易出错。机器。语言不易懂,难记忆,易出错。英文助记符表示的指令称为符号语言或英文助记符表示的指令称为符号语言或汇编语言汇编语言不受具体机器的限制不受具体机器的限制, ,使用了许多数学公式使用了许多数学公式和数学计算上的习惯用语。和数

3、学计算上的习惯用语。机器语言机器语言汇编语言汇编语言高级语高级语言言汇编语言特点:汇编语言特点:(1) (1) 面向机器的语言,程序设计员须对面向机器的语言,程序设计员须对MCS-51MCS-51的硬件有相当深的硬件有相当深入的了解。入的了解。(2) (2) 助记符指令和机器指令一一对应,用汇编语言编写的程序助记符指令和机器指令一一对应,用汇编语言编写的程序效率高,占用存储空间小,运行速度快,用汇编语言能编写出效率高,占用存储空间小,运行速度快,用汇编语言能编写出最优化的程序。最优化的程序。(3) (3) 能直接管理和控制硬件设备(功能部件),它能处理中能直接管理和控制硬件设备(功能部件),它

4、能处理中断,也能直接访问存储器及断,也能直接访问存储器及I/OI/O接口电路。接口电路。 汇编语言和机器语言都脱离不开具体机器的硬件,均是面汇编语言和机器语言都脱离不开具体机器的硬件,均是面向向“机器机器”的语言,缺乏通用性。的语言,缺乏通用性。 高级语言优点:通用性强,直观、易懂、易学,可读性好。可高级语言优点:通用性强,直观、易懂、易学,可读性好。可 使用使用C C语言(语言(C51C51)、)、PL/MPL/M语言来进行语言来进行MCS-51MCS-51的应的应 用程序设计。用程序设计。 对于程序的空间和时间要求很高的场合,汇编语言仍是必对于程序的空间和时间要求很高的场合,汇编语言仍是必

5、不可缺的。不可缺的。 在很多需要直接控制硬件的应用场合,则更是非用汇编语在很多需要直接控制硬件的应用场合,则更是非用汇编语言不可。言不可。 可可C C语言和汇编语言混合编程。语言和汇编语言混合编程。7.1.2 7.1.2 汇编语言语句的种类和格式汇编语言语句的种类和格式 两种基本类型:指令语句和伪指令语句两种基本类型:指令语句和伪指令语句(1 1)指令语句)指令语句 每一条指令语句在汇编时都产生一个指令代码每一条指令语句在汇编时都产生一个指令代码机器代码机器代码(2 2)伪指令语句)伪指令语句 是为汇编服务的。在汇编时没有机器代码与之对是为汇编服务的。在汇编时没有机器代码与之对应。应。 MCS

6、-51MCS-51的汇编语言的的汇编语言的四分段格式四分段格式如下:如下: 标号字段标号字段 操作码字段操作码字段 操作数字段操作数字段 注释字段注释字段规则:规则:(1 1)标号字段和操作字码段之间要有冒号)标号字段和操作字码段之间要有冒号“:”相隔;相隔;(2 2)操作码字段和操作数字段间的分界符是空格;)操作码字段和操作数字段间的分界符是空格;(3 3)双操作数之间用逗号相隔;)双操作数之间用逗号相隔; (4 4)操作数字段和注释字段之间的分界符用分号)操作数字段和注释字段之间的分界符用分号“;”相隔。相隔。 操作码字段和操作数字段为必选项,其余各段为任选操作码字段和操作数字段为必选项,

7、其余各段为任选 项。项。 例例 下面是一段汇编语言程序的四分段书写格式下面是一段汇编语言程序的四分段书写格式 标号字段标号字段 操作码字段操作码字段 操作数字段操作数字段 注释字段注释字段 STARTSTART: MOV AMOV A,#00H #00H ;0A0A MOV R1 MOV R1,#10 #10 ;10R110R1 MOV R2 MOV R2,#00000011B #00000011B ;3R23R2 LOOP LOOP: ADD AADD A,R2 R2 ;(;(A A)+ +(R2R2)A A DJNZ R1 DJNZ R1,LOOP LOOP ;R1R1内容减内容减1 1不

8、为零,则循环不为零,则循环 NOPNOP HERE HERE: SJMP HERESJMP HERE基本语法规则:基本语法规则:1 1标号字段标号字段 是语句所在地址的标志符号是语句所在地址的标志符号 (1 1)标号后边必须跟以冒号)标号后边必须跟以冒号“:” (2 2)由)由1-81-8个个ASCIIASCII字符组成字符组成(3 3)同一标号在一个程序中只能定义一次)同一标号在一个程序中只能定义一次 (4 4)不能使用汇编语言已经定义的符号作为标号)不能使用汇编语言已经定义的符号作为标号 2 2操作码字段操作码字段 汇编程序就是根据这一字段来生成机器代码的。汇编程序就是根据这一字段来生成机

9、器代码的。3 3操作数字段操作数字段 通常有单操作数、双操作数和无操作数三种情况。如果是通常有单操作数、双操作数和无操作数三种情况。如果是双操作数,则操作数之间,要以逗号隔开。双操作数,则操作数之间,要以逗号隔开。(1 1)十六进制、二进制和十进制形式的操作数表示采用十六)十六进制、二进制和十进制形式的操作数表示采用十六进制形式来表示进制形式来表示 ,某些特殊场合才采用二进制或十进制的表,某些特殊场合才采用二进制或十进制的表示形式示形式 。 十六进制,后缀十六进制,后缀“H H” ;二进制,后缀;二进制,后缀“B B” 。 十进制,后缀十进制,后缀“D D”,也可省略。,也可省略。 若十六进制

10、的操作数以字符若十六进制的操作数以字符A A- -F F中的某个开头时,则需在它中的某个开头时,则需在它前面加一个前面加一个 “0 0”,以便在汇编时把它和字符,以便在汇编时把它和字符A AF F区别开来。区别开来。(2 2)工作寄存器和特殊功能寄存器的表示)工作寄存器和特殊功能寄存器的表示 采用工作寄存器和特殊功能寄存器的代号来表示,也可采用工作寄存器和特殊功能寄存器的代号来表示,也可 用其地址来表示。用其地址来表示。 例如,累加器可用例如,累加器可用A A(或(或AccAcc)表示。也可用)表示。也可用0E0H0E0H来表来表 示,示,0E0H0E0H为累加器为累加器A A的地址。的地址。

11、(3 3)美元符号)美元符号$ $的使用的使用 用于表示该转移指令操作码所在的地址。用于表示该转移指令操作码所在的地址。 例如,如下指令:例如,如下指令: HEREHERE:SJMP HERESJMP HERE 可写为:可写为: SJMP $SJMP $4 4注释字段注释字段 必须以分号必须以分号“;”开头,换行书写,但必须注意也要以分号开头,换行书写,但必须注意也要以分号“;”开头。开头。 汇编时,注释字段不会产生机器代码。汇编时,注释字段不会产生机器代码。7.1.3 7.1.3 伪指令伪指令 在在MCS-51MCS-51汇编语言源程序中应有向汇编程序发出的指示信汇编语言源程序中应有向汇编程

12、序发出的指示信息,告诉它如何完成汇编工作,这是通过使用伪指令来实现息,告诉它如何完成汇编工作,这是通过使用伪指令来实现的。的。 也称为汇编程序控制命令。只有在汇编前的源程序中才有伪也称为汇编程序控制命令。只有在汇编前的源程序中才有伪指令。经过汇编得到目标程序(机器代码)后,伪指令已无存指令。经过汇编得到目标程序(机器代码)后,伪指令已无存在的必要,所以在的必要,所以“伪伪”体现在汇编时,伪指令没有相应的机器体现在汇编时,伪指令没有相应的机器代码产生。代码产生。常用的伪指令:常用的伪指令: 1.ORG1.ORG(ORiGinORiGin)汇编起始地址命令)汇编起始地址命令 在汇编语言源程序的开始

13、,通常都用一条在汇编语言源程序的开始,通常都用一条ORGORG伪指令伪指令来实现规定程序的起始地址。如不用来实现规定程序的起始地址。如不用ORGORG规定,则汇规定,则汇编得到的目标程序将从编得到的目标程序将从0000H0000H开始。开始。 例如例如: ORG 2000HORG 2000H START START:MOV A,#00HMOV A,#00H 规定标号规定标号STARTSTART代表地址为代表地址为2000H2000H开始。开始。 在一个源程序中,可多次使用在一个源程序中,可多次使用ORGORG指令,来规定不同的指令,来规定不同的程序段的起始地址。但是,地址必须由小到大排列,程序

14、段的起始地址。但是,地址必须由小到大排列,地址不能交叉、重叠。地址不能交叉、重叠。例如:例如: ORG 2000HORG 2000H ORG 2500H ORG 2500H ORG 3000H ORG 3000H 2. END(END of assembly)2. END(END of assembly)汇编终止命令汇编终止命令 汇编语言源程序的结束标志,用于终止源程序汇编语言源程序的结束标志,用于终止源程序的汇编工作。在整个源程序中只能有一条的汇编工作。在整个源程序中只能有一条ENDEND命令,命令,且位于程序的最后。且位于程序的最后。3 3DBDB(Define ByteDefine By

15、te)定义字节命令)定义字节命令 在程序存储器的连续单元中定义字节数据。在程序存储器的连续单元中定义字节数据。 ORG 2000HORG 2000H DB 30H DB 30H,40H40H,2424,“C”C”,“B”B” 汇编后:汇编后: (2000H2000H)=30H=30H (2001H2001H)=40H=40H (2002H2002H)=18H=18H(1010进制数进制数2424) (2003H2003H)=43H=43H(字符(字符“C”C”的的ASCIIASCII码)码) (2004H2004H)=42H=42H(字符(字符“B”B”的的ASCIIASCII码)码) DBD

16、B功能是从指定单元开始定义(存储)若干个字功能是从指定单元开始定义(存储)若干个字节,节,1010进制数自然转换成进制数自然转换成1616进制数,字母按进制数,字母按ASCIIASCII码存储。码存储。4 4DWDW(Define WordDefine Word)定义数据字命令)定义数据字命令 从指定的地址开始,在程序存储器的连续单元中定义从指定的地址开始,在程序存储器的连续单元中定义1616位位的数据字。的数据字。 例如:例如: ORG 2000HORG 2000H DW 1246H DW 1246H,7BH7BH,1010 汇编后:汇编后: (2000H2000H)=12H=12H;第;第

17、1 1个字个字 (2001H2001H)=46H =46H (2002H2002H)=00H=00H;第;第2 2个字个字 (2003H2003H)=7BH=7BH (2004H2004H)=00H=00H;第;第3 3个字(个字(2005H2005H)=0AH=0AH (2005H2005H)=0AH =0AH 5 5EQUEQU(EQUateEQUate)赋值命令)赋值命令 用于给标号赋值。赋值以后,其标号值在整个程用于给标号赋值。赋值以后,其标号值在整个程序有效。序有效。 例如:例如: TEST EQU 2000HTEST EQU 2000H 表示标号表示标号TEST=2000HTEST

18、=2000H,在汇编时,凡是遇到标号,在汇编时,凡是遇到标号TESTTEST时,均以时,均以2000H2000H来代替。来代替。 程序存储器六个入口程序存储器六个入口 ORG 0000HORG 0000H; ; 主程序入口主程序入口 AJMP MAINAJMP MAIN ORG 0003HORG 0003H LJMP INT0LJMP INT0; ; 外中断外中断INT0INT0中断子程序入中断子程序入 ORG 000BHORG 000BHLJMP T0 LJMP T0 ; ; 定时器定时器T0T0中断子程序入口中断子程序入口ORG 0013HORG 0013H LJMP INT1LJMP I

19、NT1; ; 外中断外中断INT1INT1中断子程序入口中断子程序入口 ORG 001BHORG 001BH LJMP T1LJMP T1; ; 定时器定时器T1T1中断子程序入口中断子程序入口 ORG 0023HORG 0023HLJMP SIOLJMP SIO; ; 串行口中断子程序入口串行口中断子程序入口 ORG XXXXHORG XXXXHMAINMAIN:; ; 主程序主程序INT0INT0:; ; 外中断外中断INT0INT0中断子程序中断子程序 T0T0:; ; 定时器定时器T0T0中断子程序中断子程序 INT1INT1: ; ; 外中断外中断INT1INT1中断子程序中断子程序

20、 T1T1: ; ; 定时器定时器T1T1中断子程序中断子程序 SIOSIO: ; ; 串行口中断子程序串行口中断子程序 7.2 7.2 汇编语言程序的基本结构形式汇编语言程序的基本结构形式查表结构查表结构顺序结构顺序结构分支结构分支结构循环结构循环结构子程序结构子程序结构7.2.1 7.2.1 顺序结构程序设计顺序结构程序设计 顺序结构程序又称简单结构程序,是程序设计顺序结构程序又称简单结构程序,是程序设计中最基本的,在整个程序设计中所占比例极大,是中最基本的,在整个程序设计中所占比例极大,是程序设计的基础。这里所说的简单结构程序是指一程序设计的基础。这里所说的简单结构程序是指一种无分支的直

21、接程序,是按照逻辑操作顺序,从第种无分支的直接程序,是按照逻辑操作顺序,从第一条指令开始逐条执行一条指令开始逐条执行, ,直到最后一条指令为止。直到最后一条指令为止。 例:设有两个例:设有两个4 4位位BCDBCD码,分别存放在码,分别存放在23H23H、22H22H单元和单元和33H33H、 32H32H单元中,求它们的和,并送入单元中,求它们的和,并送入43H43H、42H42H单元中单元中. . (以上均为低位在低字节,高位在高字节)(以上均为低位在低字节,高位在高字节) 开始(22H)AA+(32H)ABCD码调整A(42H)(23H)AA+(33H)+CABCD码调整A(43H)结束

22、ORG 2000HORG 2000HCLR CCLR CMOV AMOV A,22H22HADD AADD A,32H32HDADA A A;BCDBCD码调整码调整MOV 42HMOV 42H,A A;存结果低位;存结果低位MOV AMOV A,23H23HADDC AADDC A,33H33H DA ADA AMOV 43HMOV 43H,A A;存结果高位;存结果高位LLLL: SJMPSJMP LL LLEND END 例例2 2:求一个:求一个1616位二进制数的补码。位二进制数的补码。考虑加考虑加1 1可否用可否用INCINC指令来实现?指令来实现?不可以。因为不影响不可以。因为不

23、影响CYCY标志。标志。ORGORG2000H2000HMOVMOVA A,R0R0CPLCPLA AADDADDA A,#1#1MOVMOVR2R2,A A;低位字节补码送;低位字节补码送R2R2MOVMOVA A,R1R1CPLCPLA AADDCADDCA A,#0#0;高位加进位;高位加进位MOVMOVR3R3,A ALPLP:SJMPSJMPLPLPEND END 设此设此1616位二进制数存放在位二进制数存放在R1R1、R0R0中,求补后送存中,求补后送存R3R3、R2R2中。中。7.2.2 7.2.2 分支转移程序设计分支转移程序设计 转移指令有分为转移指令有分为无条件转移和有条

24、件转移无条件转移和有条件转移,因此分支,因此分支程序也可分为无条件分支转移程序和有条件分支转移程序。程序也可分为无条件分支转移程序和有条件分支转移程序。有条件分支转移程序按结构类型来分,又分为单分支转移结有条件分支转移程序按结构类型来分,又分为单分支转移结构和多分支转移结构。构和多分支转移结构。 无条件转移无条件转移 它的程序转移方向是设计者事先安排的,与已执行程序的它的程序转移方向是设计者事先安排的,与已执行程序的结果无关,使用时只需给出正确的转移目标地址或位移量即结果无关,使用时只需给出正确的转移目标地址或位移量即可。可。 条件转移条件转移 它是根据已执行的程序,对标志位或对累加器它是根据

25、已执行的程序,对标志位或对累加器A A或对内部或对内部RAMRAM某位的影响结果,决定程序的走向,形成各种分支。某位的影响结果,决定程序的走向,形成各种分支。1 1单分支转移结构单分支转移结构 仅有两个出口,两者选一。仅有两个出口,两者选一。例例 求单字节有符号数的二进制补码求单字节有符号数的二进制补码参考程序参考程序:CMPTCMPT: JNB Acc.7,RETURNJNB Acc.7,RETURN;(A A)00,不需转换,不需转换 MOV CMOV C,Acc.7 Acc.7 ;符号位保存符号位保存 CPL ACPL A ;(;(A A)求反,加)求反,加1 1 ADD A ADD A

26、,#1#1 MOV Acc.7 MOV Acc.7,C C ;符号位存;符号位存A A的最高位的最高位RETURNRETURN: RET RET 2多分支转移结构多分支转移结构 程序的判别部分有两个以上的出口流向程序的判别部分有两个以上的出口流向常见的两种形式如下:常见的两种形式如下: 指令系统提供了非常有用的两种多分支选择指令指令系统提供了非常有用的两种多分支选择指令: : 间接转移指令间接转移指令: JMP A+DPTR;: JMP A+DPTR;比较转移指令比较转移指令: CJNE A,direct,rel: CJNE A,direct,rel; CJNE A,#data,relCJNE

27、 A,#data,rel; CJNE Rn,#data,relCJNE Rn,#data,rel; CJNE Ri,#data,relCJNE Ri,#data,rel; 需根据某一单元的内容是需根据某一单元的内容是0 0,1 1,n n,来分别转,来分别转向处理程序向处理程序0 0,处理程序,处理程序1 1,处理程序处理程序n n。一个。一个典型的例子就是当单片机系统中的典型的例子就是当单片机系统中的键盘按下键盘按下时,时,就会得到一个就会得到一个键值键值,根据不同的键值,跳向不同,根据不同的键值,跳向不同的键处理程序入口。对于这种情况,可用直接转的键处理程序入口。对于这种情况,可用直接转移

28、指令(移指令(LJMPLJMP或或AJMPAJMP指令)组成一个转移表,然指令)组成一个转移表,然后把该单元的内容读入累加器后把该单元的内容读入累加器A A,转移表首地址放,转移表首地址放入入DPTRDPTR中,再利用间接转移指令实现分支转移。中,再利用间接转移指令实现分支转移。 例:按照例:按照R7R7的内容转向的内容转向5 5个操作程序。个操作程序。JUMP3JUMP3:MOVMOVA A,R7R7MOVMOVDPTRDPTR,#TAB3#TAB3MOVCMOVCA A,A+DPTRA+DPTRJMPJMPA+DPTRA+DPTRTAB3:TAB3:DBDBOPR0-TAB3OPR0-TA

29、B3DBDBOPR1-TAB3OPR1-TAB3DBDBOPR2-TAB3OPR2-TAB3DBDBOPR3-TAB3OPR3-TAB3DBDBOPR4-TAB3OPR4-TAB3OPR0:OPR0:操作程序操作程序0 0OPR1:OPR1:操作程序操作程序1 1OPR4:OPR4:操作程序操作程序4 47.2.3 7.2.3 循环程序设计循环程序设计 特点是程序中含有可以反复执行的程序段,该程序段通特点是程序中含有可以反复执行的程序段,该程序段通常称为循环体。例如求常称为循环体。例如求100100个数的累加和,则没有必要连续个数的累加和,则没有必要连续安排安排100100条加法指令,可以只用

30、一条加法指令并使其循环执条加法指令,可以只用一条加法指令并使其循环执行行100100次。次。 (1 1)可大大缩短程序长度)可大大缩短程序长度(2 2)使程序所占的内存单元数量少)使程序所占的内存单元数量少(3 3)使程序结构紧凑和可读性变好。)使程序结构紧凑和可读性变好。一、循环程序的结构一、循环程序的结构 循环控制循环控制在重复执行循环体的过程在重复执行循环体的过程中中, ,不断修改循环控制变量不断修改循环控制变量,直到符合结束条件,直到符合结束条件, ,就结就结束循环程序的执行。束循环程序的执行。循环初始化循环初始化循环前的的准备工作循环前的的准备工作, ,例循例循环控制计数初值的设置、

31、环控制计数初值的设置、地址指针的起始地址的设地址指针的起始地址的设置、为变量预置初值等。置、为变量预置初值等。循环结束循环结束对循环程序执行的结果进对循环程序执行的结果进行分析、处理和存放。行分析、处理和存放。循环体循环体要求重复执行的程序段部要求重复执行的程序段部分。主要完成计算或操作分。主要完成计算或操作任务,同时也包括对初始任务,同时也包括对初始值的修改。值的修改。图图4-84-8是计数循环控制结构,图是计数循环控制结构,图4-94-9是条件控制结构。是条件控制结构。 二、循环结构的控制二、循环结构的控制1 1计数循环结构计数循环结构 计数循环控制结构是依据计数器的值来决定循环计数循环控

32、制结构是依据计数器的值来决定循环次数,一般为减次数,一般为减“1 1” 计数器,计数器减到计数器,计数器减到“0 0”时,时,结束循环。计数器的初值是在初始化时设定。结束循环。计数器的初值是在初始化时设定。MCS-51MCS-51的指令系统提供了功能极强的循环控制指令:的指令系统提供了功能极强的循环控制指令:DJNZ Rn,relDJNZ Rn,rel;工作寄存器作控制计数器;工作寄存器作控制计数器DJNZ direct,relDJNZ direct,rel;以直接寻址单元作控制计数器。;以直接寻址单元作控制计数器。计数控制方法只有在循环次数已知的情况下才适用计数控制方法只有在循环次数已知的情

33、况下才适用 2 2条件控制结构条件控制结构 例例 50ms50ms延时程序延时程序。 延时程序与延时程序与MCS-51MCS-51指令执行时间有很大的关系。在使用指令执行时间有很大的关系。在使用12MHz12MHz晶振时,一个机器周期为晶振时,一个机器周期为1 1s,s,执行一条执行一条DJNZDJNZ指令的时指令的时间为间为2 2s s。这时,可用双重循环方法写出下面如下的延时。这时,可用双重循环方法写出下面如下的延时50ms50ms的程序:的程序:DEL: MOV R7,#200DEL: MOV R7,#200DEL1: MOV R6,#125DEL1: MOV R6,#125DEL2:

34、DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ;125125* *2=2502=250s s DJNZ R7,DEL1 DJNZ R7,DEL1 ;0.25ms0.25ms* *200=50ms200=50ms RET RET 以上延时程序不太精确,它没有考虑到除以上延时程序不太精确,它没有考虑到除“DJNZ R6,DEL2 DJNZ R6,DEL2 ”指令外的其它指令的执行时间,如把其它指令的执行时间指令外的其它指令的执行时间,如把其它指令的执行时间计算在内,它的延时时间为:计算在内,它的延时时间为: (250+1+2250+1+2)* *200+1=50.301ms200

35、+1=50.301ms 如果要求比较精确的延时,可按如下修改:如果要求比较精确的延时,可按如下修改:DEL: MOV R7,#200DEL: MOV R7,#200DEL1: MOV R6,#122DEL1: MOV R6,#122 NOP NOPDEL2: DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ;2 2* *122+2=246122+2=246s s DJNZ R7,DEL1 DJNZ R7,DEL1 ;(246+1+1+2)(246+1+1+2)* *200+1=50.001ms200+1=50.001ms RET RET实际延迟时间为实际延迟时间为50.001m

36、s50.001ms,注意。软件延时程序,不允许有中,注意。软件延时程序,不允许有中断,否则将严重影响定时的准确性。断,否则将严重影响定时的准确性。例例 片内片内RAMRAM中存放一批数据,中存放一批数据,查找出最大值并存放于查找出最大值并存放于R3R3中。中。设设R0R0中存首地址,中存首地址,R2R2中存放字节中存放字节数,程序框图如图数,程序框图如图4-14-1所示。所示。 MOVMOVA A, R0 R0MOVMOVR3R3, A A ;假设第一次取的数为最大值;假设第一次取的数为最大值 INC INCR0R0;地址指针加;地址指针加1 1DEC R2DEC R2;字节数减;字节数减1

37、1LOOPLOOP: MOVMOV A A, R0 R0 CJNE ACJNE A,R3R3,LOOP1LOOP1;取出的数与存放的最大;取出的数与存放的最大 ;数比较;数比较 LOOP1 LOOP1: JC LOOP2JC LOOP2;C=1C=1,取出的数小跳转,取出的数小跳转 MOV R3MOV R3,A A;C=0C=0,取出的数大,替换,取出的数大,替换R3R3LOOP2:LOOP2:INCINCR0R0DJNZ R2, LOOPDJNZ R2, LOOP;是否比较结束;是否比较结束 RET RET 7.2.4 7.2.4 子程序结构程序子程序结构程序 一种能完成某一特定任务的程序段

38、。其资源要为所有调用一种能完成某一特定任务的程序段。其资源要为所有调用程序共享。因此,子程序在结构上应具有独立性和通用性,在程序共享。因此,子程序在结构上应具有独立性和通用性,在编写子程序时应编写子程序时应注意以下问题:注意以下问题:1 1子程序的第一条指令的地址称为子程序的入口地址。该指令子程序的第一条指令的地址称为子程序的入口地址。该指令前必须有标号。前必须有标号。2 2主程序调用子程序,两条子程序调用指令:主程序调用子程序,两条子程序调用指令: (1 1)绝对调用指令:)绝对调用指令:ACALL addr11 ACALL addr11 (2 2)长调用指令:)长调用指令:LCALL ad

39、dr16LCALL addr163 3注意设置堆栈指针和现场保护注意设置堆栈指针和现场保护4 4最后一条指令必须是最后一条指令必须是RETRET指令指令5 5子程序可以嵌套,即子程序可以调用子程序子程序可以嵌套,即子程序可以调用子程序6 6在子程序调用时,还要注意参数传递的问题在子程序调用时,还要注意参数传递的问题 地址地址主程序主程序地址地址SUB2SUB2LCALL SB20 LCALL SB20 MAIN4MAIN4LCALL SB30 LCALL SB30 RETRET RETRETSB20SB20S1S1SB30SB30SUB1SUB1 MAIN4 MAIN4 高位高位 S1 S1

40、高位高位S1 S1 低位低位MAIN4 MAIN4 低位低位SP+4SP+3SP+2SP+1SP堆栈存储区堆栈存储区 例:用例:用P1P1口作为数据读入口,为了读取稳定的值,要求连续读口作为数据读入口,为了读取稳定的值,要求连续读8 8次后取平均。次后取平均。 设设R0R0,R1R1作为连续作为连续8 8次累加的次累加的1616位工作寄存器,最后取平均值,即除以位工作寄存器,最后取平均值,即除以8 8,相当于除以,相当于除以2 23 3。在此采。在此采用将用将R0R0,R1R1各右移一次的操作重复三次。最后结果在各右移一次的操作重复三次。最后结果在R1R1中。中。 ORGORG2000H200

41、0H MOV MOVR0R0,#00H#00H;清;清1616位中间寄存器位中间寄存器 MOVMOVR1R1,#00H#00H MOV MOVR2R2,#08H#08H;累加次数送;累加次数送R2R2LP2LP2:MOVMOV P1P1,#0FFH#0FFH;输入读数;输入读数 MOVMOVA A,P1P1 ADD ADDA A,#R1#R1;加入中间寄存器低;加入中间寄存器低8 8位位 JNCJNCLP1LP1;无进位则暂存结果;无进位则暂存结果 INCINCR0R0;有进位则中间寄存器高;有进位则中间寄存器高8 8位增位增1 1LP1LP1: MOV MOVR1R1,A A;暂存低;暂存低

42、8 8位结果位结果 DJNZDJNZR2R2,LP2LP2;未完循环;未完循环 MOVMOVR2R2,#03H#03HLP3LP3: MOV MOVA A,R0R0;高;高8 8位结果送入位结果送入A A RRC RRCA A;A A中最低位右移入中最低位右移入C C MOV MOVR0R0,A A MOV MOVA A,R1R1 RRC RRCA A;低;低8 8位结果带进位右移,则高位结果带进位右移,则高8 8位的位的 ;低位进入低;低位进入低8 8位的最高位位的最高位 MOVMOVR1R1,A A DJNZ DJNZR2R2,LP3LP3LPLP: SJMPSJMPLPLP开始清累加器R

43、0,R1,设R2计数器P1口读入数,加入R0,R1R2-1=0结束NY累加结果取平均例:编制一个循环闪烁灯的程序。有例:编制一个循环闪烁灯的程序。有8 8个发光二极管,每次其中个发光二极管,每次其中某个灯闪烁点亮某个灯闪烁点亮1010次后,转移到下一个闪烁次后,转移到下一个闪烁1010次,循环不止。次,循环不止。 D0 Q0D0 Q0D7 Q7D7 Q7 LED0LED0LED7LED7+5V+5VP1.0P1.0P1.1P1.1P1.2P1.2P1.3P1.3P1.4P1.4P1.5P1.5P1.6 P1.6 P1.7P1.780C5180C5174LS24074LS240解:解:80518

44、051的的P1P1口输出经过口输出经过74LS240 874LS240 8路反相驱动后,点燃发光二极管。路反相驱动后,点燃发光二极管。 由图可见,低电平发光二极管可被点亮。由图可见,低电平发光二极管可被点亮。MOVMOVA A,#80#80;初值;初值SHIFT1SHIFT1:LCALLLCALL FLASHFLASH ;闪亮;闪亮1010次次RRRRA A;右移;右移SJMPSJMPSHIFT1SHIFT1;循环;循环FLASHFLASH:MOVMOVR2R2,#0AH#0AH;闪烁;闪烁1010次次FLASH1FLASH1:MOVMOVP1P1,A A;点亮;点亮LCALLLCALL DE

45、LAYDELAY;延时;延时MOVMOVP1P1,#00H#00H;熄灭;熄灭LCALLLCALL DELAYDELAY;延时;延时DJNZDJNZR2R2,LFASH1LFASH1;循环;循环RETRET DELAYDELAY:为延时子程序,初值可以自己按照延时要求编制。:为延时子程序,初值可以自己按照延时要求编制。 例:延时例:延时100ms100msDEL: MOV R7,#200DEL: MOV R7,#200DEL1: MOV R6,#247DEL1: MOV R6,#247 NOP NOPDEL2: DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ;2 2* *247+2=496247+2=496s s DJNZ DJNZR7,DEL1 R7,DEL1 ;(246+1+1+2)(246+1+1+2)* *200+1=50.001ms200+1=50.001msRETRET7.2.5 7.2.5 查表结构程序查表结构程序 所谓查表法,即对一些复杂的函数运算,事先把其全部可能所谓查表法,即对一些复杂的函数运算,事先把其全部可能范围的答案按照一定规律变成表格存放在计算机的程序存储器范围的答案按照一定规律变成表格存放在计算机的程序存储器(一般为只读存储器)中。当用户程序中需要用到这些函数时,(一般为只读存储器)中。当用户

温馨提示

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

评论

0/150

提交评论