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

下载本文档

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

文档简介

1、第第5 5章章 MCS-51MCS-51汇编语言程序设计汇编语言程序设计本章主要内容本章主要内容5.1 5.1 概述概述5.2 5.2 伪指令伪指令5.3 5.3 汇编语言程序设计概述汇编语言程序设计概述5.4 5.4 顺序结构程序顺序结构程序5.5 5.5 分支结构程序分支结构程序5.6 5.6 循环结构程序循环结构程序5.7 5.7 子程序子程序5.8 5.8 常用汇编语言程序实例常用汇编语言程序实例5.1 5.1 概述概述C C语言语言源程序源程序汇编语言汇编语言源程序源程序浮浮动动地地址址目目标标程程序序编译器编译器C51C51汇编器汇编器A51A51绝对地址绝对地址目标程序目标程序(

2、.OBJ.OBJ).HEX.HEX文件文件连接连接/ /定位器定位器L51L51图图5-1 5-1 两种语言源程序转换成目标程序两种语言源程序转换成目标程序5.2 5.2 伪指令伪指令n汇编语言源程序由汇编指令和伪指令两者构成。用汇编语言编写的源汇编语言源程序由汇编指令和伪指令两者构成。用汇编语言编写的源程序通常需经过微机汇编程序编译(汇编)成机器码后才能被单片机程序通常需经过微机汇编程序编译(汇编)成机器码后才能被单片机执行。执行。n为了对源程序汇编,在源程序中必须使用一些为了对源程序汇编,在源程序中必须使用一些“伪指令伪指令”。伪指令是。伪指令是便于程序阅读和编写的指令,它即不控制机器的操

3、作也不能被汇编成便于程序阅读和编写的指令,它即不控制机器的操作也不能被汇编成机器代码,只是为汇编程序所识别的常用符号,并指导汇编如何进行机器代码,只是为汇编程序所识别的常用符号,并指导汇编如何进行,故称为伪指令。,故称为伪指令。MCS-51MCS-51系列单片机的常用伪指令系列单片机的常用伪指令ORG ORG - - 定位伪指令定位伪指令END END - - 结束汇编伪指令结束汇编伪指令EQU EQU - - 赋值伪指令赋值伪指令DB DB - - 定义字节指令定义字节指令DW DW - - 定义数据字指令定义数据字指令DS DS - - 定义存储区指令定义存储区指令BIT BIT - -

4、位定义指令位定义指令(1 1) 定位伪指令定位伪指令 ORGORG格式:格式: ORG 16ORG 16位地址位地址功能:功能: 规定程序块或数据块存放的起始地址。规定程序块或数据块存放的起始地址。如:如: ORGORG8000H8000HSTART:START:MOVMOVA, #30HA, #30H 规定规定“MOV A, #30H”“MOV A, #30H”指令从地址指令从地址8000H8000H单元开始存放,单元开始存放,即标号即标号STARTSTART的值为的值为8000H8000H(2 2)汇编结束伪指令)汇编结束伪指令 ENDEND 告诉汇编程序,对源程序的汇编到此结束。告诉汇编

5、程序,对源程序的汇编到此结束。 一个程序中只出现一一个程序中只出现一 次,在程序的最末尾。次,在程序的最末尾。 例:例: END END(3 3) 赋值伪指令赋值伪指令 EQUEQU 格式:格式: 符号名符号名 EQU EQU 数值或汇编符号数值或汇编符号 功能:告诉汇编程序,将汇编语句中操作数的值赋予本语句的符号功能:告诉汇编程序,将汇编语句中操作数的值赋予本语句的符号名。名。 “ “符号名符号名”在源程序中可以作数值使用,也可以作数据地址、位地址在源程序中可以作数值使用,也可以作数据地址、位地址使用。使用。在使用时,必须先赋值后使用。在使用时,必须先赋值后使用。 先定义后使用,放在程序开头

6、。先定义后使用,放在程序开头。例:例: led_lampled_lamp equequ p1.0 p1.0 counter counter equequ 100 100 display_addrdisplay_addr equequ 2000h 2000h . . movmov r0, #counter r0, #counter movmov dptrdptr, #, #display_addrdisplay_addr movmov c, c, led_lampled_lamp(4) (4) 定义字节数据伪指令定义字节数据伪指令 DBDB格式:格式: 标号:标号: DB DB 字节数据表字节数

