资源描述
第第4 4章章 汇编语言程序设计知识汇编语言程序设计知识 原理与接口技术7/15/202411.了解汇编语言编程的基础知识;了解汇编语言编程的基础知识;2.了解汇编语言程序设计的基本步骤和方法;了解汇编语言程序设计的基本步骤和方法;3.了解汇编语言的特点:目标程序效率高、占存了解汇编语言的特点:目标程序效率高、占存储空间少、运行速度快、实时性强等;储空间少、运行速度快、实时性强等;4.掌握掌握89C51汇编语言的几种结构:顺序、分支、汇编语言的几种结构:顺序、分支、循环、查表及子程序的结构;循环、查表及子程序的结构;5.掌握一些常用汇编子程序的编程方法。掌握一些常用汇编子程序的编程方法。6.掌握常用的一些伪指令。掌握常用的一些伪指令。本章教学要求本章教学要求 第第第第4 4 4 4章章章章 汇编语言程序设计知识汇编语言程序设计知识汇编语言程序设计知识汇编语言程序设计知识 7/15/202424.1.1 编程步骤编程步骤1 1、分析问题、分析问题2 2、确定算法、确定算法3 3、画程序流程图、画程序流程图4 4、编写源程序、编写源程序4.1 编程的步骤、方法和技巧编程的步骤、方法和技巧7/15/202431、分析问题、分析问题n n对需要解决的问题进行分析,以求对问题对需要解决的问题进行分析,以求对问题由正确的理解。由正确的理解。n n解决问题的任务是什么?解决问题的任务是什么?n n工作过程?工作过程?n n现有的条件,已知数据,对运算的精度和现有的条件,已知数据,对运算的精度和速度方面的要求?速度方面的要求?n n设计的硬件结构是否方便编程?设计的硬件结构是否方便编程?7/15/202442、确定算法、确定算法n n算法是如何将实际问题转化成程序模块来算法是如何将实际问题转化成程序模块来处理。处理。n n在编程以前,先要对几种不同的算法进行在编程以前,先要对几种不同的算法进行分析、比较,找出最适宜的算法。分析、比较,找出最适宜的算法。7/15/202453、画程序流程图、画程序流程图n n程序流程图是使用各种图形、符号、有向线程序流程图是使用各种图形、符号、有向线段等来说明程序设计过程的一种直观的表示。段等来说明程序设计过程的一种直观的表示。n n流程图步骤分得越细致,编写程序是也越方流程图步骤分得越细致,编写程序是也越方便。便。n n画流程图是程序结构设计是采用的一种重要画流程图是程序结构设计是采用的一种重要手段。手段。n n一个系统软件有总的流程图(主程序流程图)一个系统软件有总的流程图(主程序流程图)和局部的流程图(子程序流程图)。和局部的流程图(子程序流程图)。n n流程图常采用的图形和符号。流程图常采用的图形和符号。7/15/20246椭圆框椭圆框或桶形框或桶形框:表示程序的开始或结束。表示程序的开始或结束。矩形框矩形框:表示要进行的工作。:表示要进行的工作。菱形框菱形框:表示要判断的事情,菱形框内表示要判断的事情,菱形框内的表达式表示要判断的内容。的表达式表示要判断的内容。圆圈圆圈:表示连接点表示连接点指向线指向线:表示程序的流向表示程序的流向程序流程图常用的图形及符号程序流程图常用的图形及符号7/15/202474、编写源程序、编写源程序n n用用89C51汇编语言编写的源程序行(一条语汇编语言编写的源程序行(一条语句)包括四个部分,也叫四个字段:句)包括四个部分,也叫四个字段:标号标号:操作码操作码 操作数操作数;注释注释n n 每个字段之间要用分隔符分隔,而每个字段每个字段之间要用分隔符分隔,而每个字段内部不能使用分隔符。可以用作分隔符的符内部不能使用分隔符。可以用作分隔符的符号:空格号:空格“”、冒号、冒号“:”、逗号、逗号“,”、分号、分号“;”等。等。例:例:MAIN:MOV A,#00H;立即数;立即数00HA7/15/20248标号:标号:n n标号是用户定义的符号地址。标号是用户定义的符号地址。标号是用户定义的符号地址。标号是用户定义的符号地址。n n一条指令的标号是该条指令的符号名字,标号的值一条指令的标号是该条指令的符号名字,标号的值一条指令的标号是该条指令的符号名字,标号的值一条指令的标号是该条指令的符号名字,标号的值是汇编这条指令时指令的地址。是汇编这条指令时指令的地址。是汇编这条指令时指令的地址。是汇编这条指令时指令的地址。n n标号由以英文字母开始的标号由以英文字母开始的标号由以英文字母开始的标号由以英文字母开始的1 18 8个字母或数字组成,个字母或数字组成,个字母或数字组成,个字母或数字组成,以冒号以冒号以冒号以冒号“:”结尾。结尾。结尾。结尾。n n标号可以由赋值伪指令赋值,如果没有赋值,汇编标号可以由赋值伪指令赋值,如果没有赋值,汇编标号可以由赋值伪指令赋值,如果没有赋值,汇编标号可以由赋值伪指令赋值,如果没有赋值,汇编程序把存放该指令目标码第一字节的存储单元的地程序把存放该指令目标码第一字节的存储单元的地程序把存放该指令目标码第一字节的存储单元的地程序把存放该指令目标码第一字节的存储单元的地址赋给该标号,所以,标号又叫指令标号。址赋给该标号,所以,标号又叫指令标号。址赋给该标号,所以,标号又叫指令标号。址赋给该标号,所以,标号又叫指令标号。7/15/20249操作码操作码n n操作码是必不可少的。操作码是必不可少的。n n它用一组字母符号表示指令的操作码。它用一组字母符号表示指令的操作码。n n在在89C51中,由中,由89C51的指令助记符组成。的指令助记符组成。7/15/202410操作数操作数n n汇编语言指令可能要求或不要求操作数,所以这一汇编语言指令可能要求或不要求操作数,所以这一汇编语言指令可能要求或不要求操作数,所以这一汇编语言指令可能要求或不要求操作数,所以这一字段可能有也可能没有。字段可能有也可能没有。字段可能有也可能没有。字段可能有也可能没有。n n若有两个操作数,操作数之间用逗号若有两个操作数,操作数之间用逗号若有两个操作数,操作数之间用逗号若有两个操作数,操作数之间用逗号“,”分开。分开。分开。分开。n n操作数包括的内容有:操作数包括的内容有:操作数包括的内容有:操作数包括的内容有:n n(1 1)工作寄存器:由)工作寄存器:由)工作寄存器:由)工作寄存器:由PSW.3PSW.3和和和和PSW.4PSW.4规定的当前工规定的当前工规定的当前工规定的当前工作寄存器区中的作寄存器区中的作寄存器区中的作寄存器区中的R0R0R7R7。n n(2 2)特殊功能寄存器:)特殊功能寄存器:)特殊功能寄存器:)特殊功能寄存器:2121个个个个SFRSFR的名字。的名字。的名字。的名字。n n(3 3)标号名:赋值标号)标号名:赋值标号)标号名:赋值标号)标号名:赋值标号由汇编指令由汇编指令由汇编指令由汇编指令EQUEQU等赋值等赋值等赋值等赋值的标号;指令标号的标号;指令标号的标号;指令标号的标号;指令标号指令标号指示的指令的第一字指令标号指示的指令的第一字指令标号指示的指令的第一字指令标号指示的指令的第一字节地址是该标号的值。节地址是该标号的值。节地址是该标号的值。节地址是该标号的值。7/15/202411(4 4)常数:可用二进制()常数:可用二进制()常数:可用二进制()常数:可用二进制(B B)、十进制、十六进制)、十进制、十六进制)、十进制、十六进制)、十进制、十六进制(HH),若常数以字符开头,前面加),若常数以字符开头,前面加),若常数以字符开头,前面加),若常数以字符开头,前面加0 0。(5 5)$:用来表示程序计数器的当前值。:用来表示程序计数器的当前值。:用来表示程序计数器的当前值。:用来表示程序计数器的当前值。(6 6)表达式:汇编时,计算出表达式的值填入目)表达式:汇编时,计算出表达式的值填入目)表达式:汇编时,计算出表达式的值填入目)表达式:汇编时,计算出表达式的值填入目标码。标码。标码。标码。7/15/202412注释注释n n注释部分不是汇编语言的功能部分,只是用语增注释部分不是汇编语言的功能部分,只是用语增注释部分不是汇编语言的功能部分,只是用语增注释部分不是汇编语言的功能部分,只是用语增加程序的可读性。加程序的可读性。加程序的可读性。加程序的可读性。n n良好的注释是汇编语言程序编写中的重要组成部良好的注释是汇编语言程序编写中的重要组成部良好的注释是汇编语言程序编写中的重要组成部良好的注释是汇编语言程序编写中的重要组成部分。分。分。分。具体要求:初学一定要加注释!具体要求:初学一定要加注释!7/15/2024134.1.2 4.1.2 编程的方法和技巧编程的方法和技巧1 1、程序功能模块化的优点、程序功能模块化的优点、程序功能模块化的优点、程序功能模块化的优点n n单个模块结构的程序功能单一,易于编写、调试和修改。单个模块结构的程序功能单一,易于编写、调试和修改。单个模块结构的程序功能单一,易于编写、调试和修改。单个模块结构的程序功能单一,易于编写、调试和修改。n n便于分工,从而可使多个程序员同时进行程序的编写和便于分工,从而可使多个程序员同时进行程序的编写和便于分工,从而可使多个程序员同时进行程序的编写和便于分工,从而可使多个程序员同时进行程序的编写和调试工作,加快软件研制进度。调试工作,加快软件研制进度。调试工作,加快软件研制进度。调试工作,加快软件研制进度。n n程序可读性好,便于功能扩充和版本升级。程序可读性好,便于功能扩充和版本升级。程序可读性好,便于功能扩充和版本升级。程序可读性好,便于功能扩充和版本升级。n n对程序的修改可局部进行,其它部分可以保持不变。对程序的修改可局部进行,其它部分可以保持不变。对程序的修改可局部进行,其它部分可以保持不变。对程序的修改可局部进行,其它部分可以保持不变。n n对于使用频繁的子程序可以建立子程序库,便于多个模对于使用频繁的子程序可以建立子程序库,便于多个模对于使用频繁的子程序可以建立子程序库,便于多个模对于使用频繁的子程序可以建立子程序库,便于多个模块调用。块调用。块调用。块调用。一、模块化程序设计方法一、模块化程序设计方法7/15/202414n n每个模块应具有独立的功能,能产生一个明确的每个模块应具有独立的功能,能产生一个明确的每个模块应具有独立的功能,能产生一个明确的每个模块应具有独立的功能,能产生一个明确的结果,即单模块的功能高内聚性。结果,即单模块的功能高内聚性。结果,即单模块的功能高内聚性。结果,即单模块的功能高内聚性。n n模块之间的控制耦合应尽量简单,数据耦合应尽模块之间的控制耦合应尽量简单,数据耦合应尽模块之间的控制耦合应尽量简单,数据耦合应尽模块之间的控制耦合应尽量简单,数据耦合应尽量少,即模块间的低耦合性。控制耦合是指模块量少,即模块间的低耦合性。控制耦合是指模块量少,即模块间的低耦合性。控制耦合是指模块量少,即模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间进入和退出的条件及方式,数据耦合是指模块间进入和退出的条件及方式,数据耦合是指模块间进入和退出的条件及方式,数据耦合是指模块间的信息交换方式、交换量的多少及交换频繁程度。的信息交换方式、交换量的多少及交换频繁程度。的信息交换方式、交换量的多少及交换频繁程度。的信息交换方式、交换量的多少及交换频繁程度。n n模块长度适中。模块长度适中。模块长度适中。模块长度适中。2020条条条条100100条的范围较合适。条的范围较合适。条的范围较合适。条的范围较合适。2 2、模块划分的原则、模块划分的原则、模块划分的原则、模块划分的原则7/15/2024151 1、尽量采用循环结构和子程序。、尽量采用循环结构和子程序。、尽量采用循环结构和子程序。、尽量采用循环结构和子程序。2 2、尽量少用无条件转移指令。、尽量少用无条件转移指令。、尽量少用无条件转移指令。、尽量少用无条件转移指令。3 3、对于通用的子程序,考虑到其通用性,除了用于存放、对于通用的子程序,考虑到其通用性,除了用于存放、对于通用的子程序,考虑到其通用性,除了用于存放、对于通用的子程序,考虑到其通用性,除了用于存放子程序入口参数的寄存器外,子程序中用到的其他寄存子程序入口参数的寄存器外,子程序中用到的其他寄存子程序入口参数的寄存器外,子程序中用到的其他寄存子程序入口参数的寄存器外,子程序中用到的其他寄存器的内容应压入堆栈(返回前再弹出),即保护现场。器的内容应压入堆栈(返回前再弹出),即保护现场。器的内容应压入堆栈(返回前再弹出),即保护现场。器的内容应压入堆栈(返回前再弹出),即保护现场。4 4、在中断处理程序中,除了要保护处理程序中用到的寄、在中断处理程序中,除了要保护处理程序中用到的寄、在中断处理程序中,除了要保护处理程序中用到的寄、在中断处理程序中,除了要保护处理程序中用到的寄存器外,还要保护标志寄存器。存器外,还要保护标志寄存器。存器外,还要保护标志寄存器。存器外,还要保护标志寄存器。5 5、用累加器传递入口参数或返回参数比较方便,在子程、用累加器传递入口参数或返回参数比较方便,在子程、用累加器传递入口参数或返回参数比较方便,在子程、用累加器传递入口参数或返回参数比较方便,在子程序中,一般不必把累加器内容压入堆栈。序中,一般不必把累加器内容压入堆栈。序中,一般不必把累加器内容压入堆栈。序中,一般不必把累加器内容压入堆栈。二、编程技巧二、编程技巧7/15/2024164.1.3 4.1.3 汇编语言程序的基本结构汇编语言程序的基本结构一、顺序程序一、顺序程序n n顺序程序是最简单的程序结构,即顺序结构。顺序程序是最简单的程序结构,即顺序结构。n n程序按顺序一条一条地执行指令。程序按顺序一条一条地执行指令。7/15/202417例例例例4-1 4-1 将片内将片内将片内将片内RAMRAM的的的的20H20H单元中的压缩单元中的压缩单元中的压缩单元中的压缩BCDBCD码拆成两个码拆成两个码拆成两个码拆成两个ACSIIACSII码存入码存入码存入码存入21H21H、22H22H单元。低单元。低单元。低单元。低4 4位存在位存在位存在位存在21H21H单元,高单元,高单元,高单元,高4 4位存在位存在位存在位存在22H22H单元。单元。单元。单元。-顺序程序实例顺序程序实例MOV A,20HMOV B,#10H;除以除以10HDIVABORLB,#30H;低低4位位BCD码转换为码转换为ASCII码码MOV 21H,BORLA,#30H;高高4位位BCD码转换为码转换为ASCII码码MOV 22H,A压缩压缩BCD码与非压缩码与非压缩BCD码的区别:码的区别:压缩压缩BCD码的每一位用码的每一位用4位二进制表示,一个位二进制表示,一个字节表示两位十进制数。例如字节表示两位十进制数。例如10010110B表示十进表示十进制数制数96D;非压缩非压缩BCD码用码用1个字节表示一位十进制数,个字节表示一位十进制数,高四位总是高四位总是0000,低,低4位的位的00001001表示表示09.例例如如00001000B表示十进制数表示十进制数8.7/15/202418例例4-2 设有设有16位二进制数存放在内部位二进制数存放在内部RAM的的50H及及51H单单元中,要求将其算术左移一位(即原数各位均向左移元中,要求将其算术左移一位(即原数各位均向左移1位,位,最低位移入最低位移入0)后仍存放在原单元。试编制相应的程序。)后仍存放在原单元。试编制相应的程序。-顺序结构实例顺序结构实例BIHR:CLR C ;Cy清零清零 MOV A,51H ;低低8位向左环移位向左环移1位位 RLC A MOV 51H,A MOV A,50H ;高高8位向左环移位向左环移1位位 RLC A MOV 50H,A 7/15/202419二、分支程序二、分支程序n n程序分支是通过条件转移指令实现的,即根据条件对程序的程序分支是通过条件转移指令实现的,即根据条件对程序的程序分支是通过条件转移指令实现的,即根据条件对程序的程序分支是通过条件转移指令实现的,即根据条件对程序的执行进行判断、满足条件则进行程序转移,不满足条件就顺执行进行判断、满足条件则进行程序转移,不满足条件就顺执行进行判断、满足条件则进行程序转移,不满足条件就顺执行进行判断、满足条件则进行程序转移,不满足条件就顺序执行程序。序执行程序。序执行程序。序执行程序。n n分支程序又分为单分支、双分支和多分支结构。分支程序又分为单分支、双分支和多分支结构。分支程序又分为单分支、双分支和多分支结构。分支程序又分为单分支、双分支和多分支结构。n n多分支程序是首先把分支程序按序号排列,然后按序号值进多分支程序是首先把分支程序按序号排列,然后按序号值进多分支程序是首先把分支程序按序号排列,然后按序号值进多分支程序是首先把分支程序按序号排列,然后按序号值进行转移。行转移。行转移。行转移。n n在在在在89C5189C51指令系统中,通过条件判断实现单分支程序转移的指令系统中,通过条件判断实现单分支程序转移的指令系统中,通过条件判断实现单分支程序转移的指令系统中,通过条件判断实现单分支程序转移的指令有:指令有:指令有:指令有:JZJZ、JNZJNZ、CJNECJNE、DJNZDJNZ等。此外还有以位状态作等。此外还有以位状态作等。此外还有以位状态作等。此外还有以位状态作为条件进行程序分支的指令,如为条件进行程序分支的指令,如为条件进行程序分支的指令,如为条件进行程序分支的指令,如JCJC、JNCJNC、JBJB、JNBJNB、JBCJBC等。使用这些指令可以完成等。使用这些指令可以完成等。使用这些指令可以完成等。使用这些指令可以完成0 0、1 1、正、负,以及相等、不相、正、负,以及相等、不相、正、负,以及相等、不相、正、负,以及相等、不相等作为各种条件判断依据的程序转移。等作为各种条件判断依据的程序转移。等作为各种条件判断依据的程序转移。等作为各种条件判断依据的程序转移。7/15/202420编写程序,根据编写程序,根据x的值求的值求y的值,并放回原单元中。的值,并放回原单元中。-分支结构实例分支结构实例例例4-3 设变量设变量x以补码形式存放在片内以补码形式存放在片内RAM的的30H单元中,单元中,变量变量y与与x的关系是:的关系是:7/15/202421-分支结构实例分支结构实例START:MOV A,30H JZ NEXT;x=0,转移转移 ANL A,#80H ;保留符号位保留符号位 JZ ED ;x 0 ,转移转移 MOV A,#05H ;x 0,不转移不转移 ADD A,30H MOV 30H,A SJMP EDNEXT:MOV 30H,#20HED:SJMP$程序如下:程序如下:7/15/202422例例4-4 128种分支转移程序。种分支转移程序。功能:根据入口条件转移到功能:根据入口条件转移到128个目的地址。个目的地址。入口:入口:(R3)转移目的地址的序号转移目的地址的序号00H7FH。出口:出口:转移到相应于程序入口。转移到相应于程序入口。-分支结构实例分支结构实例散转指令转向0分支转向1分支转向n-1分支转向n分支K=0K=1K=n-1K=n7/15/202423JMP-128:MOV A,R3 RLA MOVDPTR,#JMPTAB JMPA+DPTRJMPTAB:AJMP ROUT00 ;128个子程序首址个子程序首址 AJMP ROUT01 AJMP ROUT7F7/15/202424三、循环程序三、循环程序 在程序运行时,有时需要连续重复执行某在程序运行时,有时需要连续重复执行某段程序,可以使用循环程序。其结构包括四段程序,可以使用循环程序。其结构包括四部分:部分:1、置循环初值、置循环初值 2、循环体(循环工作部分)、循环体(循环工作部分)3、修改控制变量、修改控制变量 4、循环控制部分、循环控制部分7/15/2024251、置循环初值、置循环初值n n对于循环程序中所使用的工作单元,在循对于循环程序中所使用的工作单元,在循环开始时应置初值。环开始时应置初值。n n例如,工作寄存器设置计数初值,累加器例如,工作寄存器设置计数初值,累加器A清清0,以及设置地址指针、长度等。,以及设置地址指针、长度等。7/15/2024262、循环体(循环工作部分)、循环体(循环工作部分)n n重复执行的程序段部分,分为循环工作部重复执行的程序段部分,分为循环工作部分和循环控制部分。分和循环控制部分。n n循环控制部分每循环一次,检查结束条件,循环控制部分每循环一次,检查结束条件,当满足条件时,就停止循环,往下继续执当满足条件时,就停止循环,往下继续执行其他程序行其他程序7/15/2024273、修改控制变量、修改控制变量n n在循环程序中,不许给出循环结束条件。在循环程序中,不许给出循环结束条件。n n常见的是计数循环,当循环了一定的次数常见的是计数循环,当循环了一定的次数后,就停止循环。后,就停止循环。n n在单片机中,一般用一个工作寄存器在单片机中,一般用一个工作寄存器Rn作作为计数器,对该计数器赋初值作为循环次为计数器,对该计数器赋初值作为循环次数。每循环一次,计数器的值减数。每循环一次,计数器的值减1,即修改,即修改循环控制变量,当计数器的置件为循环控制变量,当计数器的置件为0时,就时,就停止循环。停止循环。7/15/2024284、循环控制部分、循环控制部分n n根据循环结束条件,判断是否结束循环。根据循环结束条件,判断是否结束循环。n n89C51可采用可采用DJNZ指令来自动修改控制变指令来自动修改控制变量并能结束循环。量并能结束循环。7/15/202429置初值置初值循环体循环体循环修改循环修改循环控制循环控制退出循环退出循环未完未完完(a)置初值置初值循环体循环体循环修改循环修改循环控制循环控制退出循环退出循环未完未完完完(b)循环组织方式流程图循环组织方式流程图7/15/202430n n例例例例4-54-54-54-5 将内部将内部RAMRAM中起始地址为中起始地址为datadata的数据串传送到外部的数据串传送到外部RAMRAM中起始地址为中起始地址为bufbuf的存储区域内,直到发现的存储区域内,直到发现“$”“$”字符停止传字符停止传送。送。n n本例结束条件为找到本例结束条件为找到“$”“$”停止传送。程序如下:停止传送。程序如下:MOV R0,#DATA ;源数据区首地址源数据区首地址 MOV DPTR,#BUF ;目的数据区首地址目的数据区首地址LOOP0:MOVA,R0 ;取数据取数据 CJNE A,#24H,LOOP1;判断是否为判断是否为$字符字符 SJMPLOOP2;是是$,转结束转结束LOOP1:MOVX DPTR,A ;不是不是$,执行传送执行传送 INCR0 ;修改源地址修改源地址 INCDPTR ;修改目的地址修改目的地址 SJMPLOOP0 ;传送下一个数据传送下一个数据LOOP2:SJMP$-循环结构实例循环结构实例7/15/202431n n例例4-6 设设89C51单片机使用单片机使用12MHz晶振(机器晶振(机器周期周期T为为ls),试计算延时时间。),试计算延时时间。ORG 4000HDEYPRG:MOV R5,#80H ;1个机器周期个机器周期LOOP1:MOV R6,#0FFH ;1个机器周期个机器周期LOOP2:DJNZ R6,LOOP2 ;2个机器周期个机器周期 DJNZ R5,LOOP1 ;2个机器周期个机器周期 NOP ;1个机器周期个机器周期 RET ;2个机器周期个机器周期-循环结构实例循环结构实例7/15/202432四、四、查表程序查表程序n n查查查查表表表表程程程程序序序序是是是是一一一一种种种种常常常常用用用用的的的的程程程程序序序序,它它它它广广广广泛泛泛泛使使使使用用用用于于于于LEDLED显显显显示示示示器器器器控控控控制制制制、打打打打印印印印以以以以及及及及数数数数据据据据补补补补偿偿偿偿、计计计计算算算算、转转转转换换换换等等等等功功功功能能能能程程程程序序序序中中中中,具具具具有有有有程程程程序序序序简简简简单单单单、执执执执行行行行速速速速度度度度快快快快等等等等优优优优点点点点。查查查查表表表表,就就就就是是是是根根根根据据据据变变变变量量量量x x在在在在表表表表格中查找格中查找格中查找格中查找y y,使,使,使,使y=y=f f(x)(x)。n n例例例例4-7 4-7 试编写程序,将试编写程序,将试编写程序,将试编写程序,将1616进制数进制数进制数进制数(0-F)(0-F)转换成转换成转换成转换成ASCIIASCII码。码。码。码。n n分析:分析:分析:分析:1616进制进制进制进制0909的的的的ASCIIASCII码为码为码为码为3039H3039H,AFAF的的的的ASCIIASCII码为码为码为码为41H46H41H46H,ASCIIASCII码表的首地址为码表的首地址为码表的首地址为码表的首地址为ASCTABASCTAB。n n入口:入口:入口:入口:HEXHEX单元的低四位存放单元的低四位存放单元的低四位存放单元的低四位存放1616进制数。进制数。进制数。进制数。n n出口:转换后的出口:转换后的出口:转换后的出口:转换后的ASCIIASCII码送回码送回码送回码送回HEXHEX单元。单元。单元。单元。-其它应用程序实例其它应用程序实例7/15/202433在这个程序中,查表指令在这个程序中,查表指令MOVC A,A+PC到表格首地址有到表格首地址有两条指令,占用两条指令,占用3个地址空间,故变址调整为加个地址空间,故变址调整为加3。4.2.4 查表程序查表程序 ORG 0200H HEX EQU33HHEXASC:MOV A,HEX ANL A,#0FH ADD A,#03H;变址调整变址调整 MOVC A,A+PC MOV HEX,A RETASCTAB:DB 30H,31H,32H,33H DB 34H,35H,36H,37H DB 38H,39H,41H,42H DB 43H,44H,45H,46H END-其它应用程序实例其它应用程序实例7/15/202434五、子程序五、子程序n n同一个程序中,往往有许多地方都需要执行同样的一同一个程序中,往往有许多地方都需要执行同样的一同一个程序中,往往有许多地方都需要执行同样的一同一个程序中,往往有许多地方都需要执行同样的一项任务,这时可以对这项任务进行独立的编写,形成项任务,这时可以对这项任务进行独立的编写,形成项任务,这时可以对这项任务进行独立的编写,形成项任务,这时可以对这项任务进行独立的编写,形成一个子程序。在原来的主程序中需要执行该任务时,一个子程序。在原来的主程序中需要执行该任务时,一个子程序。在原来的主程序中需要执行该任务时,一个子程序。在原来的主程序中需要执行该任务时,调用该子程序,执行完后又返回主程序,继续以后的调用该子程序,执行完后又返回主程序,继续以后的调用该子程序,执行完后又返回主程序,继续以后的调用该子程序,执行完后又返回主程序,继续以后的操作,这就是所谓的子程序结构。在程序设计过程中,操作,这就是所谓的子程序结构。在程序设计过程中,操作,这就是所谓的子程序结构。在程序设计过程中,操作,这就是所谓的子程序结构。在程序设计过程中,适当地使用子程序具有以下优点:适当地使用子程序具有以下优点:适当地使用子程序具有以下优点:适当地使用子程序具有以下优点:n n1)1)不必重复编写同样的程序,提高了编码的效率。不必重复编写同样的程序,提高了编码的效率。不必重复编写同样的程序,提高了编码的效率。不必重复编写同样的程序,提高了编码的效率。n n2)2)缩短源程序和目标程序的长度,节省程序存储空间。缩短源程序和目标程序的长度,节省程序存储空间。缩短源程序和目标程序的长度,节省程序存储空间。缩短源程序和目标程序的长度,节省程序存储空间。n n3)3)使程序模块化、通用化,便于阅读、交流和共享。使程序模块化、通用化,便于阅读、交流和共享。使程序模块化、通用化,便于阅读、交流和共享。使程序模块化、通用化,便于阅读、交流和共享。n n4)4)便于分块调试。便于分块调试。便于分块调试。便于分块调试。-其它应用程序实例其它应用程序实例7/15/202435n n在子程序调用过程中须解决以下两个方面的问题:在子程序调用过程中须解决以下两个方面的问题:在子程序调用过程中须解决以下两个方面的问题:在子程序调用过程中须解决以下两个方面的问题:n n1)1)保护现场和恢复现场。保护现场和恢复现场。保护现场和恢复现场。保护现场和恢复现场。n n2)2)调用程序与被调用程序之间的参数传递。调用程序与被调用程序之间的参数传递。调用程序与被调用程序之间的参数传递。调用程序与被调用程序之间的参数传递。n n保护现场和恢复现场的方法:保护现场和恢复现场的方法:保护现场和恢复现场的方法:保护现场和恢复现场的方法:n n 在进入子程序时,将需要保护的数据推入堆栈,在进入子程序时,将需要保护的数据推入堆栈,在进入子程序时,将需要保护的数据推入堆栈,在进入子程序时,将需要保护的数据推入堆栈,而空出这些数据所占用的工作单元,供子程序中使而空出这些数据所占用的工作单元,供子程序中使而空出这些数据所占用的工作单元,供子程序中使而空出这些数据所占用的工作单元,供子程序中使用。在返回调用程序之前,再将推入堆栈的数据弹用。在返回调用程序之前,再将推入堆栈的数据弹用。在返回调用程序之前,再将推入堆栈的数据弹用。在返回调用程序之前,再将推入堆栈的数据弹出到原有的工作单元,恢复其原来的状态,使调用出到原有的工作单元,恢复其原来的状态,使调用出到原有的工作单元,恢复其原来的状态,使调用出到原有的工作单元,恢复其原来的状态,使调用程序可以继续往下执行。程序可以继续往下执行。程序可以继续往下执行。程序可以继续往下执行。-其它应用程序实例其它应用程序实例7/15/202436n n参数传递参数传递参数传递参数传递n n子程序调用时,要特别注意主程序与子程序之间的信子程序调用时,要特别注意主程序与子程序之间的信子程序调用时,要特别注意主程序与子程序之间的信子程序调用时,要特别注意主程序与子程序之间的信息交换问题。在调用一个子程序时,主程序应先把有息交换问题。在调用一个子程序时,主程序应先把有息交换问题。在调用一个子程序时,主程序应先把有息交换问题。在调用一个子程序时,主程序应先把有关参数(子程序入口条件)放到某些约定的位置,子关参数(子程序入口条件)放到某些约定的位置,子关参数(子程序入口条件)放到某些约定的位置,子关参数(子程序入口条件)放到某些约定的位置,子程序在运行时,可以从约定的位置得到有关参数。程序在运行时,可以从约定的位置得到有关参数。程序在运行时,可以从约定的位置得到有关参数。程序在运行时,可以从约定的位置得到有关参数。n n同样子程序结束前,也应把处理结果(出口条件)送同样子程序结束前,也应把处理结果(出口条件)送同样子程序结束前,也应把处理结果(出口条件)送同样子程序结束前,也应把处理结果(出口条件)送到约定位置。返回后,主程序便可从这些位置得到需到约定位置。返回后,主程序便可从这些位置得到需到约定位置。返回后,主程序便可从这些位置得到需到约定位置。返回后,主程序便可从这些位置得到需要的结果,这就是参数传递。要的结果,这就是参数传递。要的结果,这就是参数传递。要的结果,这就是参数传递。-其它应用程序实例其它应用程序实例7/15/202437n n参数传递大致可分为以下几种方法:参数传递大致可分为以下几种方法:参数传递大致可分为以下几种方法:参数传递大致可分为以下几种方法:n n1)1)传递数据。将数据通过工作寄存器传递数据。将数据通过工作寄存器传递数据。将数据通过工作寄存器传递数据。将数据通过工作寄存器R0R7R0R7和累加和累加和累加和累加器来传送。即主程序和子程序在交接处,通过上述器来传送。即主程序和子程序在交接处,通过上述器来传送。即主程序和子程序在交接处,通过上述器来传送。即主程序和子程序在交接处,通过上述寄存器和累加器存储同一参数。寄存器和累加器存储同一参数。寄存器和累加器存储同一参数。寄存器和累加器存储同一参数。n n2)2)传送地址。数据存放在数据存储器中,参数传递传送地址。数据存放在数据存储器中,参数传递传送地址。数据存放在数据存储器中,参数传递传送地址。数据存放在数据存储器中,参数传递时只通过时只通过时只通过时只通过R0R0、R1R1或或或或DPTRDPTR传递数据所存放的地址。传递数据所存放的地址。传递数据所存放的地址。传递数据所存放的地址。n n3)3)通过堆栈传递参数。在调用之前,先把要传送的通过堆栈传递参数。在调用之前,先把要传送的通过堆栈传递参数。在调用之前,先把要传送的通过堆栈传递参数。在调用之前,先把要传送的参数压入堆栈,进入子程序之后,再将压入堆栈的参数压入堆栈,进入子程序之后,再将压入堆栈的参数压入堆栈,进入子程序之后,再将压入堆栈的参数压入堆栈,进入子程序之后,再将压入堆栈的参数弹出到工作寄存器或者其他内存单元。参数弹出到工作寄存器或者其他内存单元。参数弹出到工作寄存器或者其他内存单元。参数弹出到工作寄存器或者其他内存单元。-其它应用程序实例其它应用程序实例7/15/202438例例4-8 试编写程序,计算试编写程序,计算 ,其中,其中i=08n n其中:其中:其中:其中:a0a0、a2a2、.、a8a8存放在内部存放在内部存放在内部存放在内部RAMRAM的的的的20H20H开始开始开始开始的存储区域内,计算所得结果存放在的存储区域内,计算所得结果存放在的存储区域内,计算所得结果存放在的存储区域内,计算所得结果存放在R2R2中。中。中。中。n n要求:平方运算编写成子程序要求:平方运算编写成子程序要求:平方运算编写成子程序要求:平方运算编写成子程序SORTSORT,主程序通过,主程序通过,主程序通过,主程序通过调用调用调用调用SORTSORT并求和完成运算。参数的传递用累加器。并求和完成运算。参数的传递用累加器。并求和完成运算。参数的传递用累加器。并求和完成运算。参数的传递用累加器。-子程序应用子程序应用7/15/202439n nMAIN:MOV R0,#20HMAIN:MOV R0,#20H;置数据指针置数据指针置数据指针置数据指针n n MOV R7,#10 MOV R7,#10;置计数初值置计数初值置计数初值置计数初值n n MOV R2,#0 MOV R2,#0 ;结果单元清零结果单元清零结果单元清零结果单元清零 LOOP:MOV A,R0 LOOP:MOV A,R0 ;取数取数取数取数n n ACALL SORT ACALL SORT;调用求平方子程序调用求平方子程序调用求平方子程序调用求平方子程序n n ADD A,R2 ;ADD A,R2 ;累加平方和累加平方和累加平方和累加平方和n n MOV R2,A MOV R2,An n INC R0 INC R0 ;修改指针修改指针修改指针修改指针n n DJNZ R7,LOOP DJNZ R7,LOOP;未完未完未完未完,继续继续继续继续n n SJMP EN SJMP ENn nSORT:MOV DPTR,#TABSORT:MOV DPTR,#TAB;进入子程序查平方表进入子程序查平方表进入子程序查平方表进入子程序查平方表n n MOVC A,A+DPTR MOVC A,A+DPTRn n RET RET;返主程序返主程序返主程序返主程序n nTAB:DBTAB:DB 0,1,4,9,16 0,1,4,9,16n n DB DB 25,36,49,6425,36,49,64n nEN:EN:SJMP$SJMP$-子程序应用子程序应用7/15/2024404.2.1 4.2.1 源程序编辑源程序编辑n n 在微型计算机上,借助编辑软件,编写或修在微型计算机上,借助编辑软件,编写或修在微型计算机上,借助编辑软件,编写或修在微型计算机上,借助编辑软件,编写或修改汇编语言源程序。如行编辑或屏幕编辑软件。改汇编语言源程序。如行编辑或屏幕编辑软件。改汇编语言源程序。如行编辑或屏幕编辑软件。改汇编语言源程序。如行编辑或屏幕编辑软件。4.2 4.2 汇编语言源程序的编辑和汇编汇编语言源程序的编辑和汇编7/15/2024414.2.2 4.2.2 源程序的汇编源程序的汇编n n汇编:将汇编语言源程序转换为机器码表汇编:将汇编语言源程序转换为机器码表示的目标程序的过程。示的目标程序的过程。n n对单片机有:对单片机有:一、手工汇编一、手工汇编 二、机器汇编二、机器汇编 三、反汇编三、反汇编7/15/202442一、手工汇编一、手工汇编n n通过手工方式查指令编码表,逐个把助记符指令通过手工方式查指令编码表,逐个把助记符指令通过手工方式查指令编码表,逐个把助记符指令通过手工方式查指令编码表,逐个把助记符指令“翻译翻译翻译翻译”成机器码,然后把得到的机器码程序键入单成机器码,然后把得到的机器码程序键入单成机器码,然后把得到的机器码程序键入单成机器码,然后把得到的机器码程序键入单片机,进行调试和运行。片机,进行调试和运行。片机,进行调试和运行。片机,进行调试和运行。n n手工汇编的缺点:手工汇编的缺点:手工汇编的缺点:手工汇编的缺点:1 1、偏移量的计算容易出错、偏移量的计算容易出错、偏移量的计算容易出错、偏移量的计算容易出错 2 2、程序的修改会引起后面指令地址的变化,转、程序的修改会引起后面指令地址的变化,转、程序的修改会引起后面指令地址的变化,转、程序的修改会引起后面指令地址的变化,转移指令的偏移量也要重新计算。移指令的偏移量也要重新计算。移指令的偏移量也要重新计算。移指令的偏移量也要重新计算。7/15/202443二、机器汇编二、机器汇编n n 机器汇编是在计算机上使用交叉汇编程序进机器汇编是在计算机上使用交叉汇编程序进机器汇编是在计算机上使用交叉汇编程序进机器汇编是在计算机上使用交叉汇编程序进行源程序的汇编。行源程序的汇编。行源程序的汇编。行源程序的汇编。n n 汇编工作由机器自动完成,最后得到以机器汇编工作由机器自动完成,最后得到以机器汇编工作由机器自动完成,最后得到以机器汇编工作由机器自动完成,最后得到以机器码表示的目标程序。码表示的目标程序。码表示的目标程序。码表示的目标程序。7/15/202444三、反汇编三、反汇编n n将二进制机器语言程序翻译成汇编语言程序的将二进制机器语言程序翻译成汇编语言程序的将二进制机器语言程序翻译成汇编语言程序的将二进制机器语言程序翻译成汇编语言程序的过程称反汇编。过程称反汇编。过程称反汇编。过程称反汇编。n n汇编和反汇编的过程如图所示。汇编和反汇编的过程如图所示。汇编和反汇编的过程如图所示。汇编和反汇编的过程如图所示。源程序源程序(汇编语言)(汇编语言)目标码目标码(机器语言)(机器语言)汇编(汇编程序)汇编(汇编程序)反汇编(汇编程序)反汇编(汇编程序)汇编和反汇编过程汇编和反汇编过程7/15/2024454.2.3 4.2.3 伪指令伪指令n n伪指令不是真正的指令,无对应的机器码,在汇编时伪指令不是真正的指令,无对应的机器码,在汇编时伪指令不是真正的指令,无对应的机器码,在汇编时伪指令不是真正的指令,无对应的机器码,在汇编时不产生目标程序,只是用来对汇编过程进行某种控制。不产生目标程序,只是用来对汇编过程进行某种控制。不产生目标程序,只是用来对汇编过程进行某种控制。不产生目标程序,只是用来对汇编过程进行某种控制。n n89C5189C51有有有有8 8个伪指令:个伪指令:个伪指令:个伪指令:n nORGORGn nENDENDn nEQUEQUn nDATADATAn nDBDBn nDWDWn nDSDSn nBITBIT7/15/202446ORG 汇编起始命令汇编起始命令n n格式:格式:格式:格式:ORG 16ORG 16位地址位地址位地址位地址n n功能:规定该伪指令后面程序的汇编地址,即功能:规定该伪指令后面程序的汇编地址,即功能:规定该伪指令后面程序的汇编地址,即功能:规定该伪指令后面程序的汇编地址,即汇编后生成目标程序存放的起始地址。例如:汇编后生成目标程序存放的起始地址。例如:汇编后生成目标程序存放的起始地址。例如:汇编后生成目标程序存放的起始地址。例如:ORG 2000H ORG 2000HSTARTSTART:MOV AMOV A,#64H#64H n n规定了规定了规定了规定了STARTSTART的地址是的地址是的地址是的地址是2000H2000H,又规定了汇编,又规定了汇编,又规定了汇编,又规定了汇编后的第一条指令码从后的第一条指令码从后的第一条指令码从后的第一条指令码从2000H2000H开始存放。开始存放。开始存放。开始存放。7/15/202447END 汇编结束指令汇编结束指令n n格式:格式:ENDn n功能:通知汇编程序结束汇编。在功能:通知汇编程序结束汇编。在END之之后所有的汇编指令均不予以处理。后所有的汇编指令均不予以处理。7/15/202448EQU 赋值命令赋值命令n n格式:字符名称格式:字符名称格式:字符名称格式:字符名称 EQU EQU 项(数或汇编符号)项(数或汇编符号)项(数或汇编符号)项(数或汇编符号)n n功能:把功能:把功能:把功能:把“项项项项”赋给赋给赋给赋给“字符名称字符名称字符名称字符名称”。n n注意:字符名称不等于标号(其后没有冒号);其中的项,可以注意:字符名称不等于标号(其后没有冒号);其中的项,可以注意:字符名称不等于标号(其后没有冒号);其中的项,可以注意:字符名称不等于标号(其后没有冒号);其中的项,可以是数,也可以是汇编符号。是数,也可以是汇编符号。是数,也可以是汇编符号。是数,也可以是汇编符号。EQUEQU赋值过的符号名可以用作数据、赋值过的符号名可以用作数据、赋值过的符号名可以用作数据、赋值过的符号名可以用作数据、代码地址、位地址或一个立即数。可以是代码地址、位地址或一个立即数。可以是代码地址、位地址或一个立即数。可以是代码地址、位地址或一个立即数。可以是8 8位,也可以是位,也可以是位,也可以是位,也可以是1616位的。位的。位的。位的。例如:例如:例如:例如:AA EQU R1AA EQU R1 MOV A MOV A,AAAA;AAAA代表工作寄存器代表工作寄存器代表工作寄存器代表工作寄存器R1R1例如:例如:例如:例如:HEX EQU 30HHEX EQU 30H DELY EQU 07EBH DELY EQU 07EBH MOV A MOV A,HEX HEX ;HEXHEX作为片内的一个直接地址作为片内的一个直接地址作为片内的一个直接地址作为片内的一个直接地址 LCALL DELY LCALL DELY ;DELYDELY作为一个作为一个作为一个作为一个1616位子程序的入口地址位子程序的入口地址位子程序的入口地址位子程序的入口地址7/15/202449DATA 数据地址赋值命令数据地址赋值命令n n格式:字符名称格式:字符名称格式:字符名称格式:字符名称 DATA DATA 表达式表达式表达式表达式n n功能:与功能:与功能:与功能:与EQUEQU类似,但有以下差别:类似,但有以下差别:类似,但有以下差别:类似,但有以下差别:n n1 1、EQUEQU定义的字符名必须先定义后使用,而定义的字符名必须先定义后使用,而定义的字符名必须先定义后使用,而定义的字符名必须先定义后使用,而DATADATA定义定义定义定义的字符名可以后定义先使用。的字符名可以后定义先使用。的字符名可以后定义先使用。的字符名可以后定义先使用。n n2 2、用、用、用、用EQUEQU伪指令可以把一个汇编符号赋给一个名字,伪指令可以把一个汇编符号赋给一个名字,伪指令可以把一个汇编符号赋给一个名字,伪指令可以把一个汇编符号赋给一个名字,而而而而DATADATA只能把数据赋给字符名。只能把数据赋给字符名。只能把数据赋给字符名。只能把数据赋给字符名。n n3 3、DATADATA语句可以把一个表达式的值赋给字符名称,其语句可以把一个表达式的值赋给字符名称,其语句可以把一个表达式的值赋给字符名称,其语句可以把一个表达式的值赋给字符名称,其中的表达式应是可求值的。中的表达式应是可求值的。中的表达式应是可求值的。中的表达式应是可求值的。n nDATADATA伪指令在程序中用来定义数据地址。伪指令在程序中用来定义数据地址。伪指令在程序中用来定义数据地址。伪指令在程序中用来定义数据地址。7/15/202450DB 定义字节命令定义字节命令n n格式:格式:格式:格式:DBDB(项或项表)(项或项表)(项或项表)(项或项表)n n功能:通知汇编程序从当前功能:通知汇编程序从当前功能:通知汇编程序从当前功能:通知汇编程序从当前ROMROM地址开始,保留一地址开始,保留一地址开始,保留一地址开始,保留一个字或字节串的存储单元,并存入个字或字节串的存储单元,并存入个字或字节串的存储单元,并存入个字或字节串的存储单元,并存入DBDB后的数据。后的数据。后的数据。后的数据。n n注意:项或项表可以是一个字节,用逗号隔开的字注意:项或项表可以是一个字节,用逗号隔开的字注意:项或项表可以是一个字节,用逗号隔开的字注意:项或项表可以是一个字节,用逗号隔开的字节串或括在单引号中的节串或括在单引号中的节串或括在单引号中的节串或括在单引号中的ASCIIASCII字符串。字符串。字符串。字符串。7/15/202451例如:例如:ORG 2000H DB 0A3HLIST:DB 26H,03H STR:DB ABC 经汇编后(经汇编后(2000H)=A3H,(2001H)=26H,(2002H)=03H,(2003H)=41H,(2004H)=42H,(2005H)=43H,(41H,42H,43H分别为分别为A,B,C的的ASCII码)码)7/15/202452DW 定义字命令定义字命令n n格式:格式:格式:格式:DW 16DW 16位数据项或项表位数据项或项表位数据项或项表位数据项或项表n n功能:把功能:把功能:把功能:把DWDW后的后的后的后的1616位数据项或项表从当前地址连续位数据项或项表从当前地址连续位数据项或项表从当前地址连续位数据项或项表从当前地址连续存放。每项数值为存放。每项数值为存放。每项数值为存放。每项数值为1616位二进制数,高位二进制数,高位二进制数,高位二进制数,高8 8位先放,低位先放,低位先放,低位先放,低8 8位后存放。位后存放。位后存放。位后存放。DWDW用于定义一个地址表。用于定义一个地址表。用于定义一个地址表。用于定义一个地址表。7/15/202453例如:例如:ORG 1500HTABLE:DW 7234H,8AH,10H 经汇编后(经汇编后(1500H)=72H,(1501H)=34H,(1502H)=00H,(1503H)=8AH,(1504H)=00H,(1505H)=10H,7/15/202454DS 定义存储空间命令定义存储空间命令n n格式:格式:格式:格式:DS DS 表达式表达式表达式表达式n n功能:在汇编时,从指定地址开始保留功能:在汇编时,从指定地址开始保留功能:在汇编时,从指定地址开始保留功能:在汇编时,从指定地址开始保留DSDS之后表达式的值之后表达式的值之后表达式的值之后表达式的值所规定的存储单元以备后用。所规定的存储单元以备后用。所规定的存储单元以备后用。所规定的存储单元以备后用。n n例如:例如:例如:例如:ORG 1000H ORG 1000H DS 08H DS 08H DB 30H DB 30H,8AH8AH汇编后,从汇编后,从汇编后,从汇编后,从1000H1000H保留保留保留保留8 8个单元,然后从个单元,然后从个单
展开阅读全文