单片机原理及应用 蔡启仲 第4章 汇编语言程序设计_第1页
单片机原理及应用 蔡启仲 第4章 汇编语言程序设计_第2页
单片机原理及应用 蔡启仲 第4章 汇编语言程序设计_第3页
单片机原理及应用 蔡启仲 第4章 汇编语言程序设计_第4页
单片机原理及应用 蔡启仲 第4章 汇编语言程序设计_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

1、1第第4 4章章 汇编语言程序设计汇编语言程序设计单片机原理及应用2 2 第第4章章 目录目录4.1 单片机汇编语言程序设计概述单片机汇编语言程序设计概述 4.1.1 机器语言、汇编语言和C语言 4.1.2 汇编语言的特点4.2 伪指令伪指令4.3 汇编语言程序的基本结构形式汇编语言程序的基本结构形式 4.3.1 顺序程序 4.3.2 分支程序 4.3.3 循环程序 4.3.4 位操作程序34.4 汇编语言程序设计举例汇编语言程序设计举例 4.4.1 顺序程序设计 4.4.2分支程序设计 4.4.3 循环程序设计 4.4.4 子程序设计34n汇编语言的相关概念、汇编语言程序的基本结构形式、编汇

2、编语言的相关概念、汇编语言程序的基本结构形式、编写汇编语言程序的基本方法。写汇编语言程序的基本方法。目的:目的:由于汇编语言是面向机器硬件的语言,掌握汇编语言由于汇编语言是面向机器硬件的语言,掌握汇编语言 能够更好的理解单片机的内部结构和工作原理。能够更好的理解单片机的内部结构和工作原理。内容概要内容概要454 4.1 .1 单片机汇编语言程序设计概述单片机汇编语言程序设计概述4 4.1.1 .1.1 机器语言、汇编语言和机器语言、汇编语言和C C语言语言计算机所用的程序设计语言可以分为三类:机器语言,汇编语言,高级语言。1 1机器语言机器语言机器语言。也称为机器码机器码,是一种由二进制码“0

3、 0”、“1 1”组成的、能够被计算机直接识别和执行的语言。用机器语言表示的程序,又称目标程序目标程序。单片机程序设计中,不管采用高级语言还是汇编语言编写,最终下载到单片机芯片的HexHex文件或BinBin文件也都是二进制机器码。由于二进制代码较为冗长,通常用一位十六进制数来表示四位二进制数,即应用十六进制十六进制表示机器码。56 6例如例如,51单片机控制P1口实现流水灯效果的某Hex文件,用记事本打开该文件,可以看到如下几行机器码:图图4-14-1 5151控制控制P1P1口实现流水灯的机器码口实现流水灯的机器码从图41可以看出,机器码用十六进制数表示,但如果不通过指令表进行对照,难以看

4、出机器码与指令对应的关系,编写、修改和维护困难,容易出错,难以发现和排除错误。7 72 2汇编语言汇编语言为了解决机器语言难以编程和阅读的难题,应用汇编语言来表示机器语言,应用汇编语言编写程序的每一条指令与机器码一一对应。例如,图41的流水灯机器码的汇编程序为: MOV A, #0FEH ;对累加器A赋值,FEH=1111 1110B,最低位LED亮 START: RL A ;自定义代码段START,对A进行不带进位Cy的左循环移位 MOV P1,A ;将A的值送入P1口,点亮某个引脚的LED LCALL DELAY ;调用延时子程序 LJMP START ;跳转回START段,实现流水灯循环

5、亮灭的效果 DELAY: MOV R0, #00H ;自定义延时代码段,对寄存器R0赋值0,用于自减延时DELAY1:MOV R1, #00H ;R1赋值0,用于内循环自减延时 DJNZ R1, $ ;(R1)1R1,(R1)0原地跳转,循环256次 DJNZ R0, DELAY1 ;(R0)1R0,(R0)0转移到DELAY1,循环256次 RET ;返回主程序 END ;程序结束8 8用助记符表示的汇编语言比机器码容易学习和使用。自MCS51单片机诞生之日起,汇编语言就伴随着其它发展并获得了广泛应用。由于单片机不能直接识别和执行汇编语言编写的程序,需要将汇编语言源程序转换(翻译)为二进制的