7、据表功能:字节数据表可以是多个字节数据、字符串或表功能:字节数据表可以是多个字节数据、字符串或表达式,它表示将字节数据表中的数据从左到右依次存放在指达式,它表示将字节数据表中的数据从左到右依次存放在指定地址单元。定地址单元。例如:例如: ORG 1000HORG 1000HTAB: DB 2EH, 0A0H, A, 2TAB: DB 2EH, 0A0H, A, 2* *4 4 ;表示从表示从1000H1000H单元开始的地方存放数据单元开始的地方存放数据2EH2EH,0A0H0A0H,41H41H(字母(字母A A的的ASCIIASCII码),码),08H08H 即,即,(1000H)=2EH

8、(1000H)=2EH(1001H)=A0H(1001H)=A0H(1002H)=41H(1002H)=41H(1003H)=08H(1003H)=08H(5) (5) 定义字数据伪指令定义字数据伪指令 DWDW格式:格式: 标号:标号: DW DW 字数据表字数据表功能:与功能:与DBDB类似,但类似,但DWDW定义的数据项为字,包括两个定义的数据项为字,包括两个字节,存放时高位在前,低位在后。字节,存放时高位在前,低位在后。例如:例如: ORG 1000HORG 1000H DATA: DW 324AH, 3CH DATA: DW 324AH, 3CH ; ; 表示从表示从1000H100

9、0H单元开始的地方存放数据单元开始的地方存放数据32H32H,4AH4AH,00H 00H ,3CH3CH(3CH3CH以字的形式表示为以字的形式表示为003CH003CH)(6) (6) 定义空间伪指令定义空间伪指令 DSDS格式:格式: 标号:标号: DS DS 表达式表达式功能:从指定的地址开始,保留多少个存储单元作为功能:从指定的地址开始,保留多少个存储单元作为备用的空间。备用的空间。例如:例如: ORG 1000HORG 1000H BUF: DS 50BUF: DS 50 ;50=32H ;50=32H TAB: DB 22HTAB: DB 22H ;22H ;22H存放在存放在1

10、032H1032H单元。单元。 表示从表示从1000H1000H开始的地方预留开始的地方预留5050个(个(1000H1000H1031H1031H)存)存储字节空间。储字节空间。(7 7)位定义指令位定义指令 BITBIT格式:字符名格式:字符名BITBIT位地址位地址功能:将位地址功能:将位地址bitbit赋予所定义的字符名。赋予所定义的字符名。例如:例如: key1 key1BITBITP1.0P1.0 LED LED BIT BIT P1.2P1.2 经汇编后,符号经汇编后,符号key1key1的值是的值是P1.0P1.0的地址的地址90H, P1.290H, P1.2的位的位地址地址

11、92H92H赋给了符号赋给了符号LEDLED。5.3 5.3 汇编语言程序设计概述汇编语言程序设计概述单片机汇编语言程序设计的基本步骤如下单片机汇编语言程序设计的基本步骤如下1.1.分析题意,明确要求。分析题意,明确要求。2.2.确定算法。确定算法。3.3.分配内存工作单元,确定程序与数据区存放地址。分配内存工作单元,确定程序与数据区存放地址。 4.4. 画程序流程图,用图解来描述和说明解题步骤。画程序流程图,用图解来描述和说明解题步骤。 5. 5.按流程图编写源程序。按流程图编写源程序。模块化程序设计模块化程序设计尽量采用循环及子程序结构尽量采用循环及子程序结构自上而下的程序设计自上而下的程

12、序设计 6. 6.仿真、调试和优化程序。仿真、调试和优化程序。 7. 7. 固化程序。固化程序。常用流程图中的符号包括:(1)起始框,形状为 ,用来表示过程的开始和结束。(2)处理框,形状为 ,用来表示某种处理和运算。(3)判断框,形状为 ,用来判断并测试某条件是否满足。(4)流程线,形状为 ,用来表示流程图的路径和方向。(5)换页连接点,形状为 ,当流程图在一页上画不完时,为了确保流程的完整准确,在相应的连接处画上相同的符号,以表示流程图从这里向页外某个地方(出口点)或从本页流程图外某一个地方流入这里(入口点)。MCS-51汇编语言源程序的一般结构汇编语言源程序的一般结构汇编语言源程序一般包

