1、第4章 汇编程序的设计与调试一、汇编语言程序设计概述二、实用程序设计三、C51介绍程序设计语言1.1.机器语言机器语言(Machine Language)(Machine Language)这是一种用二进制代码这是一种用二进制代码“0”0”和和“1”1”表示指令和数据的表示指令和数据的程序设计语言。计算机只能识别二进制代码,这种语言是程序设计语言。计算机只能识别二进制代码,这种语言是能被计算机能被计算机直接识别直接识别和和执行执行的的机器级机器级语言。语言。特点:机器语言能够被计算机立即识别并加以执行,具有执行特点:机器语言能够被计算机立即识别并加以执行,具有执行速度快、占用内存少等优点。但对
2、于使用者来说,用机器速度快、占用内存少等优点。但对于使用者来说,用机器语言编写程序具有编写难、识别难、记忆难、查错难、交语言编写程序具有编写难、识别难、记忆难、查错难、交流难等缺点。流难等缺点。2.2.汇编语言汇编语言(Assembly Language)(Assembly Language)汇编语言是一种用助记符来表示的汇编语言是一种用助记符来表示的面向机器面向机器的程序设计的程序设计语言。不同的机器所使用的汇编语言一般是不同的。但计语言。不同的机器所使用的汇编语言一般是不同的。但计算机的算机的CPUCPU不能直接识别汇编语言,所以计算机不能立即执不能直接识别汇编语言,所以计算机不能立即执行
3、汇编语言程序。用汇编语言编写的源程序,在由计算机行汇编语言程序。用汇编语言编写的源程序,在由计算机执行之前,必须将它执行之前,必须将它翻译翻译成机器语言程序。成机器语言程序。特点:这种语言弥补了机器语言的不足,用汇编语言编写程序特点:这种语言弥补了机器语言的不足,用汇编语言编写程序比用机器语言方便、直观、易懂、易用、易记。可以编写比用机器语言方便、直观、易懂、易用、易记。可以编写出结构紧凑、运行时间精确的程序。所以,这种语言非常出结构紧凑、运行时间精确的程序。所以,这种语言非常适合于实时控制的需要。适合于实时控制的需要。3.3.高级语言高级语言(High-Level Language)(Hig
4、h-Level Language)高级语言是高级语言是面向过程面向过程并能独立于计算机硬件结构的通用并能独立于计算机硬件结构的通用程序设计语言,是一种接近人类语言和数学表达式的计算机程序设计语言,是一种接近人类语言和数学表达式的计算机语言。比如:语言。比如:BASICBASIC、FORTRANFORTRAN、COBOLCOBOL、PASCALPASCAL、C C语言等。语言等。高级语言不能被计算机直接识别和执行,需要用高级语言不能被计算机直接识别和执行,需要用编译程序编译程序或或解释程序解释程序将高级语言编写的源程序翻译为机器语言。将高级语言编写的源程序翻译为机器语言。特点:它比汇编语言易学、
5、易懂,具有通用性强、易于移植等特点:它比汇编语言易学、易懂,具有通用性强、易于移植等优点。高级语言的语句功能强,它的一条语句往往相当于许优点。高级语言的语句功能强,它的一条语句往往相当于许多条指令,因而用于翻译的程序要占用较多的存储空间,而多条指令,因而用于翻译的程序要占用较多的存储空间,而且执行时间长,且不易精确掌握,故在高速实时控制中一般且执行时间长,且不易精确掌握,故在高速实时控制中一般是不适用的。是不适用的。基本概念基本概念n在目前单片机的开发应用中,经常采用在目前单片机的开发应用中,经常采用C51C51语言语言和和汇编语言汇编语言共同编共同编写程序。要想很好地掌握和应用单片机写程序。
6、要想很好地掌握和应用单片机首先要掌握汇编语言首先要掌握汇编语言。n汇编语言是汇编语言是面向机器面向机器的程序设计语言,对于的程序设计语言,对于CPUCPU不同的单片机,其不同的单片机,其汇编语言一般是不同的。用汇编语言编写的程序称为汇编语言一般是不同的。用汇编语言编写的程序称为汇编语言源汇编语言源程序程序。n汇编语言源程序是由汇编语言语句构成的。汇编语言语句可分为汇编语言源程序是由汇编语言语句构成的。汇编语言语句可分为两大类:指令性语句和指示性语句。两大类:指令性语句和指示性语句。指令性语句指令性语句是由指令组成的由是由指令组成的由CPUCPU执行的语句,执行的语句,指示性语句指示性语句是由是
7、由伪指令伪指令组成的,它不被组成的,它不被CPUCPU执行,用来告诉汇编程执行,用来告诉汇编程序如何对程序进行汇编的指令;由于它不能生成机器语言,故又序如何对程序进行汇编的指令;由于它不能生成机器语言,故又被称为被称为伪指令语句伪指令语句。一、汇编语言程序设计概述1.1.指令性语句格式指令性语句格式 标号标号:操作码助记符操作码助记符 目的操作数目的操作数,源操作数源操作数;注释注释 每条汇编语句一般由若干部分组成,每一部分称为一个每条汇编语句一般由若干部分组成,每一部分称为一个字段字段。每个字段之间应该严格地用每个字段之间应该严格地用分界符分界符加以分隔。加以分隔。分界符包括分界符包括冒号冒
8、号、空格符空格符、逗号逗号、分号分号等。标号段与操作码之间要加等。标号段与操作码之间要加冒号冒号“:”:”;操作码与操作数之间要用空格相隔;各操作数之间要用;操作码与操作数之间要用空格相隔;各操作数之间要用逗号逗号“,”相隔;操作数与注释段之间要加分号相隔;操作数与注释段之间要加分号“;”相隔。相隔。标号是语句所在地址的标志符号标号是语句所在地址的标志符号(1 1)标号后边必须跟以冒号)标号后边必须跟以冒号“:”(2 2)由)由1-81-8个个ASCIIASCII字符组成字符组成(3 3)同一标号在一个程序中只能定义一)同一标号在一个程序中只能定义一次次 (4 4)不能使用汇编语言已经定义的符
9、号)不能使用汇编语言已经定义的符号作为标号作为标号必须以分号必须以分号“;”开头,换行书写,开头,换行书写,但必须注意也要以分号但必须注意也要以分号“;”开头。开头。汇编时,注释字段不会产生机器代码汇编时,注释字段不会产生机器代码。操作字段:(1)十六进制,后缀“H”例:MOV A,#23H 二进制,后缀“B”例:MOV A,#01010101B 十进制,后缀“D”,也可省略。(2)若十六进制的操作数以字符A-F中的某个开头时,则需在它前面加一 个“0”,以便在汇编时把它和字符A-F区别开来。例:MOV A,#0FCH(3)采用工作寄存器和特殊功能寄存器的代号来表示,也可用其地址来 表示。例:
10、程序状态子可用PSW表示,也可用D0H来表示(4)美元符号$的使用 用于表示该转移指令操作码所在的地址。例如,如下指令:HERE:SJMP HERE 可写为:SJMP$2.2.伪指令的指示性语句格式伪指令的指示性语句格式 标号标号:伪操作伪操作 操作数操作数,操作数操作数,.;,.;注释注释 伪指令不是真正的指令,是在汇编时供汇编程序识别的指令,又称为伪指令不是真正的指令,是在汇编时供汇编程序识别的指令,又称为汇编指令汇编指令。它不属于指令系统,也无对应的机器码,只是用来对汇编过程进行某它不属于指令系统,也无对应的机器码,只是用来对汇编过程进行某种控制。利用伪指令告诉汇编程序如何进行汇编,为编
11、程提供方便。种控制。利用伪指令告诉汇编程序如何进行汇编,为编程提供方便。ORG(Origin)ORG(Origin)汇编起始指令汇编起始指令 ORGORG是程序汇编起始地址定位伪指令,是程序汇编起始地址定位伪指令,功能:是规定对汇编语言源程序进行汇编时,目的程序在程序存储器中存放功能:是规定对汇编语言源程序进行汇编时,目的程序在程序存储器中存放的起始地址。的起始地址。格式:格式:标号标号:ORG 16:ORG 16位地址或标号位地址或标号注意:在一个源程序中,可多次使用注意:在一个源程序中,可多次使用ORGORG指令,以规定不同程序段的起始位指令,以规定不同程序段的起始位置,地址应从小到大顺序
12、排列,不允许重叠。置,地址应从小到大顺序排列,不允许重叠。例如:例如:ORGORG 0000H 0000HSTARTSTART:SJMPSJMP MAIN MAIN ORGORG0030H0030HMAINMAIN:MOV SPMOV SP,#30H#30H END(End)END(End)汇编结束指令汇编结束指令 ENDEND是汇编语言程序结束伪指令。是汇编语言程序结束伪指令。功能:是表示程序已结束,汇编程序对功能:是表示程序已结束,汇编程序对ENDEND后面的指令不再汇编。后面的指令不再汇编。格式:格式:标号标号:END:END注意:在一个源程序中,只能有一条注意:在一个源程序中,只能有一
13、条ENDEND指令,而且必须放在整个程序的末指令,而且必须放在整个程序的末尾。尾。EQU(Equate)EQU(Equate)赋值指令赋值指令 EQUEQU是赋值是赋值(也称等值也称等值)伪指令伪指令 。功能:把操作数段中的数据或地址赋值给标号字段中的字符名称功能:把操作数段中的数据或地址赋值给标号字段中的字符名称 。格式:格式:字符名称字符名称 EQU EQU 数值或汇编符号数值或汇编符号 注意:字符名称必须先赋值后使用,故注意:字符名称必须先赋值后使用,故EQUEQU指令通常放在源程序指令通常放在源程序 的开头。的开头。EQUEQU可定义可定义8 8位或位或1616位的数据或地址,位的数据
14、或地址,例如:例如:ORGORG 8500H 8500H AAAA EQU EQUR1R1A10A10 EQU EQU10H10HDELAY EQUDELAY EQU87E6H87E6HMOVMOVR0R0,A10A10;R0R0(10H10H)MOVMOVA A,AAAA;AA(R1R1)LCALLLCALL DELAY DELAY;调用起始地址为;调用起始地址为87E6H87E6H的子程序的子程序ENDEND DATA(Data)DATA(Data)数据地址赋值指令数据地址赋值指令 DATADATA是数据地址赋值伪指令是数据地址赋值伪指令 。功能:把操作数段中的表达式的值赋给标号字段中的字
15、符名称。功能:把操作数段中的表达式的值赋给标号字段中的字符名称。格式:格式:字符名称字符名称 DATA DATA 表达式表达式 注意:注意:DATADATA指令功能与指令功能与EQUEQU指令类似,它们的主要区别如下:指令类似,它们的主要区别如下:lDATADATA定义的字符名称可以先使用后定义,定义的字符名称可以先使用后定义,DATADATA指令可以放在源程序的任何指令可以放在源程序的任何位置,使用灵活。位置,使用灵活。lDATADATA只能用来定义只能用来定义8 8位的数据或地址。位的数据或地址。lEQUEQU可以把汇编符号赋给字符名称,而可以把汇编符号赋给字符名称,而DATADATA只能
16、把数据赋给字符名称。只能把数据赋给字符名称。lDATADATA可以把表达式的值赋给字符名称,这个表达式是可以进行求值运算可以把表达式的值赋给字符名称,这个表达式是可以进行求值运算例:A1 DATA 345H A1 DATA A1+1 XDATAXDATA数据地址赋值指令数据地址赋值指令 XDATAXDATA是数据地址赋值伪指令是数据地址赋值伪指令 。功能:把操作数段中的表达式的值赋给标号字段中的字符名称功能:把操作数段中的表达式的值赋给标号字段中的字符名称 。格式:格式:字符名称字符名称 XDATA XDATA 表达式表达式 注意:注意:XDATAXDATA指令功能与指令功能与DATADATA
17、指令类似,它们的主要区别是指令类似,它们的主要区别是XDATAXDATA可定义可定义1616位的数据或地址。位的数据或地址。BIT(Bit)BIT(Bit)位地址赋值指令位地址赋值指令 BITBIT是位地址赋值伪指令是位地址赋值伪指令 。功能:把位地址赋给字符名称功能:把位地址赋给字符名称 。格式:格式:字符名称字符名称 BIT BIT 位地址位地址例如:例如:AB AB BIT BIT 30H30H ;AB;AB与与30H30H等值等值 AC AC BIT BIT P1.0P1.0 ;AC ;AC与与P1.0P1.0等值等值 MOV MOV C,ABC,AB ;把位地址区把位地址区30H30
18、H单元中的数据送入单元中的数据送入 位累加器位累加器C C中中 CLR CLR ACAC ;把把P1.0P1.0中的内容清零中的内容清零 DB(Define Byte)DB(Define Byte)定义字节指令定义字节指令 DBDB是定义字节伪指令是定义字节伪指令 。功能:从程序存储器指定地址单元开始存放若干个字节的数值或功能:从程序存储器指定地址单元开始存放若干个字节的数值或ASCIIASCII码字符码字符 。格式:格式:标号标号:DB :DB 字节数据或字节数据或ASCIIASCII码字符码字符 注意:多个字节数据或注意:多个字节数据或ASCIIASCII码字符之间要用逗号相隔,码字符之间
19、要用逗号相隔,DBDB指令常用于指令常用于定义定义8 8位的数据常数表。位的数据常数表。例如:例如:ORG 7F00HORG 7F00H TAB:DB TAB:DB 01110010B 01110010B,16H16H,4545,88,AA汇编后存贮单元内容为:汇编后存贮单元内容为:(7F00H7F00H)=72H=72H、(7F01H7F01H)=16H=16H、(7F02H7F02H)=2DH=2DH(7F03H7F03H)=38H=38H、(7F04H7F04H)=41H=41HDW(Define Word)DW(Define Word)定义字指令定义字指令 DWDW是定义字伪指令是定义
20、字伪指令 。功能:从程序存储器指定地址单元开始存放若干个字的数值功能:从程序存储器指定地址单元开始存放若干个字的数值 。格式:格式:标号标号:DW :DW 字节数据或字节数据或ASCIIASCII码字符码字符 注意:多个字数据之间要用逗号相隔,注意:多个字数据之间要用逗号相隔,DWDW指令常用于定义指令常用于定义1616位的地址表。位的地址表。例如:例如:ORGORG 6000H 6000H TAB TAB:DWDW1254H1254H,32H32H,161161 汇编后存贮单元内容为:汇编后存贮单元内容为:(6000H6000H)=12H =12H (6001H6001H)=54H=54H(
21、6002H6002H)=00H =00H (6003H6003H)=32H=32H(6004H6004H)=00H =00H (6005H6005H)=0A1H=0A1HDS(Define Space)DS(Define Space)定义存储空间指令定义存储空间指令 DSDS是定义存储空间伪指令是定义存储空间伪指令 。功能:从程序存储器指定地址单元开始保留表达式的值所规定的存储单功能:从程序存储器指定地址单元开始保留表达式的值所规定的存储单元元 。格式:格式:标号标号:DS :DS 表达式表达式 例如:例如:ORG 1000HORG 1000H TAB:DS 06H TAB:DS 06H DB
22、 25H,35H DB 25H,35H 在上述源程序中,程序存储器从在上述源程序中,程序存储器从1000H1000H单元开始保留单元开始保留6 6个单元,个单元,1006H1006H单元存放单元存放25H25H,1007H1007H单元存放单元存放35H35H。注:对8051单片机,DB、DW、DS等伪指令只能用于程序存储器,而不能对数据存储器使用。3.3.汇编语言源程序的汇编汇编语言源程序的汇编 汇编语言源程序必须要转换为机器码汇编语言源程序必须要转换为机器码(即目的程序即目的程序),计算机才能,计算机才能执行,这个转换过程称为执行,这个转换过程称为汇编汇编。汇编语言源程序的汇编可分为手工汇
23、编和机器汇编两类。汇编语言源程序的汇编可分为手工汇编和机器汇编两类。手工汇编手工汇编是指用人脑通过查指令编码表是指用人脑通过查指令编码表(见附录中的指令表见附录中的指令表)把汇编语把汇编语言源程序翻译成机器码的过程,又称为言源程序翻译成机器码的过程,又称为人工代真人工代真。机器汇编机器汇编是用机器代替人脑并由专门的程序来进行的,这种程序称为是用机器代替人脑并由专门的程序来进行的,这种程序称为汇编程序汇编程序(不同的指令系统汇编程序不同不同的指令系统汇编程序不同)。机器汇编由计算机自动完。机器汇编由计算机自动完成,汇编程序把用汇编语言编写的源程序翻译成由机器语言表示的目成,汇编程序把用汇编语言编
24、写的源程序翻译成由机器语言表示的目的程序。用编辑软件进行源程序的编辑。编辑完成后,生成一个的程序。用编辑软件进行源程序的编辑。编辑完成后,生成一个ASCIIASCII码文件,扩展名为码文件,扩展名为“.ASM”.ASM”。反汇编反汇编是在分析程序存储器已有的程序时,将机器语言翻译成汇编语是在分析程序存储器已有的程序时,将机器语言翻译成汇编语言的转换过程。言的转换过程。无论是高级语言还是汇编语言写的源程序都必须转换成目标程序,单片机才能执行。目前很多公司都将编辑器、汇编器、编译器、连接/定位器、符号转换程序做成了软件包,称为集成开发环境,如Keil uVision、Silicon Laborat
25、ories IDE等。二、实用程序设计n程序设计方法和技巧n源程序的基本格式n汇编语言程序设计举例程序设计方法和技巧程序设计方法和技巧 1.1.程序设计的一般步骤程序设计的一般步骤(1)(1)分析工作任务,明确要达到的分析工作任务,明确要达到的工作目的工作目的、技术、技术指标指标等。等。(2)(2)确定解决问题的确定解决问题的算法算法。算法就是如何将实际问题转化成程序模块来处理,。算法就是如何将实际问题转化成程序模块来处理,要对不同的算法进行分析、比较,找出最适宜的算法。要对不同的算法进行分析、比较,找出最适宜的算法。(3)(3)画画程序流程图程序流程图。其图形的符号规定均与高级语言流程图相同
26、,如。其图形的符号规定均与高级语言流程图相同,如桶形框桶形框表示程序的开始或结束,表示程序的开始或结束,矩形框矩形框表示需要进行的工作,表示需要进行的工作,菱形框菱形框表示需要表示需要判断的事情,判断的事情,指向线指向线表示程序的流向等。表示程序的流向等。(4)(4)分配内存分配内存工作单元,确定程序与数据的存放地址。工作单元,确定程序与数据的存放地址。(5)(5)编写编写源程序源程序。(6)(6)上机上机调试调试、修改修改源程序。源程序。2.2.程序设计的一般原则程序设计的一般原则按照尽可能使按照尽可能使程序简短程序简短和和缩短运行时间缩短运行时间两个原则编写程序。两个原则编写程序。应用程序
27、一般都由应用程序一般都由一个主程序一个主程序(包括若干个功能模块包括若干个功能模块)和和多个子程序多个子程序构构成,即采用模块化的程序设计方法。成,即采用模块化的程序设计方法。每一功能模块或子程序都能完成一个明确的任务,实现某个具体功能,每一功能模块或子程序都能完成一个明确的任务,实现某个具体功能,如检测输入信号、码制转换、输出控制信号、发送数据、接收数据、如检测输入信号、码制转换、输出控制信号、发送数据、接收数据、延时、显示、打印等。延时、显示、打印等。3.3.模块化程序设计方法的特点模块化程序设计方法的特点单个模块结构的程序功能单一,易于编写、调试和修改。单个模块结构的程序功能单一,易于编
28、写、调试和修改。对程序的局部修改,可以使无关的部分保持不变。对程序的局部修改,可以使无关的部分保持不变。程序可读性好,便于功能扩展和版本升级。程序可读性好,便于功能扩展和版本升级。对于使用频繁的子程序可以建立子程序库,便于多个模块调用。对于使用频繁的子程序可以建立子程序库,便于多个模块调用。可实现多人同时进行程序的编写和调试工作,缩短程序编写时间。可实现多人同时进行程序的编写和调试工作,缩短程序编写时间。4.4.划分模块应遵循的原则划分模块应遵循的原则高内聚性高内聚性。每个模块应具有独立的功能,能产生一个明确的结果。每个模块应具有独立的功能,能产生一个明确的结果。低耦合性低耦合性。模块之间的控
29、制耦合应尽量简单,数据耦合应尽量少。控。模块之间的控制耦合应尽量简单,数据耦合应尽量少。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换息交换(传递传递)方式、交换量的多少及交换的频繁程度。方式、交换量的多少及交换的频繁程度。模块长度适中模块长度适中。模块语句的长度为。模块语句的长度为2020100100条的范围较合适。模块太条的范围较合适。模块太长时,分析和调试比较困难,失去了模块化程序结构的优越性;过短长时,分析和调试比较困难,失去了模块化程序结构的优越性;过短则模块的连接太复杂,信息交换太频繁则模块的连接太复
30、杂,信息交换太频繁。源程序的基本格式ORG 0000HLJMP START ;转向主程序;转向主程序ORG 0003HLJMP INTIE0 ;转向外部中断服务程序;转向外部中断服务程序ORG 0050HSTART:MOV A,#00HORG 4500H INTIE0:DBLO:DB 43H,64H,;表格参量;表格参量 END ;结束;结束分支结构程序分支结构程序循环结构程序循环结构程序简单结构程序简单结构程序查表程序查表程序子程序子程序汇编语言程序设计举例汇编语言程序设计举例关键字查找程序设计关键字查找程序设计数据极值查找程序设计数据极值查找程序设计数据排序程序设计数据排序程序设计子程序设
31、计主要内容:主要内容:1.1.主程序与子程序的关系主程序与子程序的关系 2.2.子程序嵌套子程序嵌套 3.3.子程序的参数传递子程序的参数传递n子程序是指完成某一专门任务并能被其他程序反复调用的子程序是指完成某一专门任务并能被其他程序反复调用的程序段。调用子程序的程序称为主程序或调用程序。使用程序段。调用子程序的程序称为主程序或调用程序。使用子程序的过程称为子程序的过程称为调用子程序调用子程序。子程序执行完后返回主程。子程序执行完后返回主程序的过程称为序的过程称为子程序返回子程序返回。n主程序和子程序是主程序和子程序是相对相对的,同一程序既可以作为另一程序的,同一程序既可以作为另一程序的子程序
32、,也可以有自己的子程序。也就是说,子程序是的子程序,也可以有自己的子程序。也就是说,子程序是允许嵌套允许嵌套的,嵌套深度和堆栈区的大小有关。的,嵌套深度和堆栈区的大小有关。n采用子程序能使整个程序结构简单,缩短程序设计时间,采用子程序能使整个程序结构简单,缩短程序设计时间,减少对存储空间的占用。减少对存储空间的占用。主程序与子程序的关系 子程序SUB 主程序MAINLCALL SUB 调用子程序子程序入口地址RETMAINMAIN:;MAINMAIN为主程序或调用程序标号为主程序或调用程序标号 LCALL SUBLCALL SUB ;调用子程序;调用子程序SUBSUB SUBSUB:PUSH
33、PSWPUSH PSW;现场保护;现场保护 PUSH ACCPUSH ACC;子程序处理程序段子程序处理程序段 POP ACCPOP ACC;现场恢复;现场恢复POP PSWPOP PSW;RETRET;最后一条指令必须为;最后一条指令必须为RETRET典型的子程序的基本结构典型的子程序的基本结构注意:注意:n子程序的第一条指令的地址称为子程序的第一条指令的地址称为子程序的入口地址子程序的入口地址,该指,该指令前令前应有标号应有标号。n在子程序末尾用在子程序末尾用RETRET返回指令从子程序返回主程序。返回指令从子程序返回主程序。n根据需要根据需要保护现场保护现场和和恢复现场恢复现场。在子程序
34、的开始,使用压。在子程序的开始,使用压栈指令把需要保护的内容压入堆栈;在返回主程序前,使栈指令把需要保护的内容压入堆栈;在返回主程序前,使用弹出指令把堆栈中保护的内容送回原来的存储单元中。用弹出指令把堆栈中保护的内容送回原来的存储单元中。子程序中有可能要使用累加器子程序中有可能要使用累加器A A或工作寄存器,在子程序或工作寄存器,在子程序使用它们之前,把它们中可能存有的主程序的中间结果保使用它们之前,把它们中可能存有的主程序的中间结果保存起来,这一过程称为保护现场。在子程序执行完并将返存起来,这一过程称为保护现场。在子程序执行完并将返回主程序之前,再将这些中间结果取出,送回到累加器回主程序之前
35、,再将这些中间结果取出,送回到累加器A A或原来的工作寄存器中,这一过程称为恢复现场。或原来的工作寄存器中,这一过程称为恢复现场。n子程序中应尽量使用子程序中应尽量使用相对转移指令相对转移指令而不使用其他转移指令,而不使用其他转移指令,以便子程序放在内存的任何区域都能被主程序调用。以便子程序放在内存的任何区域都能被主程序调用。n要正确地设置要正确地设置堆栈指针堆栈指针,以避免堆栈区与工作寄存器或其,以避免堆栈区与工作寄存器或其他存储单元发生冲突。他存储单元发生冲突。ORG0000H MAIN:MOVA,#0FEH;送显示初值;送显示初值 LP:MOVR0,#10;送闪烁次数;送闪烁次数 LP0
36、:MOVP1,A;点亮;点亮LEDLCALLDELAY;延时;延时MOVP1,#0FFH;熄灭灯;熄灭灯LCALLDELAY;延时;延时DJNZR0,LP0 RLA SJMPLP END实例:实例:P1口连接的口连接的8个个LED依次循环闪烁依次循环闪烁10次次延时次数-1=0点亮相应的LEDYN熄灭相应的LED延时初值左移1位指向下一个LED设闪烁次数送显示初值开始子程序嵌套子程序嵌套(或称多重转子)是指在子程序执行过程中,还可以调用另一个子程序。子程序调用、返回到主程序中的正确位置,并接着执行主程序中的后续指令呢?为了解决这个问题,我们采用了堆栈技术。子程序嵌套 子程序SUB1 主程序MA
37、INRET 子程序SUB2RET20102013211021132100220020 132013 PC21 131321堆栈指针SP堆栈LCALL SUB1LCALL SUB221 1320 13子程序嵌套范例:子程序嵌套范例:LEDLED灯闪烁灯闪烁(二二)ORG 0000H MAIN:MOV A,#0FEH;送显示初值 COUN:ACALL FLASH;调闪烁子程序 RL A;A左移,下一个灯闪烁 SJMP COUN ;循环不止 FLASH:MOV R0,#10;送闪烁次数 FLASH1:MOV P1,A;点亮LED LCALL DELAY;延时 MOV P1,#0FFH;熄灭灯 LCA
38、LL DELAY;延时 DJNZ R0,FLASH1;闪烁次数不够10次,继续 RET DELAY:MOV R3,#0FFH ;延时子程序 DEL2:MOV R4,#0FFH DEL1:NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET END子程序的参数传递子程序的参数传递 ORGORG0000H0000H ;主程序;主程序MOVMOVSP,#3FH SP,#3FH ;设置栈底;设置栈底MOVMOVA,31HA,31H ;取数;取数a a存放到累加器存放到累加器A A中作为入口参数中作为入口参数LCALL SQR LCALL SQR ;计算;计算MOVMOVR1,AR1,A
39、;出口参数;出口参数平方值存放在平方值存放在A A中中MOVMOVA,32HA,32H ;取数;取数b b存放到累加器存放到累加器A A中作为出口参数中作为出口参数LCALL SQR LCALL SQR ;计算;计算ADDADDA,R1A,R1 ;求和;求和MOVMOV33H,A33H,A ;存放结果;存放结果SJMPSJMP$SQRSQR:PUSH DPHPUSH DPH ;保护现场,将主程序中;保护现场,将主程序中DPTRDPTR的高八位放入堆栈的高八位放入堆栈 PUSH DPLPUSH DPL ;保护现场,将主程序中;保护现场,将主程序中DPTRDPTR的低八位放入堆栈的低八位放入堆栈
40、MOV DPTR,#TABLE MOV DPTR,#TABLE ;在子程序中重新使用;在子程序中重新使用DPTR,DPTR,表首地址表首地址DPTRDPTR MOVC A,A+DPTR MOVC A,A+DPTR ;查表;查表 POP DPLPOP DPL;恢复现场,将主程序中;恢复现场,将主程序中DPTRDPTR的低八位从堆栈中弹出的低八位从堆栈中弹出 POP DPHPOP DPH;恢复现场,将主程序中;恢复现场,将主程序中DPTRDPTR的高八位从堆栈中弹出的高八位从堆栈中弹出 RETRETTABLE:DB 0,1,4,9,16,25,36,49,64,81TABLE:DB 0,1,4,9
41、,16,25,36,49,64,81n传送子程序参数的方法传送子程序参数的方法l利用寄存器或片内利用寄存器或片内RAMRAM传送参数传送参数。可以把入口参数存放到寄。可以把入口参数存放到寄存器或片内存器或片内RAMRAM中传送给子程序,也可以把出口参数存放到中传送给子程序,也可以把出口参数存放到寄存器或片内寄存器或片内RAMRAM中传送给主程序。中传送给主程序。l利用寄存器传送参数的地址利用寄存器传送参数的地址。把存放入口参数的地址通过。把存放入口参数的地址通过寄存器传送给子程序,子程序根据寄存器中存放入口参数寄存器传送给子程序,子程序根据寄存器中存放入口参数的地址便可找到入口参数并对它们进行
42、相应操作;出口参的地址便可找到入口参数并对它们进行相应操作;出口参数的地址也可通过寄存器传送给主程序。数的地址也可通过寄存器传送给主程序。l利用堆栈传送参数利用堆栈传送参数。可以用压栈指令。可以用压栈指令PUSHPUSH把入口参数压入把入口参数压入堆栈传送给子程序,也可以使用压栈指令堆栈传送给子程序,也可以使用压栈指令PUSHPUSH把出口参数把出口参数压入堆栈传送给主程序。压入堆栈传送给主程序。子程序设计注意事项 (1)要给每个子程序起一个名字,也就是入口地址入口地址的代号。(2)要能正确地传递参数。即首先要有入口条件入口条件,说明进入子程序时,它所要处理的数据放在何处(如:是放在A中还是放
43、在某个工作寄存器中等)。另外,要有出口条件出口条件,即处理的结果存放在何处。(3)注意保护现场和恢复现场。在子程序使用累加器、工作寄存器等资源时,要先将其原来的内容保存起来,即保护现场保护现场。当子程序执行完毕,在返回主程序之前,要将这些内容再取出,送还到累加器、工作寄存器等原单元中,这一过程称为恢复现恢复现场场。n在单片机的实际应用中,经常要对一些数据进行在单片机的实际应用中,经常要对一些数据进行函数运算函数运算,例如求平方、正弦函数等,为了提高单片机执行程序的速例如求平方、正弦函数等,为了提高单片机执行程序的速度,一般将某函数的全部函数值按一定的规律编成表格存度,一般将某函数的全部函数值按
44、一定的规律编成表格存放到程序存储器中。放到程序存储器中。n查表程序查表程序就是根据某数据的函数运算要求,按索引号从程就是根据某数据的函数运算要求,按索引号从程序存储器中查找与之相对应的函数值的程序结构。序存储器中查找与之相对应的函数值的程序结构。n设计查表程序时,主要通过两条设计查表程序时,主要通过两条查表指令查表指令实现查表功能。实现查表功能。MOVC AMOVC A,A+DPTRA+DPTR MOVC A MOVC A,A+PCA+PC查表程序例例 用查表法计算平方用查表法计算平方(1)(1)ORG 0000HORG 0000H MOV MOV DPTR DPTR,#TABLE ;#TAB
45、LE ;表首地址送表首地址送DPTRDPTR MOV A MOV A,#05#05;被查数字被查数字0505A A MOVC A MOVC A,A+DPTRA+DPTR ;查表求平方查表求平方 SJMP$SJMP$TABLETABLE:DB 0,1,4,9,16,25,36,49,64,81 DB 0,1,4,9,16,25,36,49,64,81 END END 例例 用查表法计算平方用查表法计算平方(2)(2)ORGORG 0000H 0000HMOV AMOV A,#05#05 ;05 ;05 A AADDADDA A,#02#02 ;修正累加器修正累加器A AMOVC AMOVC A,
46、A+PCA+PC ;查表求平方查表求平方SJMP$SJMP$DB 0,1,4,9,16,25,36,49,64,81DB 0,1,4,9,16,25,36,49,64,81 END END74H05H24H02H83H80HFEH00H01H04H09H10H19H24H31H40H51H00H0000H0001H0002H0003H0004H0005H0006H0007H0008H0009H000AH000BH000CH000DH000EH000FH0010H0011H例:设有一巡回检测报警装置,需对例:设有一巡回检测报警装置,需对1616路输入量进行测量控制,每路输入量进行测量控制,每路有
47、一个最大允许值。控制时根据测量的路数,找出该路的最大允路有一个最大允许值。控制时根据测量的路数,找出该路的最大允许值。测量的路数保存在许值。测量的路数保存在R R2 2中,最大值结果保存在中,最大值结果保存在R R3 3R R4 4中。中。解:利用查表程序完成。解:利用查表程序完成。LTB:MOVA,R2ADDA,R2MOVR3,AADDA,#6MOVC A,A+PCXCHA,R3ADDA,#3MOVC A,A+PCMOVR4,ARETMAX:DW1520,3721,445,7850DW3483,32657,883,9943DW1101,40511,6756,331DW4468,5871,13
48、224,9981解:利用查表程序完成。解:利用查表程序完成。LTB:MOVA,R2ADDA,R2MOVR3,AMOVDPTR,#MAXMOVC A,A+DPTRXCHA,R3INCAMOVC A,A+DPTRMOVR4,ARETMAX:DW1520,3721,445,7850DW3483,32657,883,9943DW1101,40511,6756,331DW4468,5871,13224,9981数据极值查找程序设计数据极值查找程序设计 在指定的数据区中在指定的数据区中找出最大值(或最小值)。找出最大值(或最小值)。进行数值大小的比较,从这批数据中找出最大值(或最小值)进行数值大小的比较,
49、从这批数据中找出最大值(或最小值)并存于某一单元中。并存于某一单元中。例例 片内片内RAMRAM中存放一批数据,查找出最大值并存放于首地址中。中存放一批数据,查找出最大值并存放于首地址中。设设R0R0中存首地址,中存首地址,R2R2中存放字节数。中存放字节数。MOV R2MOV R2,n n;n n为要比较的数据字节数为要比较的数据字节数MOV AMOV A,R0R0;存首地址指针;存首地址指针MOV R1MOV R1,A ADEC R2DEC R2 MOV AMOV A,R1 R1 LOOP:LOOP:MOV R3MOV R3,A A DEC R1DEC R1 CLR CCLR C SUBB
50、 ASUBB A,R1R1;两个数比较;两个数比较 JNC LOOP1JNC LOOP1;C=0C=0,A A中的数大,跳中的数大,跳LOOP1LOOP1 MOV AMOV A,R1R1;C=1C=1,则大数送,则大数送A A SJMP LOOP2SJMP LOOP2 LOOP1:LOOP1:MOV AMOV A,R3 R3 LOOP2:LOOP2:DJNZ R2,LOOPDJNZ R2,LOOP;是否比较结束?;是否比较结束?MOV R0MOV R0,A A;存最大数;存最大数 RET RET 例例 片内片内RAMRAM中存放一批数据,查找出最大值并存放于首地中存放一批数据,查找出最大值并存
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。