6、机器码(目标程序),这一转换过程称为“汇编”,而用于转换的工具称为汇编程序,如图42所示。9 9其中,源文件是汇编语言编写的文件源文件是汇编语言编写的文件,默认后缀名为ASM;汇编程序为Keil、IAR等专门的编译工具,也称为编译器;目标程序是最终烧写到单片机芯片的Hex或Bin文件。图图4-24-2 源程序、汇编程序、目标程序的关系源程序、汇编程序、目标程序的关系103 3C51C51语言语言汇编语言面向机器,便于理解和熟悉微处理器的内部结构,存储区域的特点和特殊功能寄存器的功能,指令执行过程的基本工作原理,微处理器应用系统电路设计等。但是,汇编语言开发周期长、设计成本高,也不易于移植。为此

7、,人们将高级语言引入微处理器领域。目前基本采用C语言,例如51单片机的C51,MSP430的C430等。C51易学易用,成熟稳定,性能已经接近汇编语言,优化后的机器代码长度也能控制在汇编语言的1.21.5倍左右,网上的各种资源丰富,获得了市场和单片机爱好者的广泛认可,成为单片机应用系统设计的首选语言。101111当然,C51也并不能完全替代汇编语言。在对时间和空间要求较高的场合,汇编语言仍然是不可或缺的,例如,在典型的冒泡排序算法中,C51需要1033s,而汇编语言只需要376s,性能的差异依然不小。不少工程师为了保持单片机系统的最佳性能,采用C51与汇编进行混合编程的方法进行程序设计。另外,

8、即使是高级语言编写的源程序,经过程序的编译链接,产生绝对目标代码的Hex文件,对编译的Hex文件进行反编译后仍然是以汇编程序的形式出现的。12上面流水灯的Hex文件的反编译结果如下:地址标号 汇编程序 指令地址 指令代码 Q0000: MOV A, #0FEH ;0000 74 FE Q0002: RL A ;0002 23 MOV P1,A ;0003 F5 90 LCALL Q000B ;0005 12 00 0B LJMP Q0002 ;0008 02 00 02 Q000B: MOV R0, #00H ;000B 78 00 Q000D: MOV R1, #00H ;000D 79 0

9、0 DJNZ R1, $ ;000F D9 FE DJNZ R0, Q000D ;0011 D8 FA RET ;0013 22其中第四列为指令代码,即机器码(对应图4-1)。要真正掌握单片机技术,应该掌握汇编程序。C51请参阅第13章。12134 4.1.2 .1.2 汇编语言的特点汇编语言的特点(1)(1) 汇编语言比C51的学习和编程、调试的难度要大,因此多用 于编写4KB以下、运算不太复杂的小程序。(2)(2) 汇编语言程序占用的存储空间小,运行效率高。只有通过 汇编语言,才能写出性能最优的程序。(3)(3) 面向硬件,能够直接管理和控制硬件设备,例如对I/O接口、 存储器的访问等。(

10、4)(4) 与单片机内部结构紧密结合,例如累加器A、寄存器R0等。 掌握汇编语言才能更好的理解内部结构和工作原理。(5)(5) 依赖于机器硬件,缺乏通用性,程序难以移植。(6)(6) 高级语言一般用十进制编写,汇编语言多用十六进制来表 示二进制数。1314144.2 4.2 伪指令伪指令 第3章介绍的每条指令分别对应单片机能够执行的一个机器码。还有一类指令没有对应的机器码,不生成目标程序,也不影响程序的执行,仅用于对汇编过程进行某种控制或操作,这类指令称为伪指令。常用的伪指令有8条。15151 1ORGORG ORG用于定义起始地址,也就是紧随其后的程序段或数据块将被设置在所规定的起始地址。O

11、RG为origin(源点)的缩写。其格式为: ORG addr16 其中,addr16addr16表示程序存储器中的一个16位地址,一般是一个十六进制数,或者是定义好的标号。一个源程序中可以多次使用ORG指令,以表示不同程序段的起始位置。但是所规定的地址应该按照顺序从小到大,不能交叉或重叠。1616例例4141 ORG 1000HSTART:MOV A, 20H ORG 1500H NEXT:MOV R0, #30H当使用编译器汇编完这段程序后,就会自动把“MOV A, 20H”这条指令(双字节指令)放置在程序存储器中的地址为1000H和1001H单元中。START这个标号所表示的地址就是10

