第4章MCS-51单片机汇编语言程序设计_第1页
第4章MCS-51单片机汇编语言程序设计_第2页
第4章MCS-51单片机汇编语言程序设计_第3页
第4章MCS-51单片机汇编语言程序设计_第4页
第4章MCS-51单片机汇编语言程序设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、4.1 4.1 汇编语言程序设计概述汇编语言程序设计概述 计算机是按照给定程序,逐条执行指令,完成某项规定的任计算机是按照给定程序,逐条执行指令,完成某项规定的任务,因而,前面所学的务,因而,前面所学的MCS-51MCS-51单片机的指令系统的各种指令只有单片机的指令系统的各种指令只有按工作要求有序地编排为一段完整的程序,才能起到一定的作用,按工作要求有序地编排为一段完整的程序,才能起到一定的作用,从而完成某一特定任务。因此,要使用单片机,首先必须编写出从而完成某一特定任务。因此,要使用单片机,首先必须编写出计算机能执行的程序。计算机能执行的程序。4.1.1 4.1.1 程序设计语言程序设计语

2、言 计算机能执行的程序可以用很多种语言来编写,但从语言结计算机能执行的程序可以用很多种语言来编写,但从语言结构及其与计算机的关系来看,可分为三大类型。构及其与计算机的关系来看,可分为三大类型。(1 1)机器语言)机器语言 前面已经介绍过,前面已经介绍过,机器语言机器语言是一种由由二进制代码是一种由由二进制代码“0”0”和和“1”1”表示指令和数据的最原始的程序设计语言。由于计算机只能表示指令和数据的最原始的程序设计语言。由于计算机只能识别二进制代码,故机器语言与计算机的关系最为直接,执行速识别二进制代码,故机器语言与计算机的关系最为直接,执行速度最快。但对于使用者来说,编程非常繁琐,而且难看懂

3、,难记度最快。但对于使用者来说,编程非常繁琐,而且难看懂,难记忆,易出错。忆,易出错。 (2 2)汇编语言)汇编语言 汇编语言汇编语言是用英文单词或英文单词缩写表示机器语言指令的是用英文单词或英文单词缩写表示机器语言指令的操作码(助记符),用符号表示操作数或操作数的地址。汇编语操作码(助记符),用符号表示操作数或操作数的地址。汇编语言易读、易记,但用汇编语言编写的程序,言易读、易记,但用汇编语言编写的程序,CPUCPU不能直接执行,必不能直接执行,必须将其翻译成机器语言的目标代码,这一翻译过程称为须将其翻译成机器语言的目标代码,这一翻译过程称为汇编汇编。 简单的程序可以通过人工查指令系统代码对

4、照表翻译,称为简单的程序可以通过人工查指令系统代码对照表翻译,称为“手工汇编手工汇编”,这种方法易出错,且麻烦,所以通常采用,这种方法易出错,且麻烦,所以通常采用“机器机器汇编汇编”。机器汇编是由专门的程序来进行的,这种程序称为。机器汇编是由专门的程序来进行的,这种程序称为汇编汇编程序程序(不同指令系统汇编程序不同)。汇编程序可以把用汇编语(不同指令系统汇编程序不同)。汇编程序可以把用汇编语言编写的言编写的源程序源程序翻译成由机器语言表示的目的码程序翻译成由机器语言表示的目的码程序( (也称为也称为目标目标程序程序) )。 汇编语言非常适合于实时控制的需要。在汇编语言非常适合于实时控制的需要。

5、在MCS-51MCS-51的实际应用的实际应用中,绝大部分应用程序都是采用汇编语言编写的。中,绝大部分应用程序都是采用汇编语言编写的。 (3 3)高级语言)高级语言 高级语言是一种面向过程而独立于计算机硬件结构的通用计高级语言是一种面向过程而独立于计算机硬件结构的通用计算机语言,如算机语言,如BASICBASIC、FORTRANFORTRAN、PASCALPASCAL以及以及C C语言等。这些语言是语言等。这些语言是参照数学语言而设计的近似于日常会话的语言,使用者不必了解参照数学语言而设计的近似于日常会话的语言,使用者不必了解计算机内部结构,因而它比汇编语言更易学、易懂,而且通用性计算机内部结

6、构,因而它比汇编语言更易学、易懂,而且通用性较强。较强。 高级语言也不能被计算机直接识别和执行,也需要翻译为机高级语言也不能被计算机直接识别和执行,也需要翻译为机器语言。这一翻译工作通常称为器语言。这一翻译工作通常称为编译或解释编译或解释,进行编译或解释的,进行编译或解释的程序称为编译程序或解释程序。程序称为编译程序或解释程序。 用于翻译高级语言的程序要占用较多存储空间,而且执行时用于翻译高级语言的程序要占用较多存储空间,而且执行时间长,且不易精确掌握,故间长,且不易精确掌握,故在高速实时控制中一般是不适用的。在高速实时控制中一般是不适用的。4.1.2 4.1.2 汇编语言程序的组成汇编语言程