13、括一下几个部分:定义符号常量、程序开始、设汇编语言源程序一般包括一下几个部分:定义符号常量、程序开始、设置中断入口、主程序段、子程序段、中断服务程序段、定义数据表、置中断入口、主程序段、子程序段、中断服务程序段、定义数据表、程序结束。程序结束。XDATEQU0F100H;定义符号常量;定义符号常量BUFEQU30HORG0000H;程序开始地址;程序开始地址LJMPMAIN;转到主程序;转到主程序ORG0003H;设置中断入口;设置中断入口LJMPINT_0;转到中断服务程序;转到中断服务程序ORG0100H;主程序入口地址;主程序入口地址MAIN:MOVSP,#60H;初始化程序段;初始化程

14、序段START:;主程序开始;主程序开始LCALLSUB1LCALLSUB2LJMPSTART;循环执行主程序或者暂停;循环执行主程序或者暂停SUB1:;子程序;子程序SUB1RETSUB2:;子程序;子程序SUB2RETINT_0:;中断服务程序;中断服务程序INT_0RETITAB:DB,;定义数据表;定义数据表DB,END;汇编结束;汇编结束 5.4 5.4 顺序结构顺序结构顺序结构程序是一种最简单、最基本的程序(也称为简单程顺序结构程序是一种最简单、最基本的程序(也称为简单程序),其特点是按程序编写的顺序依次执行,程序流向不序),其特点是按程序编写的顺序依次执行,程序流向不变变 顺序结

15、构程序是所有复杂程序的基础及基本组成部分。顺序结构程序是所有复杂程序的基础及基本组成部分。右图为顺序结构程序的状态流程。右图为顺序结构程序的状态流程。【例例】设有两个设有两个4 4位十进制数,分别存放在位十进制数,分别存放在23H23H、22H22H单元和单元和33H33H,32H32H单元中,求它们的和,并送入单元中,求它们的和,并送入43H43H,42H42H单元中去。单元中去。分析:分析:(1 1)确定算法。由于两个四位)确定算法。由于两个四位BCDBCD码相加,因此要从低位开码相加,因此要从低位开始相加,每进行一次加法运算需要进行一次码调整。始相加,每进行一次加法运算需要进行一次码调整

16、。(2 2)画流程图,根据算法画图。)画流程图,根据算法画图。(3)编写源程序)编写源程序参考程序:参考程序:ORG1000HMOVA,22H;A(22H)ADDA,32H;A(22H)+(32H)DAA;BCD码调整码调整MOV42H,A;存结果低位;存结果低位MOVA,23H;A(23H)ADDC A,33H;A(23H)+(33H)+CYDAA;BCD码调整码调整MOV43H,A;结果存高位;结果存高位SJMP$END;汇编结束;汇编结束【例例】双字节变补程序(设数据在双字节变补程序(设数据在R4R5中)。中)。请分析解决步骤,画出程序流图。请分析解决步骤,画出程序流图。参考程序:参考程

17、序:MOVA,R5;取低字节;取低字节CPLAADDA,#01H;低字节变补;低字节变补MOVR5,AMOVA,R4;取高字节;取高字节CPLAADDCA,#00H;高字节变补;高字节变补MOVR4,A5.5 5.5 分支结构分支结构 分支结构即根据不同的条件做不同的处理。它有两种形分支结构即根据不同的条件做不同的处理。它有两种形式,分别相当于高级语言中的式,分别相当于高级语言中的if-then-elseif-then-else和和casecase语句。语句。前者一次引出两个分支(单分支),后者则可以引出多个前者一次引出两个分支(单分支),后者则可以引出多个分支(多分支)。它们的共同点是运行方

18、向是向前的,在分支(多分支)。它们的共同点是运行方向是向前的,在某一确定条件下,只能执行多个分支中的一支。某一确定条件下,只能执行多个分支中的一支。分支程序结构图分支程序结构图1 1、单分支程序单分支程序使用条件判断实现程序单分支的指令有:使用条件判断实现程序单分支的指令有: (1)(1)字节状态判断:字节状态判断:JZJZ、JNZJNZ、CJNECJNE和和DJNZDJNZ。 (2)(2)位状态判断:位状态判断:JCJC、JNCJNC、JBJB、JNBJNB和和JBCJBC。使用这些指令,可以完成对使用这些指令,可以完成对0 0、正负、大小、溢出、状态等、正负、大小、溢出、状态等各种条件判断

