MCS-51单片机汇编语言程序设计
Posted 学工科的皮皮志^_^
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MCS-51单片机汇编语言程序设计相关的知识,希望对你有一定的参考价值。
文章目录
前言
MCS-51单片机的编程语言可以是汇编语言也可以是高级语言(如C语言)。
高级语言编程快捷,但程序长,占用存储空间大,执行慢;
汇编语言产生的目标程序简短,占用存储空间小,执行快,能充分发挥计算机的硬件功能。
无论是高级语言还是汇编语言,源程序都要转换成目标程序(机器语言)单片机才能执行。
目前很多公司将编辑器、汇编器、编译器、连接/定位器、符号转换程序做成集成软件包,用户进入该集成环境,编辑好程序后,只需点击相应菜单就可以完成上述的各步,如KEIL 集成软件。
一、汇编的方法
1.手工汇编:
人工查指令表,查出程序中每条指令对应的机器代码。早期的计算机使用。
2.机器汇编:
用计算机中的汇编程序对用户源程序进行汇编。
用机器汇编要提供给汇编一些信息,遵循汇编程序的一些约定(这些由伪指令指定)。
1)确定程序中每条汇编语言指令的指令机器码
2)确定每条指令在存储器中的存放地址
3)提供错误信息
4)提供目标执行文件(.OBJ/.HEX)和列表文件(*.LST)
二、伪指令
一、汇编语言指令类型
- 机器指令:指令系统中的全部指令。每条机器指令都有对应的机器代码,可以被CPU执行。
- 伪指令: 汇编控制指令,没有指令代码,只用于汇编过程,为汇编程序提供汇编信息。
二.伪指令 常用伪指令及功能
1.起始指令 ORG nn
功能:定义程序或数据块的起始地址。指示此语句后面的程序或数据块以nn为起始地址,连续存放在程序存储器中。
指令地址 机器码 源程序
ORG 2000H
2000H 78 30 MAIN: MOV R0,#30H
2002H E6 MOV A,@R0
2.字节定义 标号: DB(字节常数,或字符或表达式)
功能:指示在程序存储器中以标号为起始地址的单元里存放的数为字节数据(八位二进制数)。
例如:
LN:DB 32,’C’,25H,-1;
LN~LN+2 地址单元依次存放20H , 43H , 25H ,FFH
- 字定义 标号:DW (字常数或表达式)
作用: 指示在程序存储器中以标号为起始地址
的单元里存放的数为字数据(即16位的二进制数)
例如:
GH :DW 1234H,5678H,08
4.保留字节 标号:DS (数值表达式)
作用: 指示在程序存储器中保留以标号为起始地
址的若干字节单元,其单元个数由数值表达式指定。
例如 L1:DS 32 ; 从L1地址开始保留32个存储单元。
- 位定义 标号 BIT [位地址]
作用: 同EQU指令,不过定义的是位操作地址。
例如 AIC BIT P1.1。
7.汇编结束 END
作用: 指示源程序段结束。
END指令放在程序的最后。
三、汇编语言程序设计步骤
一.确定方案和计算方法
二.了解应用系统的硬件配置、性能指标
三.建立系统数学模型,确定控制算法和操作步骤
四.合理分配存储器单元和了解I/O接口地址
五. 编制源程序
1.按功能设计程序,明确各程序之间的相互关系
2. 用流程图表示程序结构和功能
3.程序中用注释说明指令在程序中的作用,方便阅读、调试和修改
四、常用的顺序结构
顺序程序
分支程序
循环程序
子程序
1、 顺序程序设计
顺序程序(简单程序),程序走向只有一条路径
例1:编程将外部数据存储器的000EH和000FH单元的内容相换
分析: 外部数据存储器的数据操作只能用MOVX指令,且只能和A之间传送,因此必须用一个中间环节作暂存,设用20H单元。使用DPTR指示地址。编程过程如下:
MOV DPTR, #000EH
MOVX A, @DPTR
MOV R0, A
MOV DPTR, #000FH
MOVX A, @DPTR
XCH A, R0
MOVX @DPTR, A
MOV A,R0
MOV DPTR, #000EH
MOVX @DPTR, A
2 、 分支程序的设计
由条件转移指令构成程序判断框部分,形成分支结构
一个判断决策框,两种分支结构图。
例1 求8位有符号数的绝对值,数据存放在A中。
ORG 0000H
MOV A,R2
JNB ACC.7,N ;为正数?
CPL A ;负数变补
INC A
MOV R2,A
N: SJMP $ ;结束
3 、 多分支散转程序的设计
情况一:该类分支程序根据不同的输入条件或不同的运算结果,转向不同的处理程序,也称之为散转程序。这类程序通常利用
JMP @A+DPTR间接转移指令实现转移。有如下两种设计方法:
- 查转移地址表:
将转移地址列成表格,将表格的内容作转移的目标地址。 - 查转移指令表:
将转移到不同程序的转移指令列成表格,判断条件后查表,转到表中指令执行,下面举例说明。
五、 循环程序设计
循环程序的构成:
一、初始化部分
循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。
二、循环体
循环工作部分:需多次重复处理的工作
循环控制部分:
1.修改指针和循环控制变量。
2.检测循环条件:满足循环条件继续循环;否则退出循环。
三、结束部分
处理和保存循环结果。
四、 单重循环,简单循环结构:循环体中不套循环。
循环控制方法:计数控制、特征标志控制。
一、特征控制:设定循环结束标志实现循环控制。
二、 多重循环,循环体中套循环结构。以双重循环使用较多。
六、位操作程序设计
MCS-51单片机有着优异的位逻辑功能,可以方便的实现各种复杂的逻辑运算。这种用软件替代硬件的方法可以大大简化甚至完全不用硬件,但比硬件要多花运算时间。
能够进行位操作的区域之前我们已经说过了
大家只有记住这两张图就行了。其中的位寻址区,和特殊功能寄存器区
七、子程序
子程序:完成确定任务,并能为其他程序反复调用的程序段。要求子程序在结构上具有通用性和独立性.
子程序编写注意的问题:
① 子程序入口用标号作为子程序名,子程序调用:ACALL、LCALL ;
② 调用子程序之前设置好堆栈;
③ 用返回指令RET结束子程序,并保证堆栈栈顶为调用程序的返回地址
④ 子程序嵌套须考虑堆栈容量,即嵌套深度与堆栈区大小的问题
⑤ 注意子程序数据存储器的使用不要与主程序及其它子程序冲突
⑥提供足够的调用信息:
如:子程序名、子程序功能、入口参数和出口参数、子程序占用的硬件资源、子程序中调用的其他子程序名。
1、按子程序与主程序之间传递参数的方式分类。
入口参数:调用子程序之前,需要传给子程序的参数。
出口参数:子程序送回调用程序的结果参数。
设计子程序应满足通用性的要求,一般不针对具体数据编程。
如:1.子程序功能为求单字节数的立方:
A¬A3,入口参数和输出参数为A。
2.子程序功能为求单字节数的n次方: (41H)(42H)¬(40H)A,入口参数为(40H)和A,出口参数
为(42H)(41H)。
选用不同的参数传递方式。
1.寄存器传送参数
2.存储器传送参数
3.堆栈传送参数
总结
1、程序设计的关键在于指令熟悉和算法(思路)正确、清晰,对复杂的程序应先画出流程图。只有多做练习多上机调试,熟能生巧,才能编出高质量的程序。
2、伪指令是非执行指令,提供汇编程序以汇编信息,应正确使用。
以上是关于MCS-51单片机汇编语言程序设计的主要内容,如果未能解决你的问题,请参考以下文章