7、序的组成 汇编语言源程序是由汇编语句组成的,一般情况下,汇编语汇编语言源程序是由汇编语句组成的,一般情况下,汇编语言语句可分为:指令性语句(即汇编指令)和指示性语句(即伪言语句可分为:指令性语句(即汇编指令)和指示性语句(即伪指令)。指令)。(1 1)汇编指令)汇编指令 已在前一章进入了深入的学习。每一条汇编指令在汇编时都已在前一章进入了深入的学习。每一条汇编指令在汇编时都产生相应的机器语言的目标代码。产生相应的机器语言的目标代码。(2 2)伪指令)伪指令 伪指令又称汇编控制指令,这些指令不属于指令系统,它是伪指令又称汇编控制指令,这些指令不属于指令系统,它是控制汇编(翻译)过程的一些命令。伪

8、指令不产生机器代码。控制汇编(翻译)过程的一些命令。伪指令不产生机器代码。 利用伪指令告诉汇编程序如何进行汇编,同时它也为人们编利用伪指令告诉汇编程序如何进行汇编,同时它也为人们编程提供了方便。程提供了方便。 4.1.3 4.1.3 伪指令伪指令 MCS-51MCS-51单片机汇编语言中常用的伪指令如下:单片机汇编语言中常用的伪指令如下:(1) ORG(1) ORG(originorigin)( (汇编起始地址汇编起始地址) ) 这是一条程序汇编起始地址定位伪指令,用来规定汇编语言程序这是一条程序汇编起始地址定位伪指令,用来规定汇编语言程序进行汇编时,目的程序在程序存储器中存放的起始地址。进行

9、汇编时,目的程序在程序存储器中存放的起始地址。格式:格式: ORG 16ORG 16位地址位地址如,如, ORG 2000HORG 2000H START START:MOV A,#00HMOV A,#00H 汇编结果:汇编结果:ORG 2000HORG 2000H下面的程序或数据存放在存储器下面的程序或数据存放在存储器2000H2000H开始的单开始的单元中,标号元中,标号STARTSTART为符号地址,其值为为符号地址,其值为2000H2000H。 在一个源程序中,可多次使用在一个源程序中,可多次使用ORGORG指令,来规定不同的程序段的指令,来规定不同的程序段的起始地址。但是,地址必须由

10、小到大排列,地址不能交叉、重叠。如起始地址。但是,地址必须由小到大排列,地址不能交叉、重叠。如不用不用ORGORG规定,则汇编得到的目标程序将从规定,则汇编得到的目标程序将从0000H0000H开始。开始。(2 2)END (end of assembly)END (end of assembly)(结束汇编)(结束汇编) 汇编语言程序结束伪指令,用在程序的末尾,表示程序己结汇编语言程序结束伪指令,用在程序的末尾,表示程序己结束。汇编程序对束。汇编程序对ENDEND以后的指令不再汇编。在整个源程序中只能有以后的指令不再汇编。在整个源程序中只能有一条一条ENDEND命令,且位于程序的最后。命令,

11、且位于程序的最后。(3 3)EQUEQU(equateequate)( (赋值赋值) ) 赋值(也称等值)伪指令,它的作用是把操作数段中的地址赋值(也称等值)伪指令,它的作用是把操作数段中的地址或数据赋值给标号字段中的标号。或数据赋值给标号字段中的标号。格式:标号(字符名称)格式:标号(字符名称) EQU EQU 数或汇编符号数或汇编符号例例1 1,TEST EQU 2000HTEST EQU 2000H 表示标号表示标号TEST=2000HTEST=2000H,在汇编时,凡是遇到标号,在汇编时,凡是遇到标号TESTTEST时,均时,均以以2000H2000H来代替。来代替。 例例2 2,若定

12、义:,若定义:AA EQU R1AA EQU R1,则,则“MOV AMOV A,AA”AA”与与“MOV AMOV A,R1”R1”等等值。值。(4 4)DBDB(define bytedefine byte)(定义字节)(定义字节) 定义字节伪指令,格式:定义字节伪指令,格式: 标号:标号: DB DB 项或项表项或项表 功能:从指定单元开始定义(存储)若干个字节。功能:从指定单元开始定义(存储)若干个字节。 使用时注意:项与项之间用使用时注意:项与项之间用“,”分隔;字符型数据用分隔;字符型数据用“ ”括起来;数据可以采用二进制、十六进制及括起来;数据可以采用二进制、十六进制及ASCII

13、ASCII码等形式表示;码等形式表示;省去标号不影响指令的功能;负数须转换成补码表示;可以多省去标号不影响指令的功能;负数须转换成补码表示;可以多次使用次使用DBDB定义字节。定义字节。例,例, ORG 2000HORG 2000H TAB TAB:DB 12HDB 12H,7373,00111001B00111001B,“C”C” 该伪指令汇编结果为:将该伪指令汇编结果为:将12H12H存放在存放在TABTAB(即(即2000H2000H)单元,)单元,49H49H(73D73D的十六进制)存放在的十六进制)存放在2001H2001H单元,单元,00111001B00111001B存放在存放

