单片机原理与应用-4汇编语言程序设计.ppt
单片机原理与应用单片机原理与应用-4汇编语言程序设计汇编语言程序设计简介4-1汇编语言概述汇编语言概述汇编语言程序设计汇编语言程序设计4-2顺序程序设计顺序程序设计4-3分支程序设计分支程序设计4-4循环程序设计循环程序设计4-5子程序设计子程序设计4-6汇编语言程序设计实例汇编语言程序设计实例4.1 汇编语言概述1程序设计语言2汇编语言源程序格式3汇编语言伪指令4目标程序的生成一、程序设计语言程序设计语言种类繁多,且还在不断的产生和发展,但总体可以分为以下三类:1.机器语言2.汇编语言3.高级语言机器语言 能直接或经人工(或监控程序)翻译后为机器识别或执行。1.机器语言的两种形式 二进制形式能为机器直接识别和执行 十六进制形式可为监控程序翻译成二进制形式2.机器语言的特点 1)能为机器直接识别和执行 2)有难读、难写、难查错和难交流等四难。汇编语言(Assembly language)汇编语句的集合,是一种面向机器的程序设计语言,因机器而异。1.汇编语句的分类 指示性语句又称伪指令,汇编时不产生机器码,但可为汇编程序识别和执行,以对汇编过程进行控制。指令性语句指令系统中指令的全体汇编语言的特点2.汇编语言的特点:1)符号语言用于编程2)所编程序汇编成机器语言才能为CPU执行3)可直接操作到机器内部的寄存器和RAM单元占用存储空间小,运行速度快。4)汇编语言是面向计算机的,程序设计人员必须对计算机硬件有相当的了解。5)能直接管理和控制硬件设备。6)缺乏通用性,不易移植,编写较困难。高级语言(High-Level Language)是一种面向过程和问题的程序语言,常不因机器而异。例如,Basic,C,C+,Java等特点:1)面向对象和问题的,接近于自然语言和数学表达式。2)独立于机器3)一条语句对应一段汇编语言程序4)经解释(或编译)成机器语言后才能为CPU执行。汇编语言与高级语言的比较:(1)在功能相同条件下,汇编语言源程序生成的目标程序比高级语言源程序生成的目标程序占用存储单元少、执行速度快,一般有速度要求场所尽可能采用汇编语言编写源程序;(2)由于汇编语言的“面向机器”性,能更合理地使用计算机硬件资源,所以在检测、控制、数据采集、通讯等场合比高级语言编程更方便、简捷。二、汇编语言源程序的格式1.名词解释:汇编程序是一种由制造厂家或软件公司提供的实用程序,能把汇编语言源程序翻译成机器语言,供CPU执行。汇编语言源程序设计者编写的程序二、汇编语言源程序格式二、汇编语言源程序格式二、汇编语言源程序格式二、汇编语言源程序格式 汇汇编编语语言言源源程程序序由由源源语语句句组组成成,其其语语句句结结构构四四要要素素按按书写次序依次为:书写次序依次为:1、标号;、标号;2、操作码;、操作码;3、操作数;、操作数;4、注释。、注释。即:即:标号标号:操作码操作码操作数操作数;注释注释如:如:START:MOVR1,30H;(;(30H)R1标号:标号:标号:标号:也叫标号地址或符号地址,位于一条语句的开头也叫标号地址或符号地址,位于一条语句的开头,可以任选或省略。,可以任选或省略。标号由标号由18个英文字母和数字组成,开头必须是个英文字母和数字组成,开头必须是英文字母。当标号的长度超过英文字母。当标号的长度超过8个字符时,汇编程序会个字符时,汇编程序会自动舍去超出的部分。各指令助记符、寄存器名以及伪自动舍去超出的部分。各指令助记符、寄存器名以及伪指令符等保留符号不能用作标号,同一标号也不能在同指令符等保留符号不能用作标号,同一标号也不能在同一程序的不同语句中使用。一程序的不同语句中使用。操作码:操作码:操作码:操作码:用于指示计算机进行何种操作。它可以是指令用于指示计算机进行何种操作。它可以是指令的助记符,如的助记符,如ADD、MOV等;也可以是等;也可以是伪指令语句伪指令语句 中中的定义符,规定这个语句的伪操作功能,如的定义符,规定这个语句的伪操作功能,如END、DB等。等。操作数:操作数:操作数:操作数:一般为立即数、寄存器、直接地址和寄存器间接地一般为立即数、寄存器、直接地址和寄存器间接地址等,具有多种表示形式。址等,具有多种表示形式。对于立即数来说,对于立即数来说,可以是二进制可以是二进制数,加后缀数,加后缀“B”;可以是十进制数,加后缀;可以是十进制数,加后缀“D”或不加后或不加后缀;也可以是十六进制数。缀;也可以是十六进制数。对于直接地址来说,对于直接地址来说,可以是二进可以是二进制数、十进制数或十六进制数,可以是特殊功能寄存器名,制数、十进制数或十六进制数,可以是特殊功能寄存器名,也可以是定义过的标号地址或带加减算符的表达式。例如,也可以是定义过的标号地址或带加减算符的表达式。例如,若若MAX已在某处定义过,则已在某处定义过,则MAX、MAX+2、MAX1等作等作为直接地址来用都是合法的为直接地址来用都是合法的。注释:注释:注释:注释:用于对指令或程序的含义进行注解,一行不够写而需用于对指令或程序的含义进行注解,一行不够写而需另起一行时也要以分号开头。另起一行时也要以分号开头。MCS 51汇编语言的伪指令汇编语言程序变成单片机能执行的机器语言的过程称为汇编,可以手工汇编,也可以由计算机汇编。机器汇编时,在源程序中应向编译软件发出如何完成汇编的指示信息。这些指示信息就是伪指令伪指令。伪指令具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储器空间等功能。不同编译软件的伪指令有所不同。伪指令没有对应的机器码三、汇编语言伪指三、汇编语言伪指三、汇编语言伪指三、汇编语言伪指令令令令伪指令的定义:伪指令的定义:用用汇汇编编语语言言编编写写的的源源程程序序要要通通过过汇汇编编程程序序翻翻译译成成机机器器语语言言表表示示的的目目标标代代码码才才能能被被计计算算机机直直接接识识别别和和执执行行。汇汇编编程程序序对对源源程程序序进进行行汇汇编编时时,还还需需要要一一些些指指令令能能够够对对机机器器的的汇汇编编过过程程进进行行某某种种控控制制,令令其其进进行行一一些些特特殊殊操操作作。例例如如要要指指定定程程序序或或数数据据存存放放的的起起始始地地址址,给给一一些些连连续续存存放放的的数数确定单元以及指示汇编结束等等。这些指令就是伪指令。确定单元以及指示汇编结束等等。这些指令就是伪指令。伪伪指指令令只只是是汇汇编编工工具具的的一一些些约约定定,是是不不能能执执行行的的指指令令,因因而而汇汇编编时时不不会会产产生生可可执执行行的的目目标标代代码码,不不会会影影响响程程序序的的执执行行以以及及代代码码和和数数据据的的分分布。布。汇编语言的构成MCS-51的源程序由指示性语句(伪指令)和指令性语句组成。(1)指令性语句(111条)基本语句,程序设计的主体。特点:指令码 助记符(2)指示性语句(8条)供汇编语言程序识别和执行,对汇编过程进行某种控制。特点:助记符 指令码指令码如下:1.ORG/END伪指令 2.EQU/DATA伪指令 3.DB/DW/DS伪指令 4.BIT伪指令对应对应无对应无对应MCS-51MCS-51常用的伪指令介绍常用的伪指令介绍常用的伪指令介绍常用的伪指令介绍(1 1)ORG ORG(OriginOrigin)定义起始地址伪指令)定义起始地址伪指令格式:格式:标号:标号:ORG 16ORG 16位地址位地址 其中其中方括号方括号中的标号是任选项,可以省略。中的标号是任选项,可以省略。汇汇编编语语言言源源程程序序中中允允许许多多次次使使用用ORGORG伪伪指指令令,但但所所规规定定的的各各程程序序段段存存放放地址不能有重叠。地址不能有重叠。例:例:ORG 1000H START:MOV R1,#01H ADD A,R1 机机器器汇汇编编时时就就把把ORGORG下下面面的的这这段段源源程程序序连连续续存存放放在在以以1000H1000H开开始始的的存存储储单单元内。元内。(2)EQU(Equate)等值伪指令)等值伪指令 格式:格式:字符名称字符名称 EQU 数据或汇编符号数据或汇编符号 该指令通常放在汇编语言源程序的开头,用于给字符名称赋一个特定值,该指令通常放在汇编语言源程序的开头,用于给字符名称赋一个特定值,赋值后,其值在整个程序中都有效。赋值后,其值在整个程序中都有效。在一个源程序中,任何一个标号只能赋值一次。在一个源程序中,任何一个标号只能赋值一次。赋值后的字符名称既可以作地址使用也可以作为立即数使用。赋值后的字符名称既可以作地址使用也可以作为立即数使用。例:例:AA EQU R1 赋值后,赋值后,AA即可代替寄存器即可代替寄存器R1来使用。来使用。例:例:BB EQU 35H TEST EQU 1500HLOOP EQU TEST MOV A,BBLCALL LOOP其中,其中,BB赋值以后被当作直接地址使用,赋值以后被当作直接地址使用,TEST被赋值为被赋值为1500H以后,以后,LOOP也为也为1500H。(3)DATA数据地址赋值伪指令数据地址赋值伪指令格式:格式:字符名称字符名称DATA表达式表达式 该伪指令和该伪指令和EQU类似,用于把右边的表达式赋值给指定的字符名称。类似,用于把右边的表达式赋值给指定的字符名称。DATA伪指令和伪指令和EQU伪指令的区别在于:伪指令的区别在于:DATA伪指令中的表达式除了可以是一个数据或地址以外,还可以是伪指令中的表达式除了可以是一个数据或地址以外,还可以是一个一个包含定义的字符名称在内的表达式包含定义的字符名称在内的表达式,而用,而用EQU定义的字符不能这样定义的字符不能这样使用;使用;EQU可以把汇编符号赋值给字符名,而可以把汇编符号赋值给字符名,而DATA只能把数据赋给字符只能把数据赋给字符名,例如指令名,例如指令AADATAR1就是不合法的;就是不合法的;另外,另外,EQU定义的字符名称必须先定义后使用,而定义的字符名称必须先定义后使用,而DATA没有这种没有这种限制。限制。(4)DB(Define Byte)定义字节伪指令)定义字节伪指令 格式:格式:标号:标号:DB 项或项表项或项表 该伪指令用于从指定的地址单元开始,在该伪指令用于从指定的地址单元开始,在程序存储器中程序存储器中定义一个或若定义一个或若干个字节数据。干个字节数据。其中定义的字节数据可以是二进制数、十进制数、十六进制数,其中定义的字节数据可以是二进制数、十进制数、十六进制数,也可也可以是用引号引起来的以是用引号引起来的ASCII码字符码字符。多个字节数据之间用逗号多个字节数据之间用逗号“,”分隔。分隔。例:例:ORG 2000H TAB1:DB 00101101B,91,02H,AB TAB2:DB 2,8伪指令伪指令ORG指定了标号指定了标号TAB1的地址为的地址为2000H,汇编程序将把以上指令中指定的,汇编程序将把以上指令中指定的内容依次存入从内容依次存入从2000H开始的连续单元中。即汇编后,各单元内容为开始的连续单元中。即汇编后,各单元内容为:(2000H)2DH、(2001H)5BH、(2002H)02H、(2003H)41H、(2004H)42H、(2005H)FEH、(2006H)38H(5)DW(Define Word)定义字伪指令)定义字伪指令格式:格式:标号:标号:DW 1至至8项的项的16位数据位数据 该伪指令功能与该伪指令功能与DB类似,只是在程序存储器中定义的是字类似,只是在程序存储器中定义的是字(16位二进制数),以字为单位先高字节、后低字节依次存入位二进制数),以字为单位先高字节、后低字节依次存入存储单元中。存储单元中。多项数据必须以逗号分开。多项数据必须以逗号分开。例:例:ORG 2000H TAB:DW 2030H,0A3H 汇编后各单元内容依次为汇编后各单元内容依次为:(2000H)20H、(2001H)30H、(2002H)00H、(2003H)A3H(6)DS(Define Storage)定义空间伪指令)定义空间伪指令 格式:格式:标号:标号:DS 表达式表达式 该该伪伪指指令令用用于于从从指指定定地地址址单单元元开开始始,保保留留一一定定数数量量的的内内存存空空间间作作备备用用。汇汇编编时时汇汇编编程程序序根根据据表表达达式式的的值值预预留留相相应应数数量量的的存存储储单单元元而而不不对对这这些些单元赋值。单元赋值。DB、DW和和DS伪指令都只是针对程序存储器而言,不能对数据存储器进伪指令都只是针对程序存储器而言,不能对数据存储器进行相关操作。行相关操作。例:例:ORG 8100H BUFFER DS 10H DW ABDW 100H,1ACH8100H-810FH为缓冲区空间为缓冲区空间;(8110H)=41H;(8111H)=42H;从从(8112H)起存放起存放01H、00H、01H、ACH(7)BIT 位地址赋值伪指令位地址赋值伪指令格式:格式:字符名称字符名称 BIT 位地址位地址 该伪指令用于把位地址赋值给指定的字符名称。该伪指令用于把位地址赋值给指定的字符名称。位地址可以是绝对地址,也可以是符号地址。位地址可以是绝对地址,也可以是符号地址。例:例:A1 BIT ACC.0 A2 BIT 00H前者把前者把ACC.0的位地址赋给的位地址赋给A1,后者把位地址,后者把位地址00H赋给赋给A2,这样定义过的,这样定义过的A1和和A2就可以作为位地址来使用了。就可以作为位地址来使用了。(8)END汇编结束伪指令汇编结束伪指令格式:格式:主程序模块主程序模块标号:标号:END表达式表达式子程序模块子程序模块标号:标号:END 该伪指令是汇编语言源程序的结束标志,用于指示结束汇编。一该伪指令是汇编语言源程序的结束标志,用于指示结束汇编。一个源程序只能有一个个源程序只能有一个END语句,而且必须放在整个程序的末尾。语句,而且必须放在整个程序的末尾。只有只有主程序模块才具有主程序模块才具有表达式表达式,且表达式的值等于该程序模块的,且表达式的值等于该程序模块的入口地址。子程序模块没有该项入口地址。子程序模块没有该项四、目标程序的生成四、目标程序的生成四、目标程序的生成四、目标程序的生成 1、手工汇编:、手工汇编:对对照照汇汇编编语语言言指指令令表表,将将汇汇编编语语言言源源程程序序正正确确翻翻译译成成机机器器语语言言目目标标程程序序,注意多字节指令中的机器码次序。注意多字节指令中的机器码次序。手工汇编需要两次扫描:手工汇编需要两次扫描:(1)第一次扫描:确定每条指令的指令码)第一次扫描:确定每条指令的指令码(2)第第二二次次扫扫描描:确确定定指指令令码码中中的的标标号号值和地址偏移量。值和地址偏移量。2、机器汇编:、机器汇编:借借助助于于PC机机及及汇汇编编程程序序等等工工具具将将汇汇编编语语言源程序翻译成机器语言目标程序。言源程序翻译成机器语言目标程序。通通常常汇汇编编语语言言源源程程序序的的文文件件扩扩展展名名为为“.ASM”,汇汇编编后后生生成成扩扩展展名名为为“.HEX”的的十十六六进进制制机机器器码码文文件件和和扩扩展展名名为为“.LST”的的列表文件等。列表文件等。汇编过程示意图汇编过程示意图 汇编语言程序设计的特点数据的存放、寄存器和工作单元的使用等要由设计者安排。要求设计人员对所使用计算机的硬件结构有较详细的了解,特别是对各类寄存器、端口、定时器/计数器、中断等内容能熟练掌握,以便在程序设计中使用。程序设计的技巧性较高,需要软件与硬件的结合。汇编语言程序设计汇编语言程序设计一、汇编语言程序设计步骤一、汇编语言程序设计步骤二、程序流程图二、程序流程图三、结构程序设计基本模块三、结构程序设计基本模块四、子程序四、子程序一、汇编语言程序设计步骤一、汇编语言程序设计步骤一、汇编语言程序设计步骤一、汇编语言程序设计步骤1、分析问题、分析问题2、确定算法和解决思路、确定算法和解决思路3、绘制程序流程图、绘制程序流程图,分配内存工作单元,分配内存工作单元4、编写汇编语言源程序、编写汇编语言源程序5、程序调试与优化、程序调试与优化二、程序流程图二、程序流程图二、程序流程图二、程序流程图流程图的作用:流程图的作用:流流程程图图是是对对程程序序执执行行过过程程的的图图解解表表示示法法,它它往往往往比比文文字字描描述述更更为为直直观观和和有有效效。其其最最大大特特点点为为各各个个功功能能部部分分以以时时间间为为线线索索有有机机地地联联系系起起来来。从从时时间间顺顺序序上上看看整整个个过过程程条条理理井井然然,所所以以不不仅仅在在程程序序设设计计中中使使用用,还还广广泛泛地地使使用用在在非非计计算算机机操作的其他场合。操作的其他场合。处处理理框框图图:表表示示数数据据处处理理、数数据据传传送送、输输入入/输输出出、某某种种功能等(矩形框)功能等(矩形框)逻逻辑辑判判断断框框图图:有有两两个个走走向向,根根据据条条件件判判断断决决定定程程序序的的去向(棱形)去向(棱形)子子程程序序框框图图:表表示示调调用用子子程程序序(处处理理框框图图中中的的两两端端加加两两竖)竖)起始与终止框图:起始与终止框图:表示程序的开始或结束(鼓形)表示程序的开始或结束(鼓形)连连接接点点框框图图:表表示示程程序序的的连连接接点点,常常用用于于不不同同页页码码中中程程序的连接(小圆)序的连接(小圆)连接箭头符:连接箭头符:表示程序的连接与走向(带箭头线条)表示程序的连接与走向(带箭头线条)常用的流程图的符号:常用的流程图的符号:常用的流程图的符号:常用的流程图的符号:处理框图处理框图起始与终止框起始与终止框逻辑判断框图逻辑判断框图连接点框图连接点框图子程序框图子程序框图连接箭头符连接箭头符n三、结构程序设计基本模块三、结构程序设计基本模块三、结构程序设计基本模块三、结构程序设计基本模块程程序序的的基基本本结结构构是是顺顺序序结结构构、选选择择结结构构和和循循环环结结构构,各种功能复杂的程序都是由这三种基本结构组合而成的。各种功能复杂的程序都是由这三种基本结构组合而成的。1、顺序结构顺序结构模块:模块:即即一一种种线线性性结结构构的的模模块块,模模块块中中的的指指令令语语句句或或指指令令集集将被顺序执行。将被顺序执行。2、选择结构选择结构模块:模块:选选择择结结构构又又称称分分支支程程序序,实实际际应应用用程程序序中中常常需需作作出出各各种种逻逻辑辑判判断断,根根据据判判断断进进行行选选择择和和处处理理,因因而而在在执执行行时时产产生了分支。生了分支。3、循环结构循环结构模块:模块:程程序序中中,在在某某种种条条件件下下往往往往要要求求某某一一段段程程序序重重复复执执行行多次,这时候可以采用循环结构。多次,这时候可以采用循环结构。图例图例图例图例图例图例顺序结构是按照逻辑操作顺序,从某一条指令开始逐条顺序执顺序结构是按照逻辑操作顺序,从某一条指令开始逐条顺序执行,直至某一条指令为止。行,直至某一条指令为止。教材教材P6971:初始化、算术运算和逻辑运算:初始化、算术运算和逻辑运算例例2.数据传送和交换。数据传送和交换。将将R0与与R7内容互换,内容互换,R4与内存与内存20H单元内容互换。单元内容互换。XCHR:MOVA,R0 XCH A,R7 XCHA,R0 ;R0与与R7内容互换内容互换 MOVA,R4 XCHA,20H XCHA,R4 ;R4与与20H单元内容互换单元内容互换 4-2顺序结构程序设计顺序结构程序设计例例3.不带符号多字节加法不带符号多字节加法。(实验)设被加数存放于片内设被加数存放于片内RAM的的20H(低位字节)、(低位字节)、21H(高位字节),(高位字节),加数存放于加数存放于22H(低位字节)和(低位字节)和23H(高位字节),运算结果的和数存放于(高位字节),运算结果的和数存放于20H(低位字节)和(低位字节)和21H(高位字节)中。实现(高位字节)中。实现16位相加。其程序段如下:位相加。其程序段如下:START:PUSH ACC;将;将A中内容进栈保护中内容进栈保护MOV R0,20H ;将;将20H地址送地址送R0 MOV R1,22H ;将;将22H地址值送地址值送R1 MOV A,R0 ;被加数低字节内容送;被加数低字节内容送A ADD A,R1 ;低字节数相加;低字节数相加 MOV R0,A ;低字节数和存;低字节数和存20H中中INC R0 ;指向被加数高位字节;指向被加数高位字节 INC R1 ;指向加数高位字节;指向加数高位字节 MOV A,R0 ;被加数高位字节送;被加数高位字节送A ADDC A,R1 ;高字节数带进位相加;高字节数带进位相加MOV R0,A;高字节数和存;高字节数和存21H中中CLRAADDCA,#00HMOV 10H,A;进位暂存于;进位暂存于10H中中 POP ACC ;恢复;恢复A原内容原内容 这这里里将将A原原内内容容进进栈栈保保护护,如如果果原原R0、R1 内内容容有有用用,亦亦需需进进栈栈保保护护。如如果果相相加加结结果果高高字字节节的的最最高高位位产产生生进进位位且且有有意意义义时时,应对标志应对标志CY位检测并处理之。位检测并处理之。注意:注意:对于对带符号数的减法运算,只要先将减数的符号对于对带符号数的减法运算,只要先将减数的符号位取反,即可把减法运算按加法运算的原则来处理。位取反,即可把减法运算按加法运算的原则来处理。例例5.双字节乘法双字节乘法。多多字字节节乘乘法法的的基基础础是是加加法法。分分别别相相乘乘后后对对应应字字节节相相加加(个个位位、十十位位、百百位位等等分分别别相相加加,并并考考虑虑低低字字节节向向高高字字节节的的进进位位)。选选用用工工作作寄寄存存器器暂存中间积。暂存中间积。分分析析:设设被被乘乘数数低低字字节节(addrl)用用A表表示示,高高字字节节(addr2)用用B表示;乘数低字节(表示;乘数低字节(addr3)用)用L表示,高字节(表示,高字节(addr4)用)用M表示。表示。双字节相乘的过程如下:双字节相乘的过程如下:双字节相乘的过程如下:双字节相乘的过程如下:编出能把20H单元内两个BCD数变换成相应ASCII码放在21H(高位BCD数的ASCII码)和22H(低位BCD数的ASCII码)单元的程序。解:因为ASCII码字符表09的BCD数和其ASCII码之间仅相差30H,所以本例只需要把20H单元中的两个BCD数拆开,分别和30H相加就好了。程序查表程序设计线性表可以有不同的存储结构,而最简单最常用的是用一线性表可以有不同的存储结构,而最简单最常用的是用一组连续的存储单元顺序存储线性表的各个元素,这种方法称为线组连续的存储单元顺序存储线性表的各个元素,这种方法称为线性表的顺序分配。性表的顺序分配。查查表表就就是是根根据据变变量量x,在在表表格格中中查查找找对对应应的的y值值,使使yf(x)。)。y与与x的对应关系可有各种形式,而表格也可有各种结构。的对应关系可有各种形式,而表格也可有各种结构。一一般般表表格格常常量量设设置置在在程程序序存存储储器器的的某某一一区区域域内内。在在80C51指指令令集集中,设有两条查表指令:中,设有两条查表指令:MOVC A,ADPTR;远程查表指令;远程查表指令MOVC A,A+PC;近程查表指令;近程查表指令设设有有一一个个巡巡回回检检测测报报警警装装置置,需需对对16路路输输入入进进行行控控制制,每每路路设设有有一一个个最最大大额额定定值值,为为双双字字节节数数。控控制制时时需需根根据据检检测测的的路路号号找找出出该该路路对对应应的的最最大大额额定定值值。设设R2用用于于寄寄存存检检测测路路号号,查查找找到到的的对对应应的的最最大大额额定定值值存存放放于于31H和和32H单单元元中中。查查找找最最大大允允许许额额定定值值子子程程序如下:序如下:(先不讲)(先不讲)源程序源程序注释注释ORG 0000HMOV A,R2;检测路号送;检测路号送AADDA,R2;(;(R2)2MOV 31H,A ;距表首址偏移量;距表首址偏移量ADD A,#08H;偏移量;偏移量MOVC A,A+PC;查表,读取第一个字节内容;查表,读取第一个字节内容 (1字节字节)XCH A,31H;第一字节存入;第一字节存入31H单元单元 (1字节字节)ADD A,#04H;偏移量;偏移量 (2字节字节)MOVC A,A+PC;查表,读取第二字节;查表,读取第二字节 (1字节字节)MOV 32H,A;第二字节存入;第二字节存入32H单元单元 (2字节字节)RET (1字节字节)DW 1230H,1540H;最大额定值表:路号;最大额定值表:路号.;0,路号,路号1DW 2340H,2430H.;路号;路号2,路号,路号3 END 已知R0低4位有一个16进制数(0-F中一个),请编出能把它转换成相应ASCII码并送入R0的程序。方法一:采用DPTR方法二(用PC作基址)选择结结构构程程序序的的主主要要特特点点是是程程序序执执行行流流程程中中必必然然包包含含有有条条件判断。符合条件要求和不符合条件要求的有不同的处理路径。件判断。符合条件要求和不符合条件要求的有不同的处理路径。单分支结构单分支结构当当程程序序仅仅有有两两个个出出口口,两两者者选选一一,称称为为单单分分支支结结构构。通通常常用用条条件件判判跳跳指指令令来来选选择择并并转转移移。在在80C51指指令令系系统统中中,可可实实现现单单分分支支程程序序转转移移的的指指令令有有位位条条件件转转移移指指令令,如如:JC、JNC、JB、JNB和和JBC等等,还还有有一一些些条条件件转转移移指指令令,如如:JZ、JNZ、DJNZ等。等。这类单分支结构程序有三种典型的形式(见图这类单分支结构程序有三种典型的形式(见图42):):4-3选择结构程序设计选择结构程序设计 在在图图42(a)中中,当当条条件件满满足足时时执执行行分分支支程程序序1,否否则则执执行分支程序行分支程序2。在在图图42(b)中中,当当条条件件满满足足时时跳跳过过程程序序段段1,从从程程序序段段2开始继续顺序执行;否则,顺序执行程序段开始继续顺序执行;否则,顺序执行程序段1和程序段和程序段2。在图在图42(c)中,当条件满足时程序顺序执行程序段)中,当条件满足时程序顺序执行程序段2;否则,重复执行程序段否则,重复执行程序段1,直到条件满足为止。以程序段,直到条件满足为止。以程序段1重复执重复执行的次数或某个参数作为判跳条件,当重复次数或参数值达到条行的次数或某个参数作为判跳条件,当重复次数或参数值达到条件满足时,停止重复,程序顺序往下执行。这是分支结构的一种件满足时,停止重复,程序顺序往下执行。这是分支结构的一种特殊情况,这实际是循环结构程序。特殊情况,这实际是循环结构程序。当当条条件件不不满满足足,不不是是转转向向程程序序段段1 1的的起起始始地地址址,重重复复执执行行程程序序段段1 1,而而是是转转向向判判跳跳指指令令本本身身。这这种种方方式式常常用用于于状状态态检检测测。例如:例如:LOOPLOOP:JB Pl.1JB Pl.1,LOOPLOOP;当当P1.1P1.1引引脚脚电电平平为为“1 1”时,等待。时,等待。由于条件判跳指令均属相对寻址方式,其相对偏移量由于条件判跳指令均属相对寻址方式,其相对偏移量relrel是是个带符号的个带符号的8 8位二进制数,常以补码形式出现,可正可负,其寻址位二进制数,常以补码形式出现,可正可负,其寻址范围为范围为127127128128个字节单元之间,因此,它可向高地址方向个字节单元之间,因此,它可向高地址方向转移,也可向低地址方向转移。应用时应特别注意。这对实时系转移,也可向低地址方向转移。应用时应特别注意。这对实时系统的应用带来很大方便。统的应用带来很大方便。若变量若变量 x 存放于存放于VAR单元,试编程按下式给单元,试编程按下式给 y 赋值,将结果存入赋值,将结果存入FUNC单元。单元。解:解:编编程如下:程如下:ORG 0000H LJMP START ORG 0030H VAR DATA 30H FUNC DATA 31H START:MOV A,VAR ;取出;取出 x JZ DONE ;若;若x0,则转则转向向DONE JNB ACC.7,POS ;若;若x0,则转则转POS NEG:MOV A,#0FFH ;若;若x0,则则将将1送送A SJMP DONE POS:MOV A,#1 ;x0,将,将1送送A DONE:MOV FUNC,A ;存;存 y 值值 SJMP$END1 x00 x01 x0yN=128的分支程序。已知R3的值为00H-7FH中的一个,请编出根据R3中值转到相应分支程序去的程序。(先不讲)解:先在外部ROM存储器内安排一张始址为BRTAB的低8位地址为00H,表中连续存放128条2字节绝对转移指令的指令码,其中操作码字节在偶地址单元,且地址偏移量正好是 R3中相应值的两倍。程序AJMP addr112字节指令例例10、试编写计算下式的程序、试编写计算下式的程序Y=a2b (当当b10时时)Y=a2b (当当b10)转)转MMMOV R3,A;R3bMOV A,R0CLR CSUBB A,R3;R1R0a2bMOV R0,AMOV A,R1SUBB A,#00HMOV R1,AMMNN:MOV Y0,R0;Y1Y0结果结果MOV Y1,R1HERE:AJMP HERE4-4循环循环结构程序设计结构程序设计特点:程序中含有重复执行的程序段例如:求100个数的累加和可以用一条加法指令,并使之循环执行100次来完成。循环程序的好处缩短所编程序的长度,把需要重复的程序段放在循环体内。减少程序所占内存单元个数改善缩编程序可读性,提高程序设计时效循环程序的构成循环程序的组成1)循环初始化 确立循环变量初值(例如:源指针和目的指针初值)。确立循环计数器初值,决定循环次数。2)循环体可以重复执行的程序段 循环处理完成循环变量的处理和修改 循环控制判断循环计数器是否需要结束循环3)循环结束处理 处理循环程序的结果循环程序的类型循环程序有以下两种类型例例16.把内部把内部RAM中起始地址为中起始地址为DATA的数据串传送到外部的数据串传送到外部RAM以以BUFFER为首地址的区域,直到发现为首地址的区域,直到发现“$”字符的字符的ASCII码为止,码为止,数据串的最大长度在内存数据串的最大长度在内存20H中。中。MOV R0,#DATA;数据区首地址;数据区首地址MOV DPTR,#BUFFER;数据区长度指针;数据区长度指针LOOP:MOV A,R0CJNE A,#24H,LOOP2;判判 是是 否否 为为“$”符符(24H)SJMP LOOP1;是;是“$”符,则结束符,则结束LOOP2:MOV A,R0;不是;不是“$”符,则传送符,则传送MOVX DPTR,AINC R0 INC DPTR DJNZ 20H,LOOP;数据串未查完,继续;数据串未查完,继续LOOP1:RETDATA:;数据串;数据串注:本题中循环控制条件有二个,一个是条件循环控制,以找到注:本题中循环控制条件有二个,一个是条件循环控制,以找到ASCII码码“$”符为循环结束条件,这是主要的结构;笫二个是计符为循环结束条件,这是主要的结构;笫二个是计数循环结构,万一找不到数循环结构,万一找不到ASCII码码“$”符,则由数据串的最大长符,则由数据串的最大长度作为计数循环控制。度作为计数循环控制。已知数据块长度L,编程求累加和已知块长L,编程求其最大值,并送MAX4-5子程序子程序1、什么是子程序?什么是子程序?编编写写汇汇编编语语言言源源程程序序时时,把把经经常常用用到到的的一一些些程程序序段段落落编编写写成成一一个个相相对对独独立立的的程程序序,用用到到时时可可以以随随意意调调用用并并能能自动返回。自动返回。被调用的程序称作被调用的程序称作子程序子程序;调用子程序的程序称作调用子程序的程序称作主程序主程序。子子程程序序的的调调用用是是汇汇编编语语言言程程序序设设计计中中的的一一种种很很重重要要的的手手段段,微微处处理理机机指指令令系系统统中中往往往往都都设设置置有有专专门门用用于于子子程程序序调用调用 和和返回返回 的指令。的指令。调用子程序的过程也像程序转移一样是通过修改程序计数调用子程序的过程也像程序转移一样是通过修改程序计数器器PC中的数值来实现的。中的数值来实现的。它与一般程序转移过程的区别在于:它与一般程序转移过程的区别在于:子子程程序序调调用用时时,先先将将程程序序计计数数器器PC的的值值压压入入堆堆栈栈中中保保护护起起来来。返返回回时时,以以RET指指令令结结束束,再再将将主主程程序序调调用用时时PC值值从从堆堆栈栈弹弹回回,从从而而使使程程序序能能够够返返回回至至主主程程序序的的调调用用处。处。这这种种设设计计的的实实现现完完全全依依赖赖于于堆堆栈栈的的先先进进后后出出特特性性,必必须须使使返返回回主主程程序序时时的的堆堆栈栈指指针针SP值值与与调调用用之之时时相相等等,否否则则将将无法保证程序的正确返回。无法保证程序的正确返回。2、子程序的操作过程、子程序的操作过程 子子程程序序的的第第1条条语语句句必必须须要要有有标标号号,以以便便作作为为调调用用指指令令的的调调用用名名称;称;子程序必须以子程序必须以RET指令结束,以便能够正确返回主程序;指令结束,以便能够正确返回主程序;子程序应有操作功能说明,以便调用时参考;子程序应有操作功能说明,以便调用时参考;子程序应该注明子程序应该注明入口条件入口条件,便于调用时设法给予满足;,便于调用时设法给予满足;子程序应该标注子程序应该标注出口条件出口条件,便于主程序的很好衔接。,便于主程序的很好衔接。3、子程序的编写要点、子程序的编写要点4、子程序调用的现场保护、子程序调用的现场保护为为了了防防止止子子程程序序中中所所使使用用的的寄寄存存器器的的内内容容被被修修改改后后对对主主程程序序的的错错误误影影响响,必必须须对对主主程程序序中中所所用用到到的的、而而在在子子程程序序中中也也必必须须使使用用的的寄寄存器存器在调用子程序之时,对其内容进行保护。在调用子程序之时,对其内容进行保护。MCS-51常用的数据保护方法通常有以下三种:常用的数据保护方法通常有以下三种:利利用用四四组组工工作作寄寄存存器器互互换换的的方方法法,使使主主程程序序与与子子程程序序使使用用不不同同组组别工作寄存器,从而可以保护工作寄存器别工作寄存器,从而可以保护工作寄存器R0R7中的数据不受破坏;中的数据不受破坏;利利用用堆堆栈栈的的先先进进后后出出特特性性,将将主主程程序序与与子子程程序序中中均均需需使使用用的的寄寄存存器器中中内内容容在在进进入入子子程程序序时时依依次次压压入入堆堆栈栈保保护护起起来来,返返回回主主程程序序前前再再依次弹出恢复;依次弹出恢复;将将主主程程序序与与子子程程序序均均需需使使用用的的寄寄存存器器中中内内容容在在刚刚进进入入子子程程序序时时暂暂用其它用其它空闲寄存器寄存空闲寄存器寄存,返回主程序前取回。,返回主程序前取回。被被调调用用的的子子程程序序与与调调用用的的主主程程序序之之间间有有参参数数需需要要传传递递时时,视视须须传传递递的参数量的多少分别采用以下三种方法实现:的参数量的多少分别采用以下三种方法实现:参数量很少时,往往利用指定的寄存器进行;参数量很少时,往往利用指定的寄存器进行;例例如如:将将一一个个字字节节压压缩缩BCD码码转转换换成成2位位ASCII码码的的子子程程序序中中,可可指指定以:定以:R0中存放转换的压缩中存放转换的压缩BCD码作为入口条件;码作为入口条件;R0中中存存放放低低位位BCD码码的的ASCII码码、R1中中存存放放高高位位BCD码码的的ASCII码码为为出口状态。出口状态。参参数数量量较较多多时时,往往往往需需开开辟辟一一个个公公共共存存储储区区域域作作为为主主程程序序与与子子程程序序的的数数据据共共享享区区