前面我们学过了汇编语言形式的指令系统,本章重点介绍汇编语言程序结构以及如何利用汇编语言指令进行程序设计的方法。
使用汇编语言设计一个程序大致上可分为以下几个步骤。
(1) 分析题意,明确要求。解决问题之前,首先要明确所要解决的问题和要达到的目的、技术指标等。
(2) 确定算法。根据实际问题的要求、给出的条件及特点,找出规律性,最后确定所采用的计算公式和计算方法,这就是一般所说的算法。算法是进行程序设计的依据,它决定了程序的正确性和程序的指令。
(3) 画程序流程图,用图解来描述和说明解题步骤。程序流程图是解题步骤及其算法进一步具体化的重要环节,是程序设计的重要依据,它直观清晰的体现了程序的设计思路。流程图是用预先约定的各种图形、流程线及必要的文字符号构成的
4) 分配内存工作单元,确定程序与数据区的存放地址。
(5) 编写源程序。流程图设计后,程序设计思路比较清楚,接下来的任务就是选用合适的汇编语言指令来实现流程图中每一框内的要求,从而编制出一个有序的指令流,这就是源程序设计。
(6) 程序优化。程序优化的目的在于缩短程序的长度,加快运算速度和节省存储单元。如恰当的使用循环程序和子程序结构,通过改进算法和正确使用指令来节省工作单元及减少程序执行的时间。
(7) 上机调试、修改和最后确定源程序。只有通过上机调试并得出正确结果的程序,才能认为是正确的程序。对于单片机来说,没有自开发的功能,需要使用仿真器或利用仿真软件进行仿真调试,修改源程序中的错误,直至正确为止。
伪指令语句
伪指令并不是真正的指令,也不产生相应的机器码,它们只是在计算机将汇编语言转换为机器码时,指导汇编过程,告诉汇编程序如何汇编。下面介绍一些MCS-51汇编程序常用的伪指令。
(1) 汇编起始伪指令ORG
格式:[标号:] ORG 16位地址
功能:规定程序块或数据块存放的起始地址。如:
ORG 8000H
START: MOV A ,#30H
……
该指令规定第一条指令从地址8000H单元开始存放,即标号START的值为8000H。
(2) 汇编结束伪指令END
格式:[标号:] END [表达式]
功能:结束汇编。
汇编程序遇到END伪指令后即结束汇编。处于END之后的程序,汇编程序不予处理。
例如:
ORG 2000H
START: MOV A ,# 00H
……
END START
表示标号START开始的程序段结束。
(3) 等值指令EQU
格式:字符名称 EQU 项
这里使用的“字符名称”不是标号,不能用“:”来作分隔符;其中的“项”可以是一个数值,也可以是一个已经有定义的名字或可以求值的表达式。该指令的功能是将一个数或特定的汇编符号赋予规定的字符名称。用EQU指令赋值以后的字符名称可以用作数据地址、代码地址、位地址或直接当作一个立即数使用。因此,给字符名称所赋的值可以是8位数,也可以是16位二进制数。
例如,
TEST EQU R0
MOV A,TEST
这里将TEST等值为汇编符号R0,在指令中TEST就可代替R0来使用。又例如,
AB EQU 16
DELY EQU 1234H
MOV A , AB
LCALL DELY
这里AB赋值以后当作直接地址使用,而DELY被定义为16位地址,是一个子程序的入口。使用EQU伪指令时必须先赋值,后使用;而不能先使用,后赋值。
(4) 定义字节指令DB
格式:[标号:] DB 8位二进制数表
DB命令是从指定的地址单元开始,定义若干个8位内存单元的内容。主要是在程序存储器的某一部分存入一组8位二进制数,或者是将一个数据表格存入程序存贮器。这个伪指令在汇编以后,将影响程序存贮器的内容。例如,
ORG 1000H
TAB; DB 23H,73, “6”, “B”
TABl: DB 110B
以上伪指令经汇编以后,将对从1000H开始的若干内存单元赋值:
(1000H)=23H (1001H)=49H
(1002H)=36H (1003H)=42H
(1004H)=06H
其中36H和42H分别是字符6和B的ASCII码,其余的十进制数(73)和二进制数(110B)也都换算为十六进制数了。
(5) 定义字命令 DW
格式:[标号:] DW 16位二进制数表
定义字命令 DW是从制定地址开始定义若干个16位数据。
一个16位数要占两个单元的存储器,其中高8位存入低地址单元,低8位存入高地址单元,例如,
ORG 1000H
TAB: DW 1234H , 0ABH , 10
汇编后:
(1000H) = 12H (1001H) = 34H
(1002H) = 00H (1003H) = ABH
(1004H) = 00H(1005H) = 0AH
DB、DW伪指令都只对程序存储器起作用,不能用来对数据存储器的内容进行赋值或进行其它初始化的工作。