14、在2002H2002H单元,单元,43H43H(字符(字符“C”C”的的ASCIIASCII码)存放在码)存放在2003H2003H单元。单元。注:注:1010进制数自然转换成进制数自然转换成1616进制数,字母按进制数,字母按ASCIIASCII码存储。码存储。(5 5)DWDW(define worddefine word)( (定义字定义字) ) 定义字伪指令,其功能是从指定单元开始定义(存储)若干定义字伪指令,其功能是从指定单元开始定义(存储)若干个字的数据。注:一个字个字的数据。注:一个字= =两个字节(两个字节(16bit16bit)格式:格式: 标号:标号: DW DW 项或项表

15、项或项表例,例, ORG 2000HORG 2000H DW 1246H DW 1246H,7BH7BH,1010汇编后:汇编后:(2000H2000H)=12H=12H;第;第1 1个字个字(2001H2001H)=46H =46H (2002H2002H)=00H=00H;第;第2 2个字个字(2003H2003H)=7BH=7BH(2004H2004H)=00H=00H;第;第3 3个字个字(2005H2005H)=0AH =0AH (6 6)BIT BIT (位地址符号)(位地址符号) 位地址符号伪指令,其功能是把位地址赋予所规定的字位地址符号伪指令,其功能是把位地址赋予所规定的字符名

16、称。符名称。格式:字符名称格式:字符名称 BIT BIT 位地址位地址例,例,GUIZHOU BIT P1.0GUIZHOU BIT P1.0 GUIYANG BIT 20H.1 GUIYANG BIT 20H.1 经以上定义后,经以上定义后,GUIZHOUGUIZHOU和和GUIYANGGUIYANG就可当作位地址来使就可当作位地址来使用了。用了。MOV CMOV C,GUIZHOU GUIZHOU ;P1.0CP1.0CMOV GUIYANG, C MOV GUIYANG, C ;C20H.1C20H.1(7 7)DS DS (定义存储单元)(定义存储单元) 定义存储单元伪指令。定义存储单

17、元伪指令。 格式:标号:格式:标号:DS DS 数字数字 功能:从标号所指示的单元开始,根据数字的值保留功能:从标号所指示的单元开始,根据数字的值保留一定数量的字节存储单元,留给以后存储数据用。一定数量的字节存储单元,留给以后存储数据用。例,例,SPACESPACE: DS 10 DS 10 汇编后,从汇编后,从SPACESPACE开始保留开始保留1010个存储单元,下一条指个存储单元,下一条指令将从令将从SPACE+10SPACE+10处开始汇编。处开始汇编。4.1.4 4.1.4 汇编语言程序设计步骤汇编语言程序设计步骤(1 1)分析问题,明确任务要求;)分析问题,明确任务要求;(2 2)

18、确定算法;)确定算法;(3 3)根据算法,)根据算法,画出程序框图画出程序框图;(4 4)分配内存工作区及有关端口地址;)分配内存工作区及有关端口地址;(5 5)编写程序)编写程序;(;(注:在编写程序过程中,要养成在程序中注:在编写程序过程中,要养成在程序中 加上注释加上注释的习惯,方便自己也方便他人。的习惯,方便自己也方便他人。) )(6 6)上机对源程序进行汇编、调试。)上机对源程序进行汇编、调试。 用汇编语言编写程序,对于初学者来说会遇到许多困难,用汇编语言编写程序,对于初学者来说会遇到许多困难,只有通过不断实践,不断积累经验,才能编写出较高质量的只有通过不断实践,不断积累经验,才能编

19、写出较高质量的程序。程序。4.1.5 4.1.5 汇编语言程序设计举例汇编语言程序设计举例1. 1. 顺序程序设计顺序程序设计 顺序结构程序是一种最简单、最基本的程序(顺序结构程序是一种最简单、最基本的程序(也称为简也称为简单程序单程序)。它的特点是按程序编写的顺序依次执行,程序流)。它的特点是按程序编写的顺序依次执行,程序流向不变。这类程序是所有复杂程序的基础或某个组成部分。向不变。这类程序是所有复杂程序的基础或某个组成部分。 顺序程序虽然并不难编写,但要设计出高质量的程序还顺序程序虽然并不难编写,但要设计出高质量的程序还是需要掌握一定的技巧。为此,需要熟悉指令系统,正确地是需要掌握一定的技

20、巧。为此,需要熟悉指令系统,正确地选择指令。选择指令。例,求一个例,求一个1616位二进制数的补码。设此位二进制数的补码。设此1616位二进制数存放在位二进制数存放在R1R1及及 R0R0中,求补后送存中,求补后送存R3R3和和R2R2中。中。解:我们己知二进制求补码即解:我们己知二进制求补码即“求反加一求反加一”的过程,因为现在是的过程,因为现在是1616位位 数,有两个字节,所以在对低字节加数,有两个字节,所以在对低字节加1 1后要考虑加后要考虑加1 1进位问题,进位问题, 而而INCINC指令不影响指令不影响CYCY标志,故在此标志,故在此“加加1”1”需用加法指令。需用加法指令。 源程