19、。各种条件判断。【例例】假设有两个数在内部假设有两个数在内部RAM RAM 单元的单元的40H 40H 和和41H 41H 中,现在要求找出其中,现在要求找出其中较大的一个数,并将较大的数存入中较大的一个数,并将较大的数存入40H 40H 中,而将较小的一个数存入中,而将较小的一个数存入41H 41H 中。中。分析:根据程序的要求,画出程序的流程图如右图所示,编写程序如下:分析:根据程序的要求,画出程序的流程图如右图所示,编写程序如下: CLR C MOV A ,40H SUBB A,41H JNC FINISH MOV A, 41H XCH A, 40H XCH A, 41HFINISH:

20、SJMP $【例例】设设40H40H单元存放的是一有符号数,求它的绝对值存到单元存放的是一有符号数,求它的绝对值存到41H41H单元。单元。分析:有符号数的最高位是符号位,如果符号位是分析:有符号数的最高位是符号位,如果符号位是1 1,则是负数,取反加一,则是负数,取反加一可以得到绝对值;如果符号位是可以得到绝对值;如果符号位是0 0,则是正数,保持不变。,则是正数,保持不变。程序清单如下:ORG 0000HSTART:MOV A, 40H ;A(40H) XRL A, #80H ;若A值是-128,则保持不变 JZ STOR MOV A, 40H ;A(40H) JNB ACC.7, STO

21、R;判断是否为正数 CPL A ;是负数,求绝对值 ADD A, #1STOR: MOV 41H, A ;41H(A) SJMP $ END、多分支程序、多分支程序多分支又称散转程序,在单片机应用程序开发中经常会遇到程序多分支又称散转程序,在单片机应用程序开发中经常会遇到程序多分支散转情况,所以散转程序设计技术是开发者需要掌握的。多分支散转情况,所以散转程序设计技术是开发者需要掌握的。(1 1)多次使用条件转移,以转向不同的分支入口)多次使用条件转移,以转向不同的分支入口 【例】求符号函数Y=SGN(X)。+1 (当 X0)SGN(X)= 0 (当 X=0)-1 (当 X0)分析:程序流程图如

22、右参考程序:SYMB: MOV A,40H ;取X JZ STOR ;A0转stor JB ACC.7,MINUS MOV A,#01H ;X0,Y=+1 SJMP STORMINUS:MOV A,#0FFH ;X0,Y= -1STOR: MOV 41H,A ;保存Y RET【例例】某温度控制系统,采集的温度值(某温度控制系统,采集的温度值(TaTa)放在累加器)放在累加器A A中。此外,在内部中。此外,在内部RAM30HRAM30H单元存放控制温度下限值单元存放控制温度下限值(TminTmin),在),在31H31H单元存放控制温度上限值(单元存放控制温度上限值(TmaxTmax)。)。若若

23、TaTaTmaxTmax,程序转向,程序转向JWJW(降温处理程序);(降温处理程序);若若TaTaTminTmin,则程序转向,则程序转向SWSW(升温处理程序);(升温处理程序);若若TmaxTmax Ta Ta TminTmin,则程序转向,则程序转向EXITEXIT(返回主程序)(返回主程序)。 CJNE A,30H,LOOP1 CJNE A,30H,LOOP1 ;(;(A A)与)与30H30H单元的内容比较单元的内容比较 AJMP EXIT AJMP EXIT ; A= ; A= (30H30H), ,转到转到EXITEXITLOOP1: JNC JW LOOP1: JNC JW

24、;比;比(30H)(30H)大,转到大,转到JWJW CJNE A,31H ,LOOP2 CJNE A,31H ,LOOP2 AJMP EXIT AJMP EXIT ; A=; A=(31H31H), ,转到转到FHFHLOOP2: JC SW LOOP2: JC SW ;比(;比(31H31H)小,转到)小,转到SWSW AJMP EXIT AJMP EXIT ;比(;比(31H31H)大,转到)大,转到EXITEXITJW: JW: ;降温处理程序段;降温处理程序段SW: SW: ;升温处理程序段;升温处理程序段EXIT: RETEXIT: RET(2 2)使用)使用 JMP A+DPTR

