51汇编语言程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章MCS-51汇编语言程序设计
重点及难点:
单片机汇编语言程序设计的基本概念、伪指令、单片机汇编语言程序的三种基本结构形式、常用汇编语言程序设计。
教学基本要求:
1、掌握汇编语言程序设计的基本概念;
2、掌握伪指令的格式、功能和使用方法;
3、掌握顺序结构、分支结构和循环结构程序设计的步骤和方法;
4、掌握常用汇编语言程序设计步骤和方法。
教学内容
§4.1汇编语言程序设计概述
一、汇编语言的特点
(1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。
(2)使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。
(3)汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。
(4)汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。
二、汇编语言的语句格式
[<标号>]:<操作码> [<操作数>];[<注释>]
三、汇编语言程序设计的步骤与特点
(1)建立数学模型
(2)确定算法
(3)制定程序流程图
(4)确定数据结构
(5)写出源程序
(6)上机调试程序
§4.2伪指令
伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。
MCS- 51常见汇编语言程序中常用的伪指令:
第四章MCS-51汇编语言程序设计91
1.ORG (ORiGin)汇编起始地址命令
[<标号:>] ORG <地址>
2.END (END of assembly)汇编终止命令
[<标号:>] END [<表达式>]
3.EQU (EQUate)赋值命令
<字符名称> EQU <赋值项>
4.DB (Define Byte)定义字节命令
[<标号:>] DB <8位数表>
5.DW (Define Word)定义数据字命令
[<标号:>] DW <16位数表>
6.DS (Define Stonage )定义存储区命令
[<标号:>] DW <16位数表>
7.BIT位定义命令
<字符名称> BIT <位地址>
8.DA TA数据地址赋值命令
<字符名称> DATA <表达式>
§4.3单片机汇编语言程序的基本结构形式
一、顺序程序
[例4-1]三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、5414和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。
MOV R0 ,# 52H ;被加数的低字节地址
MOV R1 ,# 55H ;加数的低字节地址
MOV A ,@ R0
ADD A ,@ R1 ;低字节相加
MOV @ R0 , A ;存低字节相加结果
DEC R0
DEC R1
MOV A ,@ R0
ADDC A ,@ R1 ;中间字节带进位相加
MOV @ R0 , A ;存中间字节相加结果
DEC R0
DEC R1
MOV A ,@ R0
ADDC A ,@ R1 ;高字节带进位相加
MOV @ R0 , A ;存高字节相加结果
CLR A
ADDC A , # 00H ;存放进位的单元地址 MOV @ R0 , A
;进位送00H 位保存
二、分支程序
1.单分支程序
[例4-2] 变量X 存放在V AR 单元内,函数值Y 存放在FUNC 单元中,试按下式的要求给Y 赋值。
⎪⎩
⎪⎨⎧<-=>=0
100
01X X X Y 本题的程序流程见图4-1(a )。 参考程序: ORG 1000H
V AR DA TA 30H FUNC DA TA 31H
MOV A , V AR ;A ← X
JZ DONE
;若X=0,则转DONE JNB ACC.7 , POSI ;若X>0,则转POSI MOV A , # 0FFH ;若X<0,则Y=-1 SJMP DONE
POSI : MOV A , # 01H ;若X>0,则Y = 1 DONE : MOVE FUNC , A ;存函数值 SJMP $ END
图4-1 例4-2的分支流程图
第四章MCS-51汇编语言程序设计93
这个程序的特征是先比较判断,然后按比较结果赋值,这实际是三分支而归一的流程图,因此,至少要用两个转移指令。初学者很容易犯的一个错误是:漏掉了其中的SJMP DONE 语句,因为流程图中没有明显的转移痕迹。
这个程序也可以按图4-1(b)的流程图来编写,其特征是先赋值,后比较判断,然后修改赋值并结束。
参考程序:
ORG 1000H
V AR DA TA 30H
FUNC DA TA 31H
MOV A ,V AR ;A ←X
JZ DONE ;若X=0,则转DONE
MOV R0 ,# 0FFH ;先设X<0,R0 = FFH
JNB ACC.7 ,NEG ;若X<0,则转NEG
MOV R0 ,# 01H ;若X>0,R0 = 1 NEG:MOV A ,# 01H ;若X>0,则Y = 1
DONE:MOV FUNC , A ;存函数值
SJMP $
END
2.多分支程序
图4-2 多分支程序转移
三、循环程序
循环程序一般由4部分组成:
(1)置循环初值,即确立循环开始时的状态。
(2)循环体(工作部分),要求重复执行的部分。
(3)循环修改,循环程序必须在一定条件下结束,否则就要变成死循环。
(4)循环控制部分,根据循环结束条件,判断是否结束循环。
以上4个部分可以有两种组织方式。
[例4-3]从BLOCK单元开始存放一组无符号数,一般称为一个数据块。数据块长度放在LEN单元,编写一个求和程序,将和存入SUM单元,假设和不超过8位二进制数。
在置初值时,将数据块长度置入一个工作寄存器,将数据块首地址送入另一个工作寄存器,一般称它为数据块地址指针。每做一次加法之后,修改地址指针,以便取出下一个数来相加,并且使计数器减1。到计数器减到0时,求和结束,把和存入SUM即可。