21、序如下:源程序如下: ORG 2000HORG 2000H MOV A MOV A,R0 ;R0 ;取低位字节送取低位字节送A A CPL A ; CPL A ;取反取反 ADD AADD A,#1 ;#1 ;求低位补码求低位补码, ,在此不能直接在此不能直接ADD R0ADD R0,#1(#1(无此指令无此指令) ) MOV R2 MOV R2,A ;A ;低位字节补码送低位字节补码送R2R2 MOV A MOV A,R1 ;R1 ;取高位字节送取高位字节送A A CPL A CPL A ADDC A ADDC A,#0 ;#0 ;高位加进位高位加进位 MOV R3MOV R3,A ;A ;

22、高位字节补码送高位字节补码送R3R3 LP LP:SJMP LP ;SJMP LP ;暂停暂停 ENDEND 该程序的该程序的“程序流程图程序流程图”如右图:如右图:程序流程图程序流程图开始低位字节取反取低位字节存低位字节补码低位字节加1高位字节取反 取高位字节存高位字节补码高位字节加进位结束ORG 2000HORG 2000HMOV AMOV A,R0 R0 CPL A CPL A ADD AADD A,#1#1MOV R2MOV R2,A A MOV AMOV A,R1 R1 CPL ACPL AADDC AADDC A,#0 #0 MOV R3MOV R3,A A LPLP:SJMP L

23、PSJMP LPENDEND2. 2. 循环程序设计循环程序设计 循环结构的程序一般包括以下几部分:循环结构的程序一般包括以下几部分:(1 1)循环初态)循环初态 循环初态(或称初始条件)是设置循环过程工作单元的初始值。循环初态(或称初始条件)是设置循环过程工作单元的初始值。例如,设置循环次数计数器、地址指针初值及其他变量的起始值等。例如,设置循环次数计数器、地址指针初值及其他变量的起始值等。(2 2)循环体)循环体 重复执行的程序段部分称循环体,完成主要的计算或操作任务,重复执行的程序段部分称循环体,完成主要的计算或操作任务,同时也包括对地址指针修改。同时也包括对地址指针修改。(3 3)循环

24、控制部分)循环控制部分 该部分用于控制循环的执行和结束。循环程序每执行一次,都检该部分用于控制循环的执行和结束。循环程序每执行一次,都检查结束条件。当条件不满足时,修改地址指针和控制变量;当条件满查结束条件。当条件不满足时,修改地址指针和控制变量;当条件满足时,停止循环。足时,停止循环。 若循环程序的循环体中不再包含循环程序,称为单重循环程序;若循环程序的循环体中不再包含循环程序,称为单重循环程序;如果在循环体中还包含有循环程序,称为如果在循环体中还包含有循环程序,称为循环嵌套循环嵌套。注:只允许外重。注:只允许外重循环嵌套内重循环程序,而不允许循环体互相交叉。循环嵌套内重循环程序,而不允许循

25、环体互相交叉。例例1 1,已知,已知80518051单片机使用的晶振为单片机使用的晶振为6MHz6MHz, 要求设计一个软件延时程序,延时时要求设计一个软件延时程序,延时时 间为间为10ms10ms。解:延时程序的延时时间主要与两个因素有解:延时程序的延时时间主要与两个因素有关,一个所用晶振,一个是延时程序中的循关,一个所用晶振,一个是延时程序中的循环次数。一旦晶振确定之后,则主要是如何环次数。一旦晶振确定之后,则主要是如何设计与计算需给定的延时循环次数。在本题设计与计算需给定的延时循环次数。在本题中已知晶振为中已知晶振为6MHz6MHz,则可知一个机器周期为,则可知一个机器周期为2us2us

26、,则可用两重循环来实现延时,则可用两重循环来实现延时10ms10ms,其,其中,内重循环每循环一次耗时中,内重循环每循环一次耗时1ms,1ms,外重循环外重循环用来控制内重循环运行用来控制内重循环运行1010次,于是便可达到次,于是便可达到延时延时10ms10ms的要求。据此,可画出如右图所示的要求。据此,可画出如右图所示的程序流程图。的程序流程图。 根据程序流程图,可编写如下源程序:根据程序流程图,可编写如下源程序:开始外循环毫秒数10 R0结束内循环实现1ms延时RO-1 RORO=0?YN周期数周期数 ORG 2000HORG 2000H 1 MOV RO 1 MOV RO,#0AH #

27、0AH ;毫秒数;毫秒数R0R0 1 DL2 1 DL2:MOV R1MOV R1,#MT #MT ;1ms1ms延时的预定值延时的预定值MTR1MTR1 1 DL1 1 DL1:NOP NOP 1 NOP 1 NOP 2 DJNZ R1 2 DJNZ R1,DL1 DL1 ;1ms1ms延时循环延时循环 2 DJNZ R02 DJNZ R0,DL2 DL2 ;毫秒数减;毫秒数减1 1,不等于,不等于0 0则继续循则继续循 环,等于环,等于0 0结束。结束。 ENDEND 内循环是要实现内循环是要实现1ms1ms的延时,于是,可以算出的延时,于是,可以算出MTMT的实际值:的实际值: (1+1

