学习了指令系统后就可以编写一些简单的汇编程序。
一、汇编程序功能
汇编语言编写的程序不能直接被机器执行,需要翻译成机器码组成的目标程序,这个过程就是汇编。目标文件虽然已经是二进制文件,但它还不能直接运行,需要通过连接程序把目标文件和其他目标文件连接在一起形成可执行文件。这个文件才能在机器上运行。因此,要在计算机上运行汇编语言程序的步骤是:
(1)用编辑程序建立源文件asm;
(2)用汇编程序把asm文件转换成obj文件;
(3)用连接程序link把obj文件转换成exe文件;
(4)执行该程序。
二、汇编语言源程序的格式
汇编语言源程序有一定的书写格式。一般由左到右按序至少包括下列四项内容:
[名字]操作操作数[;注释]
名字项是指一个标号或变量。
操作项是一个操作码的助记符,它可以是指令、伪指令或宏指令名。
操作数项由一个或多个表达式组成,它提供为执行所要求的操作而需要的信息。操作数项可以是常数、寄存器、标号、变量或由表达式组成。
注释项用来说明程序或语句的功能。“;”为识别注释项的开始。“;”也可以从一行的第一个字符开始,此时整行都是注释,常用来说明下面一段程序的功能。
上面四项中带方括号的两项是可选项。各项之间必须用“空格”(space)或“水平制表”(tab)符隔开。
三、汇编程序设计的步骤与方法
1.汇编语言程序设计的基本步骤
对于一个单片机应用系统,在经过系统总体方案论证、硬件组成设计基本定型的基础上,即可着手应用软件的设计。一个完整的程序大致可以分为以下几个步骤:
(1)设计任务的分析、确定有关算法或思路
(2)程序总体设计
(3)编写汇编程序
(4)源程序的汇编与调试
以上所述的程序设计步骤仅仅为程序设计者建立一个完整的概念和过程。在实际的工作中应视应用软件的实际需求、程序量的大小和复杂程度等,选择合适的设计步骤和调试方法。
2.汇编语言程序设计方法
单片机汇编语言应用程序的设计方法可以说不拘一格,灵活多样。不仅与功能要求、规模、复杂程度有关,同时也与开发人员的经验和习惯相关。
3.汇编语言源程序的基本结构
一个单片机汇编语言应用程序,无论其简单还是复杂,总是由简单程序、分支程序、循环程序、查表程序、子程序(包括中段服务程序)等结构化的程序段有机的组合而成。这是程序设计的基础。
4.划分功能模块
对于一个功能单一的简单程序,一般按其功能要求及操作顺序,合理的选择上述结构化程序块,自始至终的由上而下一气呵成。
一个具有多种功能而较复杂的程序,则通常采用模块化设计方法。即按不同功能划分成若干功能相对独立程序模块,分别进行独立的设计和测试,最终装配成程序的整体,通过联调,完成程序的整体设计。
5.自顶而下逐步求精
自顶而下逐步求精的程序设计方法是首先设计主干程序,将从属的或者子程序等用程序标志或过渡程序代替,在主干程序完成的前提下再逐个充实从属程序段或子程序,使程序的生成逐步展开,逐步深化、求精,最后完成程序的设计。
6.子程序方式
近年来采用子程序的汇编语言程序设计较为普遍。这种设计方法的主导思想是将应用系统的多个主要功能,或者一个大的功能划分为若干个子程序。主程序完成对系统的初始化、各功能模块的子程序的调用等。
四、伪指令
汇编程序对用汇编语言写的源程序进行汇编时,还要提供一些汇编用的控制指令。这些指令在汇编时并不产生目标代码,不影响程序的执行,所以称为伪指令。常用的伪指令有:
1.org指令
org指令的语法为:orgexpression
这条指令用在一段源程序或数据块的前面,说明紧随在后面的程序段或数据块的起始地址。指令中的16位地址便是该起始地址值。
2.data指令
data指令的语法为:symboldataaddress
这条指令用于分配一个地址(范围为00h~0ffh)给某个特定的标识符。这个标识符不能被重定义。与data指令相近的还有bit、code、dseg、idata、xdata它们的作用都是定义一个标识符,使用的方式也与data类似,只是它们分配的地址范围与data不一样。
3.db指令
db指令的语法为:[label:]dbexpression[,expression...]
这条指令用于通知汇编程序用expression中的内容来初始化label开始的存储器单元。expression可以是单个字节数字、用逗号分隔开的字节串或用双引号所指示的字符串。方括号表示括号中的内容是可选的。
与db指令相近的还有dw、dd、ds,它们的作用都是用来定义代码段或者常数段内的数据,只是定义数据的大小不同。db是定义一个字节,dw、dd分别用来定义一个字以及双字,ds是在待存放的一定数量的存储单元前面定义应保留的存储器单元数
4.equ指令
equ指令的语法为:标号equ操作数
equ伪指令的功能是将操作数赋值于标号,使两边的两个量等值。
5.end指令
end指令的语法为:end
这条指令用在源程序的最后,表明源程序文件的结束,end指令后的指令将不会被汇编程序处理。在汇编源文件中这条指令是必须的并且应当是原文件的最后一条指令。
五、汇编程序设计
1.简单程序设计
简单程序又称顺序程序。这种程序的形式最简单,计算机执行程序的方式是“从头到尾”,逐条执行指令语句,直到程序结束,除非用特殊指令让它跳转,不然它会在pc控制下执行。这是程序的最基本形式,任何程序都离不开这种形式。
例1:编写1+2的程序
org0000h
mov30h,#02
mova,#01
adda,30h
end
2.分支程序设计
在处理实际事务中,只用简单程序设计的方法是不够的。因为大部分程序总包含有判断、比较等情况,这就需要分支程序。分支程序是利用条件转移指令,使程序执行到某一指令后,根据条件(即上面运行的情况)是否满足,来改变程序执行的持续。下面举两个分支程序的例子。
例2:求单字节有符号二进制数的补码。
org0000h
cmpt:jnbacc.7,nch;(a)>0,不需转换。
cpla
adda,#1
setbacc.7 ;保存符号。
nch:ret
end
3.循环程序设计
在程序设计中,有时会遇到多次重复处理的问题,这就需要下面讲的循环程序来完成。循环程序是强制cpu重复执行某一指令系列(程序段)的一种程序结构形式,凡是要重复执行的程序段都可以按循环结构设计。
循环程序一般由五部分组成:
(1)初始化部分:为循环程序做准备。如:设置循环次数计数器的初值,地址指针置初值,为循环变量赋初值等。
(2)处理部分:为反复执行的程序段,是循环程序的实体。
(3)修改部分:每执行一次循环体后,对指针作一次修改,使指针指向下一数据所在位置,为进入下一轮处理做准备。
(4)控制部分:根据循环次数计数器的状态或循环条件,检查循环是否能继续进行,若循环次数到或循环条件不满足,应控制退出循环,否则继续循环。
通常2、3、4部分又称为循环体。
(5)结束部分:分析及存放执行结果。
例如:设有50个外部ram单元要清“0”,即为循环次数存放在r2寄存器中,其首址存放在dptr中,设为2000h。
程序如下:
org0000h
movdptr,#2000h
clear:clra
movr2,#32h ;置计数值。
loop:movx@dptr,a
incdptr ;修改地址指针
djnzr2,loop ;控制循环
end