12、00H,而NEXT所在行的指令首地址是1500H。17172 2ENDEND END用于表示程序结束。整个源程序中只能有一条END命令,且应该位于程序的最后。如果END出现在源程序的中间,则后面的程序将会被编译器省略。 其格式为: END18183 3EQUEQUEQU用于赋值,equal(等于)的缩写,与C语言的#define类似,相当于“=”。其格式为:常量名 EQU 操作数/符号其中,操作数可以是8位、16位二进制数,也可以用十进制、十六进制表示。符号为其它的汇编符号。例例4242 X EQU 50;X等于50,十进制 Y EQU 1000H;Y等于1000H,十六进制BUTTON2 E

13、QU P1.0;BUTTON2等价于P1.0编译器进行汇编时,程序中所有的常量X就具有50的值,Y、BUTTON2同理。19194 4DATADATADATA用于赋值。其格式为:变量名 DATA 操作数/表达式例例4343 X DATA 2000H;X等于2000H编译器汇编时,程序中所有的变量X都用2000H代替。DATA的功能与EQU类似,但也存在以下区别:(1)(1)EQUEQU先定义才能使用,而DATA不受限制。也就是说EQU定义的是常量,DATA定义变量。(2)(2)EQUEQU可以把一个汇编符号赋给一个字符名,DATA不能。(3)(3)DATADATA可以将一个表达式的值赋给变量,

14、而EQU不能。(4)(4)DATADATA通常用于定义数据地址。20205 5DBDBDB用于从指定的地址单元开始,定义若干单字节内存单元的内容。其格式为:标号: DB 单字节操作数操作数可以是8位二进制、十进制、十六进制数值或ASCII码。例例4444 ORG 2000HDB 3, 41H, 0F7H, BDB “123Ac”编译器进行汇编后,存储单元的内容分别为:(2000H)=3 (2001H)=41H (2002H)=F7H(2003H)=42H (B) (2004H)=31H (1) (2005H)=32H (2)(2006H)=33H (3) (2007H)=41H (A) (20

15、08H)=63H (c)21216 6DWDWDW用于从指定的地址单元开始,定义若干双字节存储单元的内容。其格式为:标号: DW 双字节操作数双字节操作数是16位二进制数值、十进制和十六进制数值,或ASCII码,其中高8位存入低地址字节,低8位存入高地址字节。如果不足16位,则高位用0填充。例例4545 ORG 2000HTAB: DW 1234H,100,69H编译器进行汇编后,存储单元的内容分别为:(2000H)=12H (2001H)=34H (2002H)=00H(2003H)=64H (100)(2004H)=00H (2005H)=69H22227 7DSDSDS用于从指定的地址单

16、元开始,保留若干字节的存储单元作为备用。其格式为:标号: DS 操作数例例4646 ORG 0050HDS 06HDB 5AH编译器汇编后,从0050H开始保留6个字节的单元给程序备用,也就是占用了0050H0055H。而5AH存放在0056H存储单元。要注意的是,DB、DW、DS伪指令都只对程序存储器起作用,不能对数据存储器的内容进行赋值或初始化。23238 8BITBITBIT用于定义位常量,与EQU类似。有些编译器不具备BIT命令时,可以用EQU来代替BIT。其格式为:常量名 BIT 操作数/符号例例4747 flag BIT 20H key BIT P1.1编译器进行汇编后,位地址20

17、H赋值给flag,key作为P1.1使用。24244 4. .3 3 汇编语言程序的基本结构形式汇编语言程序的基本结构形式与高级语言一样,汇编语言程序设计中广泛应用结构化的程序设计方法。采用结构化设计的程序。按照结构化程序设计的方法,汇编语言程序一般有顺序、分支、循环等几种结构。三种结构的程序分别称为顺序程序、分支程序、循环程序,如图4-3所示。图图4-34-3 顺序程序、分支程序、循环程序顺序程序、分支程序、循环程序(a) (a) 顺序程序顺序程序(b) (b) 分支程序分支程序(c) (c) 循环程序循环程序25254.3.1 4.3.1 顺序程序顺序程序 按照指令的顺序逐条执行指令,也称

18、为简单程序或直线程序。按指令的排列顺序逐条执行,直到全部指令执行完毕。顺序程序主要使用数据传送指令和数据运算类指令。例例4848 对寄存器R1、R2、R3中存储的数据进行相加,结果存储到R4。MOV A, R1 ;R1的数据复制到累加器AADD A, R2 ;A与R2的数据相加,结果存储在AADDC A, R3 ;A与R3的数据进行带进位相加,结果存储在AMOV R4, A ;将A的数据复制到R426264.3.2 4.3.2 分支程序分支程序 根据不同条件转向不同的处理程序来改变程序执行的顺序,这种结构的程序称为分支程序。分支程序一般是利用条件转移指令来进行判断,通过转移指令的组合,可以形成