28、+21+1+2)* *2us2us* *MT=1000us MT=1000us 可得:可得:MT=125=7DHMT=125=7DH 将将7DH7DH代替上述程序中的代替上述程序中的MTMT,则该程序执行后能实现,则该程序执行后能实现10ms10ms延时。延时。 若考虑其他指令的执行时间,则该段延时程序的若考虑其他指令的执行时间,则该段延时程序的精确延时时间精确延时时间计算计算方法为:方法为:1 1* *2us+(12us+(1* *2us+1000us+22us+1000us+2* *2us)2us)* *10=10062us10=10062us。 若需要延时更长时间,可采用更多重循环,如若

29、需要延时更长时间,可采用更多重循环,如1s1s延时可用延时可用3 3重循环,重循环,而而7 7重循环可延时一年。重循环可延时一年。例例2 2,从,从22H22H单元开始有一无符号单元开始有一无符号数据块,其长度在数据块,其长度在20H20H单元。求出单元。求出数据中最大值,并存入数据中最大值,并存入21H21H单元。单元。解:根据题意,先设一个最小值解:根据题意,先设一个最小值0 0,然后逐个取出队列中的数与最小然后逐个取出队列中的数与最小值相比。如果大于最小值,则此值相比。如果大于最小值,则此值与最小值交换后再继续比较;值与最小值交换后再继续比较;如果小于或等于最小值,则恢复如果小于或等于最

30、小值,则恢复原最小值(因为使用减法指令比原最小值(因为使用减法指令比较后,还需恢复原值)再继续比较后,还需恢复原值)再继续比较。当所有数据均比较完之后,较。当所有数据均比较完之后,则可得到最大值。据此,可画出则可得到最大值。据此,可画出如右图所示的程序流程图。如右图所示的程序流程图。 根据程序流程图,可编写如根据程序流程图,可编写如下源程序:下源程序:开始设置循环初始条件(设置一个最小值0; 从20H单元取出数据个数; 设置22H为数据存放区首址.)结束最小值-从队列中取出的数C=0?N此数与最小值交换恢复原最小值数据存放区地址+1(继续往下取数据,以便继续进行比较.)所有数据比较完没有?NY

31、将比较结果存在21H单元Y ORG 2000H ORG 2000H CLR A CLR A ;清;清A A作为初始最小值。作为初始最小值。 MOV R2MOV R2,20H 20H ;数据个数初值。;数据个数初值。 MOV R1MOV R1,#22H #22H ;数据存放区首址。;数据存放区首址。 LPLP:CLR C CLR C ;清进位。;清进位。 SUBB A,R1 ; SUBB A,R1 ; 最小值减队列中数。最小值减队列中数。 JNC NEXT JNC NEXT ;C=0C=0跳转,即跳转,即A(R1)A(R1)跳转;跳转;C=1C=1顺序执顺序执 行,即行,即A(R1)A10X10

32、跳到跳到L1L1,且,且C=0C=0;若;若X10X10也跳到也跳到L1L1,但,但 C=1; C=1; 若若X=10X=10顺序执行顺序执行, ,也是执行也是执行L1L1这句这句, ,且且C=0C=0。 L1L1:JC L2 JC L2 ;若;若C=1(X10),C=1(X15X15。 CJNE ACJNE A,#10H#10H,L3 L3 ;若;若X16X16跳到跳到L3L3,且,且C=0C=0;若;若X16X16亦跳到亦跳到L3L3,且,且 C=1C=1;若;若X=16X=16顺序执行顺序执行L3L3这句,且这句,且C=0C=0; L3L3:JNC L4 JNC L4 ;若;若C=0(X

33、16)C=0(X16),跳到,跳到L4L4;若;若C=1(X16)C=1(X16),顺序执行。,顺序执行。 MOV AMOV A,R1R1 ADD A ADD A,#08 #08 ;10X1510X15,Y=XY=X2 2+8+8 MOV RO MOV RO,A A ORG 2000H ORG 2000H MOV A MOV A,5AH5AH MOV B MOV B,A A MUL AB MUL AB MOV R1 MOV R1,A A MOV A MOV A,5AH5AH CJNE A CJNE A,#10#10,L1L1 L1 L1:JC L2JC L2 MOV RO MOV RO,#41

34、#41 CJNE A CJNE A,#10H#10H,L3L3 L3 L3:JNC L4JNC L4 MOV A MOV A,R1R1 ADD A ADD A,#08#08 MOV RO MOV RO,A A SJMP L4 SJMP L4L2L2:MOV AMOV A,R1R1 CLR C CLR C SUBB A SUBB A,#01 #01 ;X10,Y=XX10,Y=X2 2-1.-1. MOV R0 MOV R0,A AL4L4:MOV 5BHMOV 5BH,R0 R0 ;存结果。;存结果。 SJMP $SJMP $ END END 在分支程序中,常用到比较指令、在分支程序中,常用到