25、JMP A+DPTR指令,转向不同的分支入口指令,转向不同的分支入口散转子程序设计一般有以下步骤:散转子程序设计一般有以下步骤:用用AJMPAJMP或或LJMPLJMP指令构成一个子程序散转地址表。指令构成一个子程序散转地址表。数据寄存器数据寄存器DPTRDPTR指向表的入口地址指向表的入口地址确定变址寄存器确定变址寄存器A A中的内容中的内容用用JMP A+DPTRJMP A+DPTR指令使程序跳转到散转地址表相应的位置,指令使程序跳转到散转地址表相应的位置,从而实现相应子程序跳转从而实现相应子程序跳转JMP A+DPTR JMP A+DPTR 示意图示意图【例例】根据根据R2R2的内容,转

26、向各个处理程序的内容,转向各个处理程序(R2R2)0 0,转向,转向PRG0PRG0(R2R2)1 1,转向,转向PRG1PRG1(R2R2)n n,转向,转向PRGnPRGn参考程序:参考程序: JMP1JMP1: MOV DPTRMOV DPTR,TB_1 TB_1 ;指向跳转表首址;指向跳转表首址 MOV AMOV A,R2R2 ADD A ADD A,R2R2;因为;因为AJMPAJMP指令为两个字节指令为两个字节 JNC L1JNC L1;R2R2* *22562256时,直接到时,直接到L1L1散转散转 INC DPH INC DPH ;当;当(R2)(R2)* *2 225625

27、6时,表空间增加一页,修改时,表空间增加一页,修改DPHDPHL1L1: JMPJMP A ADPTRDPTRTB_1TB_1: AJMP PRG0AJMP PRG0 ;建立中间散转表。;建立中间散转表。AJMPAJMP指令占两个字节。指令占两个字节。 AJMP PRG1AJMP PRG1 ;AJMPAJMP指令的寻址范围为指令的寻址范围为2K2K字节字节 AJMP AJMP PRGnPRGn ;程序长度超过;程序长度超过2K2K,可使用,可使用LJMPLJMP(三字节指令)(三字节指令) PRG0 PRG0: ;各处理程序,地址间隔无规律;各处理程序,地址间隔无规律 PRG1 PRG1: P

28、RGnPRGn: 5.6 5.6 循环结构程序循环结构程序 若需要重复对不同对象做相同的处理过程,则可用循环程序结构。它若需要重复对不同对象做相同的处理过程,则可用循环程序结构。它有两种形式:(有两种形式:(a a)先判断条件,满足条件就执行循环体,否则退出循环。)先判断条件,满足条件就执行循环体,否则退出循环。(b b)先执行循环体然后再判断条件,不满足条件则继续执行循环操作,一)先执行循环体然后再判断条件,不满足条件则继续执行循环操作,一旦满足条件则退出循环。旦满足条件则退出循环。 循环程序都由四个部分组成:循环程序都由四个部分组成:(1 1)循环初始化。循环初始化用于完成循环前的的准备工

29、作。例如,循环)循环初始化。循环初始化用于完成循环前的的准备工作。例如,循环控制计数初值的设置、循环控制标志初态的设置、指向第一个数据的指针设控制计数初值的设置、循环控制标志初态的设置、指向第一个数据的指针设置、为变量预置初值等。置、为变量预置初值等。(2 2)循环体。循环程序结构的核心部分,完成实际的处理工作,是需反复)循环体。循环程序结构的核心部分,完成实际的处理工作,是需反复循环执行的部分,故又称循环体。这部分程序的内容,取决于实际处理问题循环执行的部分,故又称循环体。这部分程序的内容,取决于实际处理问题的本身。的本身。(3 3)循环控制。在重复执行循环体的过程中)循环控制。在重复执行循

30、环体的过程中, ,不断修改循环控制变量,直到不断修改循环控制变量,直到符合结束条件符合结束条件, ,就结束循环程序的执行。循环结束控制方法分为循环计数控就结束循环程序的执行。循环结束控制方法分为循环计数控制法和条件控制法。制法和条件控制法。(4 4)循环结束。这部分是对循环程序执行的结果进行分析、处理和存放。)循环结束。这部分是对循环程序执行的结果进行分析、处理和存放。 1 1、单循环结构单循环结构 (1) 计数控制单循环结构计数循环控制结构是依据计数器的值来决定循环次数依据计数器的值来决定循环次数,一般为减“1”计数器,计数器减到“0”时,结束循环。计数器的初值是在初始化时设定。MCS-51