19、单分支、双分支、多路分支形式。常用的转移指令有JZ、JNZ、CJNE、JC、JNC、JB、JNB、JBC、DJNZ,多用于正负数判断、位单元状态判断、进借位判断、是否为“0”的判断、大小判断等。27274.3.3 4.3.3 循环程序循环程序 在一个程序段要重复多次运行的情况下,可以采用循环方法设计程序。循环程序主要有5个部分:(1)(1) 初始化部分:设置循环初值,包括循环变量计数、数据指针初 值,为循环作准备。(2)(2) 循环处理部分:重复执行的程序段,是循环程序的主体,称为 循环体。循环体可以是单条指令,也可以是复杂的程序段。(3)(3) 循环修改。每循环一次,就要修改循环次数、数据及

20、地址指针 等。(4)(4) 循环控制部分:控制循环的次数,为进行下一次循环修改计数 器和指针的值,并检查循环次数是否达到退出循环的条件。(5)(5) 循环结果处理:分析和存储结果。2828循环可以是单重循环和多重循环。如果在循环程序的循环体中不再包含循环程序,即为单重循环;如果在循环体中还包含有循环程序,这种现象就称为循环嵌套,这样的程序就称为多重循环程序。在多重循环中,内外循环不得交叉,也不允许从循环程序的外部跳入循环程序的内部。通常对循环初始化只执行一次,而对循环处理、循环控制可以执行多次。循环结构可以分为图44所示的两种形式:计数控制、条件控制。2929图图4-44-4 计数控制结构和条

21、件控制结构计数控制结构和条件控制结构(a) (a) 计数控制结构计数控制结构(b) (b) 条件控制结构条件控制结构30304.3.4 4.3.4 位操作程序位操作程序 C、C+、Java、C#、VB等主流高级语言主要面向8位或8位以上的数据处理,而检测和控制应用系统中常常需要对1位信息进行处理,51单片机提供了用于位操作的指令,位操作的指令主要有MOV(传送)、CLR(清0)、SETB(置1)、ANL(与)、ORL(或)、CPL(取反)、位单元状态的判断控制指令等。3131 例例4949 单片机应用系统上电和复位后常常要求测试单片机外部扩展各部件是否能够正常工作。编写程序,测试外部扩展RAM

22、的地址为4000H的存储单元是否损坏。MOV DPTR, #4000H ;设置要测试的外部RAM的地址MOV A, #55H ;55H作为测试数据MOV B, A ;(B)=55H,保存测试数据MOVX DPTR, A ;55H写入外部RAM的4000H存储单元中MOVX A, DPTR ;写入数据55H后,再读回数据AXRL A, B ;A、B各位进行异或,比较写入和读回 ;的数据是否一致JNZ BAD ;如果(A)(B),RAM可能已损坏,跳转 ;到BAD程序段3232位操作可以直接对P0、P1、P2、P3等端口的每个引脚进行单独控制,例如SETB P1.0将引脚P1.0置高电平,而CPL

23、 P1.0可以将P1.0输出的电平取反。位操作能够对内部RAM的20H2FH字节单元中的每个位单元,以及对特殊功能寄存器中能够进行位寻址的位单元进行单独控制。例例410410CLR 20H.3 ;对20 H.3 (位地址为03H)清零 MOV C, 40H ;将位地址为40H单元的内容送入进位位CYSETB RS0 CLR RS1 ;选择当前寄存器组为第一组(参见表22)33334 4. .4 4 汇编语言程序设计举例汇编语言程序设计举例汇编语言程序设计的一般步骤有:任务分析,确定算法,算法优化,设计程序流程图,分配字节单元和位单元及有关I/O端口,扩展部件的端口地址,编写程序并加上注释,仿真