35、比较指令、测试指令以及无条件测试指令以及无条件/条件转移指令。条件转移指令。分支程序设计的技巧,就在于正确而分支程序设计的技巧,就在于正确而巧妙地使用这些指令。前面学的用散巧妙地使用这些指令。前面学的用散转指令转指令JMP A+DPTR设计的散转程设计的散转程序就是一种典型的分支程序。序就是一种典型的分支程序。4. 4. 查表程序设计查表程序设计 所谓查表法,就是对一些复杂的函数运算,例如所谓查表法,就是对一些复杂的函数运算,例如sinxsinx和和x+xx+x等,事等,事先把其全部可能范围的函数值按一定规律编成表格存放在计算机的程序先把其全部可能范围的函数值按一定规律编成表格存放在计算机的程

36、序存储器(一般为只读存储器)中。当用户程序中需要用到这些函数时,存储器(一般为只读存储器)中。当用户程序中需要用到这些函数时,直接按编排好的索引值(或程序号)寻找答案。这种方法节省了运算步直接按编排好的索引值(或程序号)寻找答案。这种方法节省了运算步骤,使程序更简便,执行速度更快。在控制应用场合或在智能化仪器仪骤,使程序更简便,执行速度更快。在控制应用场合或在智能化仪器仪表中,经常使用查表法。表中,经常使用查表法。 查表法唯一不足之处是它要占用较多的存储单元,但随着存储器价查表法唯一不足之处是它要占用较多的存储单元,但随着存储器价格的大幅度下降,这己成了微不足道的小问题,所以查表法的应用越来格