31、的指令系统提供了功能极强的循环控制指令DJNZ。【例5-8】数据块传送。设内部RAM 30H开始存放了50个数据,编写程序,将这50个数据送到外部RAM 1000H开始的单元中。程序清单如下:ORG 0000HMOV R0, #30H ;初始化地址指针MOV DPTR,#1000HMOV R7, #50 ;初始化循环次数AGAIN: MOV A, R0;取一个数 MOV DPTR, A ;送到外部RAM INC R0;修改指针 INC DPTR DJNZ R7, AGAIN;循环结束控制,利用减1计数器R7 SJMP $ END【例例5-9】设有设有100个单字节数。连续存放在内部个单字节数。

32、连续存放在内部M单元开始的数据单元开始的数据存储器中,且总和也为单字节数,试编写求这存储器中,且总和也为单字节数,试编写求这100个数之和的程序。个数之和的程序。分析:若用简单程序编写,需要分析:若用简单程序编写,需要99条加法指令进行相加,这样程序条加法指令进行相加,这样程序冗长,因此易使用循环程序。需要设置指针,一个对地址计数用来指冗长,因此易使用循环程序。需要设置指针,一个对地址计数用来指示下一个数的地址;另一个对相加次数计数即控制循环次数。程序流示下一个数的地址;另一个对相加次数计数即控制循环次数。程序流程如图所示:程如图所示:参考程序:NEQU08HMEQU09H ORG0000H

33、MOVA,#00H MOVR0,#M MOVR1,#64HLOOP: ADDA,R0 INCR0 DJNZR1,LOOP MOVN,A END【例例】为一串为一串7位位ASCII码数据的码数据的D7位加上奇校验,设数据存放在片外位加上奇校验,设数据存放在片外RAM的的2101H起始单元,数据长度在起始单元,数据长度在2100H单元。单元。参考程序:参考程序:MOVDPTR,#2100HMOVXA,DPTRMOVR2,A;循环次数存于循环次数存于R2NEXT:INCDPTRMOVXA,DPTRORLA,#80HJNBP,PASS;若若P=0,则,则1的个数为偶数,跳至的个数为偶数,跳至PASS处

34、处MOVXDPTR,APASS:DJNZR2,NEXTDONE:SJMPDONE (2 2)条件控制单循环结构)条件控制单循环结构计数控制方法只有在循环次数已知的情况下才适用。对计数控制方法只有在循环次数已知的情况下才适用。对循环次数未知的问题,不能用循环次数来控制。往往需要根循环次数未知的问题,不能用循环次数来控制。往往需要根据某种条件来判断是否应该终止循环。据某种条件来判断是否应该终止循环。【例5-10】在起始地址为BUF的内部数据存储器中放有80个数,其中有一个数的值等于FFH。试编写程序,求出这个数的地址,送RESULT单元。若这个数不存在,则将0送入RESULT单元。源程序如下:RE

35、SULT EQU 0FH BUF EQU10H ORG 0000H MOV R0,#BUF MOV R1,#80LOOP:CJNE R0,#0FFH,L1 SJMP L2 L1:INCR0 DJNZ R1,LOOP MOV RESULT, #00H SJMP L3L2:MOV RESULT, R0 L3:SJMP $ END 、多重循环、多重循环 多重循环即循环嵌套结构。多重循环程序的设计方法和单重循环是一样的,只是要分别考虑各重循环的控制条件。内循环属于外循环循环体中的具体处理部分。在多重嵌套中,不允许各个循环体互相交叉不允许各个循环体互相交叉,也不允许也不允许从外循环跳入内循环从外循环跳入

36、内循环,否则编译时会出错。应该注意的是每次通过外循环进入内循环时,内循环的初始条件需要重置。循环嵌套结构如图所示。 【例】将内存一串单字节无符号数升序排序。分析:冒泡算法。每次取相邻单元的两个数比较,决定是否需要交换数据位置。第一次循环,比较N-1次,取到数据表中最大值。第二次循环,比较N-2次,取到次大值。 第N-1次循环:比较一次,排序结束。 SORTSORT: MOV AMOV A,#N-1 #N-1 ;N N个数据排序个数据排序 MOV R4MOV R4,A A ;外循环次数;外循环次数LOOP1: MOV ALOOP1: MOV A,R4R4 MOV R3 MOV R3,A A ;内