24、调试,实物调试。在使用汇编语言进行程序设计的时候,要注意注意3 3个问题个问题:模模块化设计块化设计;循环程序循环程序;子程序子程序。模块化设计就是将一个复杂的任务划分为若干个模块(程序段),以提高程序的可读性、可靠性,使得程序层次更为清晰。循环程序能够大大减少对存储空间的占用。子程序可以增加程序段的可重用性,简化程序结构。34344.4.1 4.4.1 顺序程序设计顺序程序设计 顺序结构程序是一种最简单、最基本的程序,无分支,按照程序编写的顺序依次执行。 例例411411 编写程序,将外部RAM的8000H单元的内容传输到7FFFH单元。分析:51单片机外部扩展的存储器或部件与单片机内部寄存

25、器 或RAM之间的数据传送,必须通过累加器A来实现,外 部扩展的存储器的存储单元或部件相互之间的数据传输 也是如此。编程时,需要注意对16位地址指针DPTR的正 确设置。3535 ORG 0000H LJMP MAIN ;跳转至主程序执行, ;避开中断服务程序入口地址 ORG 0030H MAIN:MOV DPTR, #8000H ;16位地址值8000HDPTR MOVX A, DPTR ;存储单元(8000H)A MOV DPTR, #7FFFH ;地址指针DPTR指向7FFFH存储单元 MOVX DPTR, A ;A中的内容传输给7FFFH单元 SJMP $ END3636 例例4124

26、12 设某一变量的数据保存在片内RAM的20H单元中,取值范围为00H09H,编写查表程序,查出变量的平方值,并存入片内RAM的21H单元。 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV DPTR, #TAB ;平方值表的起始地址值DPTR MOV A, 20H ;需要求平方的值(20H)A MOVC A, A+DPTR ;(A)+(DPTR)组成平方值单元地址, ;单元内容A MOV 21H, A ;查表得到的平方值21H SJMP $ ;无限循环 TAB: DB 0,1,4,9,16,25,36,49,64,81 ;00H09H的十进制数平方值表 END3

27、737查表查表就是根据自变量自变量x x,在表格中找表格中找y y,使y=f(x)y=f(x)。x一般为连续变化的整数,将对应的y放置在一个线性表中,在需要的时候通过查表就能快速获取结果。查表方法广泛应用于显示、打印、数据转换,能够极大地加快程序执行的速度。例412的程序中,数据指针DPTR的地址值为TAB,即表格中存储数据0的单元地址值,指令SJMP $是一条空循环指令,单片机未作任何实质性工作,处于等待状态,该指令在编写有中断服务程序的主程序时是一条经常被使用的指令Q38384.4.2 4.4.2 分支程序设计分支程序设计 分支程序的结构有两种:双分支结构和多分支结构(散转分支结构)。图图

28、4-54-5 分支程序结构分支程序结构(a) (a) 双分支结构双分支结构(b) (b) 多分支结构多分支结构3939例例413413 设变量x以无符号数的形式存放在内部RAM的30H单元,变量y与x有如下关系:根据x的取值求出y,并将其存入内部RAM的31H单元。 0FH 0AH= 0AH =0AH 01H 0AH,Cy0; ;如果(A)0AH,则0FHA SJMP RESULT XIAOYU: MOV A, #01H ;因为(A)=x0AH,则01HA RESULT: MOV 31H, A ;31H(A) SJMP $ END注意有两条SJMP RESULT,否则31H中内容都会是0AH。

29、4141例413是用条件转移指令实现分支,下面介绍利用间接转移指令JMP来实现多分支程序转移(称为散转程序),通常有两种设计方法。(1) (1) 查转移地址表,用转移地址构成散转表,将表中的内容作为转移的目标地址。(2)(2) 查转移指令表,用转移到不同程序的转移指令构成散转表,判断条件后,转到表中指令执行。4242例例414414 试编写根据R7的内容转向对应的入口地址的程序,R7的内容为0n(n127),处理程序的入口地址为PR0PRn。分析分析:将PR0PRn的入口地址值列在一个表格中,每一个地址为16位地址值,占两个单元。假设PR0PRn入口地址表格的首地址为TAB,则PR0的高8位地址值在表格的首地址中,低8位地址值在首地址TAB+1的存储单元中;而PRx在表中的偏移量为2x,因此将R7的内容乘以2即得到PRx在表中的偏移地址,从偏移地址2x和2x+1两个单元分别取出PRx的高8位地址和低8位地址送至DPTR寄存器,将A清0,用JMP A+DPTR指令即转移到PRx入口地址。4343 利用转移地址表实现程序的转移 PR0 EQU 0110H PR1 EQU 0220H PR2 EQU 0330H

温馨提示

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

评论

0/150

提交评论