《四单片机原理及接口技术》由会员分享,可在线阅读,更多相关《四单片机原理及接口技术(56页珍藏版)》请在金锄头文库上搜索。
1、第4章 MCS-51汇编语言程序设计 汇编语言是面向机器硬件的语言,要求程序设计者对MCS- 51单片机具有很好的“软、硬结合”的功底。 介绍程序设计的基本知识及如何使用汇编语言来进行基本 的程序设计。 4.1 汇编语言程序设计概述 4.1.1 机器语言、汇编语言和高级语言 用于程序设计的语言基本上分为3种:机器语言、汇编语言 和高级语言。 1.机器语言 二进制代码表示的指令、数字和符号简称为机器语言 不易懂,难记忆,易出错。 2汇编语言 英文助记符表示的指令称为符号语言或汇编语言 将汇编语言程序转换成为二进制代码表示的机器语言程序 称为编译程序 经编译程序“翻译”得到的机器语言程序称为目标程
2、序,原 来的汇编语言程序称为源程序。 汇编语言特点: (1)面向机器的语言,程序设计员须对MCS-51的硬件有 相当深入的了解。 (2)助记符指令和机器指令一一对应,用汇编语言编写的 程序效率高,占用存储空间小,运行速度快,用汇编 语言能编写出最优化的程序。 能直接管理和控制硬件设备(功能部件),它能处理中断 ,也能直接访问存储器及I/O接口电路。 汇编语言和机器语言都脱离不开具体机器的硬件,均是面 向“机器”的语言,缺乏通用性。 3高级语言 不受具体机器的限制,使用了许多数学公式和数学计算上的 习惯用语,非常擅长于科学计算。常用的如BASIC、 FORTRAN以及C语言等。 高级语言优点:通
3、用性强,直观、易懂、易学,可读性好 。 使用C语言(C51)、PL/M语言来进行MCS-51的应用程序 设计。 对于程序的空间和时间要求很高的场合,汇编语言仍是必 不可缺的。 在很多需要直接控制硬件的应用场合,则更是非用汇编语 言不可 使用汇编语言编程,是单片机程序设计的基本功之一 4.1.2 汇编语言语句的种类和格式 两种基本类型:指令语句和伪指令语句 (1)指令语句 已在第3章介绍 每一条指令语句在汇编时都产生一个指令代码机器代 码 (2)伪指令语句 是为汇编服务的。在汇编时没有机器代码与之对应。 MCS-51的汇编语言的四分段格式如下: 标号字段 操作码字段 操作数字段 注释字段 规则:
4、 (1)标号字段和操作字码段之间要有冒号“:”相隔; (2)操作码字段和操作数字段间的分界符是空格; (3)双操作数之间用逗号相隔; (4)操作数字段和注释字段之间的分界符用分号“;”相隔 。 操作码字段为必选项,其余各段为任选项。 例4-1 下面是一段汇编语言程序的四分段书写格式 标号字段 操作码字段 操作数字段 注释字段 START: MOV A,#00H ;0A MOV R1,#10 ;10R1 MOV R2,#00000011B ;3R2 LOOP:ADD A,R2 ;(A)+(R2)A DJNZ R1,LOOP;R1内容减1不 ;为零,则循环 NOP HERE: SJMP HERE
5、基本语法规则: 1标号字段 是语句所在地址的标志符号 (1)标号后边必须跟以冒号“:” (2)由18个ASCII字符组成 (3)同一标号在一个程序中只能定义一次 (4)不能使用汇编语言已经定义的符号作为标号 2操作码字段 是汇编语言指令中唯一不能空缺的部分。汇编程序就是根 据这一字段来生成机器代码的。 3操作数字段 通常有单操作数、双操作数和无操作数三种情况。如果是 双操作数,则操作数之间,要以逗号隔开。 (1)十六进制、二进制和十进制形式的操作数表示 采用十六进制形式来表示 ,某些特殊场合才采用二进制或 十进制的表示形式 。 十六进制,后缀“H” 。 二进制,后缀“B” 。 十进制,后缀“D
6、”,也可省略。 若十六进制的操作数以字符AF中的某个开头时,则需在 它前面加一个 “0”,以便在汇编时把它和字符AF区别 开来。 (2)工作寄存器和特殊功能寄存器的表示 采用工作寄存器和特殊功能寄存器的代号来表示,也可用 其地址来表示。 例如,累加器可用A(或Acc)表示。也可用0E0H来表示 ,0E0H为累加器A的地址。 (3)美元符号$的使用 用于表示该转移指令操作码所在的地址。例如,如下指令 : JNB F0, $ 与如下指令是等价的: HERE:JNB F0,HERE 再如: HERE:SJMP HERE 可写为: SJMP $ 4注释字段 必须以分号“;”开头,换行书写,但必须注意也
7、要以分号“ ;”开头。 汇编时,注释字段不会产生机器代码。 4.1.3 伪指令 在MCS-51 汇编语言源程序中应有向汇编程序发出的指示 信息,告诉它如何完成汇编工作,这是通过使用伪指令 来实现的。 也称为汇编程序控制命令。只有在汇编前的源程序中才有 伪指令。经过汇编得到目标程序(机器代码)后,伪指 令已无存在的必要,所以“伪”体现在汇编时,伪指令没 有相应的机器代码产生。 常用的伪指令: 1.ORG(ORiGin)汇编起始地址命令 在汇编语言源程序的开始,通常都用一条ORG伪指令 来实现规定程序的起始地址。例如: ORG 2000H START:MOV A,#00H 规定标号START代表地
8、址为2000H开始。 在一个源程序中,可多次使用ORG指令,来规定不同 的程序段的起始地址。但是,地址必须由小到大排 列,地址不能交叉、重叠。例如: ORG 2000H ORG 2500H ORG 3000H 2. END(END of assembly)汇编终止命令 汇编语言源程序的结束标志,用于终止源程序的汇编工 作。在整个源程序中只能有一条END命令,且位于程 序的最后。 3DB(Define Byte)定义字节命令 在程序存储器的连续单元中定义字节数据。 ORG 2000H DB 30H,40H,24,“C”,“B” 汇编后: (2000H)=30H (2001H)=40H (2002
9、H)=18H(10进制数24) (2003H)=43H(字符“C”的ASCII码) (2004H)=42H(字符“B”的ASCII码) DB功能是从指定单元开始定义(存储)若干个字节, 10进制数自然转换成16进制数,字母按ASCII码存 储。 4DW(Define Word)定义数据字命令 从指定的地址开始,在程序存储器的连续单元中定义16位 的数据字。例如: ORG 2000H DW 1246H,7BH,10 汇编后: (2000H)=12H;第1个字 (2001H)=46H (2002H)=00H;第2个字 (2003H)=7BH (2004H)=00H;第3个字(2005H)=0AH
10、(2005H)=0AH 5EQU(EQUate)赋值命令 用于给标号赋值。赋值以后,其标号值在整个程序有效。 例如: TEST EQU 2000H 表示标号TEST=2000H,在汇编时,凡是遇到标号TEST时 ,均以2000H来代替。 4.1.4 汇编语言程序设计步骤 (1)分析问题,确定算法 (2)根据算法,画出程序框图 (3)分配内存工作区及有关端口地址 (4)编写程序 养成在程序的适当位置上加上注释的好习惯。 (5)上机调试 编写完毕的程序,必须“汇编”成机器代码,才能调试和运 行,调试与硬件有关程序还要借助于仿真开发工具并与 硬件连接。 4.2 汇编语言源程序的汇编 汇编语言源程序
11、“翻译”成机器代码(指令代码)的过程称 为“汇编”。汇编可分为手工汇编和机器汇编两类。 4.2.1 手工汇编 人工查表翻译指令。但遇到的相对转移指令的偏移量的计 算,要根据转移的目标地址计算偏移量,不但麻烦,且 容易出错。 4.2.2 机器汇编 用编辑软件进行源程序的编辑。编辑完成后,生成一 个ASCII码文件,扩展名为“.ASM”。然后在微计算 机上运行汇编程序,把汇编语言源程序翻译成机器 代码。 MCS-51单片机应用程序的完成,应经过三个步骤; (1)在微计算机上,运行编辑程序进行源程序的输入 和编辑; (2)对源程序进行交叉汇编得到机器代码; (3)通过微计算机的串行口(或并行口)把机
12、器代码传送 到用户样机(或在线仿真器)进行程序的调试和运行。 第(1)步,只需在微计算机上使用通用的编辑软件即可完 成。 第(2)步的交叉汇编所用的汇编程序可在购买单片机的仿 真开发工具时,由厂商提供。 第(3)步骤的实现要借助于单片机仿真开发工具进行。 反汇编分析现成产品的程序,要将二进制的机器代码 语言程序翻译成汇编语言源程序。 4.3 汇编语言实用程序设计 4.3.1 汇编语言程序的基本结构形式 常采用以下几种基本结构: 顺序结构、分支结构和循环结构,再加上广泛使用的子程序和 中断服务子程序。 1顺序结构 2分支结构 程序中含有转移指令, 无条件分支,有条件分支。 有条件分支又分为:单分
13、支结构和多分支结构。 3循环结构 4子程序 5中断服务子程序 4.3.2 子程序的设计 一、子程序设计原则和应注意的问题 一种能完成某一特定任务的程序段。其资源要为所有调用 程序共享。因此,子程序在结构上应具有独立性和通用 性,在编写子程序时应注意以下问题: 1子程序的第一条指令的地址称为子程序的入口地址。该 指令前必须有标号。 2主程序调用子程序 两条子程序调用指令: (1)绝对调用指令:ACALL addr11 (2)长调用指令:LCALL addr16 3注意设置堆栈指针和现场保护 4最后一条指令必须是RET指令 5子程序可以嵌套,即子程序可以调用子程序 6在子程序调用时,还要注意参数传
14、递的问题 二、 子程序的基本结构 MAIN: ;MAIN为主程序或调用程序标号 LCALL SUB ;调用子程序SUB SUB:PUSH PSW;现场保护 PUSH ACC; 子程序处理程序段 POP ACC;现场恢复 POP PSW; RET;最后一条指令必须为RET 例4-1 假设两个双字节无符号数,分别存放在R1R0和R3R2 中,高字节在前,低字节在后。编程使两数相加,和数存放 回R2R1R0中。 解:此为简单程 序,求和的方法 与笔算类同,先 加低位,后加高 位,无须画流程 图。 ORG1000H CLRC MOVA,R0;取被加数低字节至A ADDA,R2;与加数低字节相加 MOV
15、R0,A;存和数低字节 MOVA,R1;取被加数高字节至A ADDCA,R3;与加数高字节相加 MOVR1,A;存和数高字节 MOVA,#0 ADDCA,#0;加进位位 MOVR2,A;存和数进位位 END 4.3.3 查表程序设计 数据补偿、修正、计算、转换等各种功能,具有程序简单 、执行速度快等优点。 查表就是根据自变量x,在表格中寻找y,使y=f(x)。 执行查表指令时,发出读程序存储器选通脉冲/PSEN。在 MCS-51的指令系统中,给用户提供了两条极为有用的 查表指令: MOVC A,A+DPTR MOVC A,A+PC 指令“MOVC A,A+DPTR”完成把A中的内容作为一个 无符号数与DPTR中的内容相加,所得结果为某一程序