37、循环次数;内循环次数 MOV R0MOV R0,#TAB #TAB ;设数据指针;设数据指针LOOP2LOOP2:MOV MOV A A,R0 R0 ;取一个数;取一个数MOV MOV B B,A A ;第一个数送到;第一个数送到B BINC INC R0 R0;修改指针,;修改指针,R0R0指向下一个数指向下一个数MOV MOV A A,R0R0;取第二个数,送到;取第二个数,送到A ACLR CCLR CSUBB ASUBB A,B B ;比较(;比较(ABAB跳转)跳转)JNC JNC UNEXCH UNEXCH ;ABAB,不交换,不交换MOV A, BMOV A, B ;否则两个数据

38、交换;否则两个数据交换XCH XCH A A,R0R0DEC DEC R0 R0MOV MOV R0 R0 ,A AINC R0INC R0UNEXCHUNEXCH:DJNZDJNZ R3 R3,LOOP2 LOOP2 ;内循环结束?;内循环结束?DJNZ R4DJNZ R4,LOOP1 LOOP1 ;外循环结束?;外循环结束?SJMP $SJMP $END END 5.7 5.7 子程序子程序 在编制程序时,往往会有一些功能在程序中多次被用到(比如:显在编制程序时,往往会有一些功能在程序中多次被用到(比如:显示、排序、查找、延时等等),往往将这些功能编成一个个的子程序(示、排序、查找、延时等

39、等),往往将这些功能编成一个个的子程序(过程、函数)以备调用。在编写子程序时应注意以下问题:过程、函数)以备调用。在编写子程序时应注意以下问题: 1 1、子程序的定义、子程序的定义 子程序的写法类似写一般程序,应满足通用性的要求,不针对具体子程序的写法类似写一般程序,应满足通用性的要求,不针对具体数据编程。数据编程。 子程序的第一条指令的地址称为子程序的入口地址。该指令前必须子程序的第一条指令的地址称为子程序的入口地址。该指令前必须有标号,以供调用。有标号,以供调用。 结尾用结尾用retret指令用来返回原调用处。指令用来返回原调用处。 子程序注释需提供足够的调用信息,比如:子程序名、子程序功

40、能子程序注释需提供足够的调用信息,比如:子程序名、子程序功能、入口参数和出口参数、子程序占用的硬件资源、子程序中调用的其他、入口参数和出口参数、子程序占用的硬件资源、子程序中调用的其他子程序名,等等。子程序名,等等。2 2、调用与返回、调用与返回 调用类指令(调用类指令(ACALLACALL、LCALLLCALL)后写上子程序的入口地址。所做)后写上子程序的入口地址。所做的操作先保存断点地址,而后转入子程序执行指令。的操作先保存断点地址,而后转入子程序执行指令。 在程序的最后使用在程序的最后使用retret指令,所做的操作就是将压入堆栈的断指令,所做的操作就是将压入堆栈的断点地址弹出给点地址弹

41、出给PCPC,使程序接着顺序执行调用类指令后面的指令序列。,使程序接着顺序执行调用类指令后面的指令序列。3 3、注意设置堆栈指针、注意设置堆栈指针 调用子程序之前设置好堆栈。子程序嵌套须考虑堆栈容量。调用子程序之前设置好堆栈。子程序嵌套须考虑堆栈容量。4 4、现场保护和恢复工作、现场保护和恢复工作 为避免子程序在运行过程中,修改主调程序中使用的寄存器为避免子程序在运行过程中,修改主调程序中使用的寄存器/ /存储单存储单元的原有内容。元的原有内容。 在子程序开始运行时应进行在子程序开始运行时应进行“现场保护现场保护”; 在子程序运行结束时应进行在子程序运行结束时应进行“现场恢复现场恢复”。 原则

42、上子程序中使用过的寄存器应该保存。但用于传递参数的寄存器原则上子程序中使用过的寄存器应该保存。但用于传递参数的寄存器则无需保存。则无需保存。 注意,如果有较多的寄存器要保护,则应使主、子程序使用不同的寄注意,如果有较多的寄存器要保护,则应使主、子程序使用不同的寄存器组。存器组。 使用堆栈来保存寄存器的内容。注意由于堆栈是使用堆栈来保存寄存器的内容。注意由于堆栈是“后进先出后进先出”,所以,所以注意保存和恢复的顺序。注意保存和恢复的顺序。5 5、参数的传递、参数的传递 主程序调用子程序时,往往需要把子程序所需的初始数据(入口参数)主程序调用子程序时,往往需要把子程序所需的初始数据(入口参数)设置