37、的大幅度下降,这己成了微不足道的小问题,所以查表法的应用越来越广泛。越广泛。 为了便于实现查表功能,在为了便于实现查表功能,在MCS-51MCS-51单片机的汇编语言中专门设置了单片机的汇编语言中专门设置了如下两条查表指令如下两条查表指令( (都为单字节指令):都为单字节指令):MOVC AMOVC A,A+DPTR A+DPTR ;(;(A+DPTRA+DPTR) A AMOVC A, A+PC MOVC A, A+PC ; PC+1PCPC+1PC,(,(A+PCA+PC)AA 此两条指令是以此两条指令是以DPTRDPTR或或PCPC作为基址寄存器,作为基址寄存器,A A作为变址寄存器进行

38、作为变址寄存器进行查表。查表。例例1 1,设计一个将十六进制数转换成,设计一个将十六进制数转换成ASCIIASCII码的子程序。设十六进制码的子程序。设十六进制 数存放在数存放在R0R0中的低中的低4 4位,要求将转换后的位,要求将转换后的ASCIIASCII码送回码送回RORO中。中。解:已知解:已知0-90-9的的ASCIIASCII码为码为30H-39H30H-39H,A-FA-F的的ASCIIASCII码为码为41H-46H41H-46H。根据。根据题意,程序的入口、出口都在题意,程序的入口、出口都在R0R0中。程序如下:中。程序如下:地址地址 机器码机器码 ORG 2160HORG

39、2160H2160H E8 MOV A2160H E8 MOV A,R0R02161H 54 OF ANL A2161H 54 OF ANL A,#OFH #OFH ;保留低;保留低4 4位位( (逻辑与即逻辑乘逻辑与即逻辑乘).).2163H 24 02 ADD A,#02 2163H 24 02 ADD A,#02 ;变址调整;变址调整(2168H-2166H=02H).(2168H-2166H=02H).2165H 83 2165H 83 MOVC A,A+PCMOVC A,A+PC ;查表获得;查表获得ASCIIASCII码码. .2166H F8 MOV R0,A2166H F8 M

40、OV R0,A2167H 22 RET2167H 22 RET2168H 30 31 32 TAB: DB 30H,31H,32H2168H 30 31 32 TAB: DB 30H,31H,32H216BH 33 34 35 DB 33H,34H,35H216BH 33 34 35 DB 33H,34H,35H216EH 36 37 38 DB 36H,37H,38H216EH 36 37 38 DB 36H,37H,38H2171H 39 41 42 DB 39H,41H,42H2171H 39 41 42 DB 39H,41H,42H2174H 43 44 45 46 DB 43H,44

41、H,45H,46H2174H 43 44 45 46 DB 43H,44H,45H,46H 在本程序中,因为在本程序中,因为“MOVC AMOVC A,A+PC”A+PC”指令与表格首址指令与表格首址相隔两个字节,故变址调整值为相隔两个字节,故变址调整值为2 2。例如,当。例如,当R0R0中原值为中原值为0707,则执行则执行“MOVC AMOVC A,A+PC”A+PC”指令后指令后PCPC内容为内容为2166H2166H,加,加A A值后值后即得所寻地址为:即得所寻地址为:2165+1+07+02=216F2165+1+07+02=216F,216F216F对应表格中的对应表格中的数值为数

42、值为37H37H。 此例中,表中存储的数值都是此例中,表中存储的数值都是单字节单字节的,但在实际实用的,但在实际实用中表中的数可能是中表中的数可能是多字节多字节的。对于多字节表格的查表程序设的。对于多字节表格的查表程序设计见下例:计见下例:例例 2 2 , 某 智 能 化 仪 器 的 键 盘 程 序 中 , 根 据 命 令 的 键 值, 某 智 能 化 仪 器 的 键 盘 程 序 中 , 根 据 命 令 的 键 值 (0,1,2,90,1,2,9)转换成相应的双字节)转换成相应的双字节1616位命令操作入口位命令操作入口 地址。设键值存放在地址。设键值存放在20H20H单元中,出口地址高字节入

43、存单元中,出口地址高字节入存 放在放在22H22H中,低字节放在中,低字节放在23H23H中。中。 键值与对应入口地址关系如下:键值与对应入口地址关系如下: 键值键值 0 1 2 3 40 1 2 3 4 入口地址入口地址 0123 0186 0234 0316 0415 0123 0186 0234 0316 0415 键值键值 5 6 7 8 9 5 6 7 8 9 入口地址入口地址 0520 0626 0710 0818 09290520 0626 0710 0818 0929解:根据题意,编写的子程序如下:解:根据题意,编写的子程序如下:地址地址 机器码机器码 ORG 2200HORG

44、 2200H2200H 90 22 11 MOV DPTR,#TAB 2200H 90 22 11 MOV DPTR,#TAB ;指向表首;指向表首2212H2212H,先指向,先指向 键入口地址的高键入口地址的高8 8位位. . 22DPH 22DPH,12DPL12DPL2203H E5 20 MOV A,20H 2203H E5 20 MOV A,20H ;取键值;取键值, ,键值放在键值放在20H20H中中. .2205H 23 RL A 2205H 23 RL A ;键值乘;键值乘2 2作查表偏移量作查表偏移量. . 如键值为如键值为3,000000113,00000011左移左移

45、一位,则为一位,则为00000110,00000110,为为6.6.2206H F5 20 MOV 20H,A 2206H F5 20 MOV 20H,A ;暂存偏移量;暂存偏移量. .2208H 93 2208H 93 MOVC A,A+DPTRMOVC A,A+DPTR ;取高;取高8 8位地址,若键值为位地址,若键值为 3 3,则,则6+2212=2218H.6+2212=2218H.2209H F5 22 MOV 22H,A 2209H F5 22 MOV 22H,A ;暂存高;暂存高8 8位地址位地址. .220BH A3 INC DPTR 220BH A3 INC DPTR ;指向

46、表首低;指向表首低8 8位,位, DPTR=2212+1=2213H.DPTR=2212+1=2213H.220CH E5 20 MOV A,20H 220CH E5 20 MOV A,20H ;取偏移量;取偏移量. .220EH 93 220EH 93 MOVC A,A+DPTRMOVC A,A+DPTR ;取低;取低8 8位地址,若键值为位地址,若键值为 3 3,则,则6+2213=2219H.6+2213=2219H.220FH F5 23 MOV 23H,A 220FH F5 23 MOV 23H,A ;暂存低;暂存低8 8位地址位地址. .2211H 22 RET2211H 22 R

47、ET2212H TAB: DB 01,23H 2212H TAB: DB 01,23H ;“0”0”键入口地址键入口地址 DB 01,86H DB 01,86H ;“1”1”键入口地址键入口地址 DB 02,34H DB 02,34H ;“2”2”键入口地址键入口地址 DB 03,16H DB 03,16H ;“3”3”键入口地址键入口地址 DB 04,15H DB 04,15H ;“4”4”键入口地址键入口地址 DB 05,20H DB 05,20H ;“5”5”键入口地址键入口地址 DB 06,26H DB 06,26H ;“6”6”键入口地址键入口地址 DB 07,10H DB 07,1

48、0H ;“7”7”键入口地址键入口地址 DB 08,18H DB 08,18H ;“8”8”键入口地址键入口地址 DB 09,29H DB 09,29H ;“9”9”键入口地址键入口地址 此例中,表中存储的数值为键值对应的入口地址,此入口地址为此例中,表中存储的数值为键值对应的入口地址,此入口地址为双字节的,故要把键值乘双字节的,故要把键值乘2 2作查表偏移量。作查表偏移量。5. 5. 子程序设计子程序设计 在实际问题中,常常会遇到在一个程序中有许多相同的运算或操在实际问题中,常常会遇到在一个程序中有许多相同的运算或操作,如果每遇到这些运算或操作都从头编起,则使程序非常繁琐且浪作,如果每遇到这

49、些运算或操作都从头编起,则使程序非常繁琐且浪费内存。因此,在实际应用中通常把这种多次使用的程序段按一定结费内存。因此,在实际应用中通常把这种多次使用的程序段按一定结构编好,存放在内存中,当需要时,程序可以去调用这些独立的程序构编好,存放在内存中,当需要时,程序可以去调用这些独立的程序段。通常将这种可以被调用的程序段称为段。通常将这种可以被调用的程序段称为子程序子程序;调用子程序的程序;调用子程序的程序称为称为主程序主程序。使用子程序的过程,称为。使用子程序的过程,称为调用子程序调用子程序;子程序执行完后;子程序执行完后返回主程序的过程称为返回主程序的过程称为子程序返回子程序返回。 在编写子程序

50、时要注意以下几点:在编写子程序时要注意以下几点:(1 1)建立子程序入口:通常是给每一个子程序赋一个名字,此名)建立子程序入口:通常是给每一个子程序赋一个名字,此名 字实际上是一个入口地址的代号。字实际上是一个入口地址的代号。(2 2)调用子程序时要注意保护现场;子程序返回时要注意恢复现)调用子程序时要注意保护现场;子程序返回时要注意恢复现 场。场。( (保护或恢复断点是单片机根据调用或返回指令自动完成保护或恢复断点是单片机根据调用或返回指令自动完成 的;而保护或恢复现场需编程者用的;而保护或恢复现场需编程者用PUSHPUSH和和POPPOP指令编程来实现。指令编程来实现。) )(3 3)为了