43、好,子程序执行完毕返回主程序时也往往需要将子程序的执行结果设置好,子程序执行完毕返回主程序时也往往需要将子程序的执行结果(出口参数)送给主程序。(出口参数)送给主程序。 为完成参数传送,实际上就是事先约定参数的存放地址。为完成参数传送,实际上就是事先约定参数的存放地址。 常用的参数传递方式有:寄存器传送参数、存储器传送参数和堆栈传常用的参数传递方式有:寄存器传送参数、存储器传送参数和堆栈传送参数。前两种方法广为采用。送参数。前两种方法广为采用。 寄存器传送参数寄存器传送参数【例】编写一个子程序,将片内的一组单元清零。子程序不包含这组单元的起始地址和单元的个数。 SUBRT: MOV A,#00

44、HSUBRT: MOV A,#00HMAIN: MAIN: MOV R0,#30H; MOV R0,#30H; MOV R7,#0AH; MOV R7,#0AH; ACALL SUBRT ACALL SUBRT LOOP: MOV R0, ALOOP: MOV R0, A INC R0 INC R0 DJNE R7, LOOP DJNE R7, LOOP RET RET END END【例例】假设数据区的起始地址事先存放在假设数据区的起始地址事先存放在70H70H单元,被清零单元的个数事单元,被清零单元的个数事先存放在先存放在71H71H单元,主程序及子程序如下:单元,主程序及子程序如下: M

45、AIN: MAIN: PUSH 70H PUSH 70H PUSH 71H PUSH 71H ACALL SUBRT ACALL SUBRT SUBRT: POP DPHSUBRT: POP DPH POP DPL POP DPL POP 7 POP 7 POP 0 POP 0 堆栈传送参数 MOV A,#00H MOV A,#00HLOOP: MOV R0,ALOOP: MOV R0,A INC R0 INC R0 DJNZ R7,LOOP DJNZ R7,LOOP PUSH DPL PUSH DPL PUSH DPH PUSH DPH RET RET5.8 5.8 汇编语言实用程序设计汇编

46、语言实用程序设计 5.8.1 5.8.1 延时程序延时程序 实现延时程序的延时常用的方法有两种:一是用定时器中断来实现,一是用指令循环来实现。在系统时间允许的情况下可以采用后一种方法。 延时程序与MCS-51指令执行时间有很大的关系。在使用12MHz晶振时,一个机器周期为1s。可用如下双重循环方法写出延时程序。查指令表可知, MOV Rn, #data是1机器周期指令, NOP是1机器周期指令, DJNZ Rn, rel是2机器周期指令。 例:50ms延时子程序DEL50: MOVR7,#200;(1)外循环次数执行1次DEL1: MOV R6,#123;(2)执行200次 NOP;(3)执行

47、200次DEL2: DJNZ R6,DEL2 ;(4)执行200*123次 DJNZ R7,DEL1 ;(5)执行200次 RET此程序实际延迟时间为: 1+200(1+1+123 2+2) 1s =50.001ms注意:软件延时程序,不允许有中断,否则将严重影响定时的准确性。 5.8.2 5.8.2 查表程序MCS-51指令系统给用户提供了两条查表指令: (1)MOVCA,A+PC (2)MOVCA,A+DPTR 1、查表指令“MOVCA,A+PC”的使用 指令“MOVC A,A+PC”的优点是预处理较少且不影响其它特殊功能寄存器的值,所以不必保护其它特殊功能寄存器的原先值;缺点在于该表格只能存放在这条指令的地址以下的00FFH之中。表格所在的程序空间受到了限制。【例】根据累加器A中存放一个09之间的数,查出相应的7段码。地 址 子程序Addr ADD A,#01HAddr +2 MOVC A,A+PCAddr +3 RETAddr +4 DB 3FH,06H,5BH,4FH,66H;共阴极 DB 6DH,7DH,07H,7FH,6FH;段码表偏移量 = 表首地址-(查表指令所在的地址+1)上例中,表首地址为Addr +4,所以偏移量 = Addr +4-(Addr +2+1)=1,所以,在使用查表指令MOVC A,A

温馨提示

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

评论

0/150

提交评论