51、使子程序具有一定的通用性,子程序中的操作对象应尽)为了使子程序具有一定的通用性,子程序中的操作对象应尽 量用地址或寄存器形式,而不用立即数形式。量用地址或寄存器形式,而不用立即数形式。 主程序调用子程序主程序调用子程序是通过子程序调用指令是通过子程序调用指令“LCALL addr16”LCALL addr16”和和“ACALL addr11”ACALL addr11”来实现的。子程序调用指令的功能是将来实现的。子程序调用指令的功能是将PCPC中的内中的内容(调用指令的下一条指令的首地址,即断点)压入堆栈(即保护容(调用指令的下一条指令的首地址,即断点)压入堆栈(即保护断点),然后将调用地址送入

52、断点),然后将调用地址送入PCPC,使程序转入子程序的入口地址。,使程序转入子程序的入口地址。 子程序的返回子程序的返回是通过返回指令是通过返回指令RETRET实现的,这条指令的功能是实现的,这条指令的功能是将堆栈中存放的返回地址(即断点)弹出堆栈,送回到将堆栈中存放的返回地址(即断点)弹出堆栈,送回到PCPC中,使程中,使程序继续从断点处执行。序继续从断点处执行。 子程序嵌套:子程序嵌套:在子程序在执行过程中还可以调用另一个子程序。在子程序在执行过程中还可以调用另一个子程序。子程序嵌套的次数从理论上说是无限的,但实际上,由于受堆栈深子程序嵌套的次数从理论上说是无限的,但实际上,由于受堆栈深度

53、的限制,嵌套次数是有限的。度的限制,嵌套次数是有限的。例,用程序实现例,用程序实现c=ac=a2 2+b+b2 2。设。设a a、b b均小于均小于1010。a a存在存在31H31H单元中,单元中,b b存在存在 32H32H单元中,把单元中,把c c存入存入33H33H单元。单元。解:因本题两次用到平方值,所以在程序中采用把求平方的程序段解:因本题两次用到平方值,所以在程序中采用把求平方的程序段 编为子程序的方法。根据题意编写主程序和子程序如下:编为子程序的方法。根据题意编写主程序和子程序如下:主程序:主程序:地址地址 机器码机器码 0RG 2200H0RG 2200H2200H 75 8

54、1 3F MOV SP2200H 75 81 3F MOV SP,#3FH #3FH ;设堆栈指针初值;设堆栈指针初值2203H E5 31 MOV A2203H E5 31 MOV A,31H 31H ;取;取a a值值2205H 12 24 00 LCALL SQR 2205H 12 24 00 LCALL SQR ;求;求a a2 2 2208H F9 MOV R1,A ; a2208H F9 MOV R1,A ; a2 2值暂存值暂存R1R12209H E5 32 MOV A2209H E5 32 MOV A,32H 32H ;取;取b b值值220BH 12 24 00 LCALL

55、SQR 220BH 12 24 00 LCALL SQR ;求;求b b2 2 22OEH 29 ADD A,R1 22OEH 29 ADD A,R1 ;求;求a a2 2+b+b2 2 220FH F5 33 MOV 33H,A 220FH F5 33 MOV 33H,A ;存入;存入33H33H SJMP $ SJMP $子程序:子程序:地址地址 机器码机器码 0RG 2400H0RG 2400H2400H 04 SQR2400H 04 SQR:INC A ;2403H-2402H=1,INC A ;2403H-2402H=1,故故A A要加要加1 12401H 83 2401H 83 M

56、OVC AMOVC A,A+PCA+PC2402H 22 RET2402H 22 RET2403H 01 4 09 16 TAB: DB 0,1,4,9,162403H 01 4 09 16 TAB: DB 0,1,4,9,162408H 25 36 49 DB 25,36,492408H 25 36 49 DB 25,36,49240BH 64 81 DB 64,81240BH 64 81 DB 64,81 下面说明堆栈内容在执行程序过程中的变化:当程序执行完第一条下面说明堆栈内容在执行程序过程中的变化:当程序执行完第一条“LCALL SQR”LCALL SQR”指令时,断点地址为指令时,断点地址为2208H2208H,此时,此时0808压入压入40H40H,22H22H压入压入41H4

温馨提示

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

评论

0/150

提交评论