汇编语言是采用便于人们记忆的一些符号或者字符串(例如简化的英文单词,缩编的英文语句,甚至还可以是汉语拼音等)来表示操作码、操作数和地址码等,实质上是一种符号语言。汇编语言中的指令性语句通常与机器语言指令一一对应。用汇编语言编写的原始程序就称为汇编语言源程序,简称“源程序”。
由于单片机不认识汇编语言程序,所以开发人员需要在微型计算机上运行一个由单片机制造商免费配套提供的,称作“汇编器”(或汇编程序)的软件,在汇编器的帮助下,将我们编写的源程序翻译成机器语言程序,称为“目标程序”。烧写到单片机的程序存储器中的程序就是这种程序。利用汇编器将源程序翻译成目标程序的过程称为“汇编”。表1给出了一段程序在汇编前和汇编后的不同表现形式。

汇编语言提供了一种可以不涉及机器指令编码和实际存储器地址来编写源程序的有效方法和便捷途径。为了掌握这种方法,我们需要了解汇编器(本讲座以MASM78汇编器为例)的汇编语言语句格式、标号格式、数字进位制标识法、表达式格式、伪指令、程序格式、应用汇编器的方法等。
另外,作为编写程序或程序设计的预备知识,我们还需要了解程序结构的4个基本类型,即顺序结构、分支结构、循环结构和子程序结构;在实际工作中常用的几种程序的设计方法,如延时程序、查表程序;在编制EM78P447S单片机的程序时会遇到几个特有的问题,即工作寄存器的体选寻址问题、程序存储器的跨页跳转问题等。
一、汇编语言的语句格式
为了利用能在微机上运行的汇编器以便对源程序进行自动汇编,在编写源程序时必须依照所用汇编器的一些约定进行书写。例如使用汇编器“MASM78”,典型的汇编语言语句格式由以下4个字段组成:
要求:这4部分的顺序不能颠倒;标号一般从最左边第一列开始书写,其后用冒号(或空格)与操作码隔离;在没有标号的语句中,指令操作码前面必须保留1个或1个以上的空格;操作码与操作数之间也必须保留1个或1个以上的空格;操作码后面如果跟随两个操作数,操作数之间必须用(半角)逗号隔开;在必要时可以加注释,注释可以跟在操作码、操作数或标号之后,并用分号引导,甚至可以单独占用一行且可以从任何一列开始。汇编语言源程序既可以用大写字母书写,也可以用小写字母书写,还可以大小写混用,以便阅读。
用在指令助记符之前的标号就是该指令的符号地址,在程序汇编时,它被赋以该指令在程序存储器中所存放的具体地址。只有那些欲被其他语句引用的语句之前才需要加标号。标号可以单独作为一行。
标号最多可以由32个字符构成,字符可以是英文字母(区分大小写)、阿拉伯数字和其他一些字符(包括$、#、\和—)组成;且第一个字符必须是非数字;如果后面不跟冒号,标号必须从第一列开始书写;如果后面跟冒号,可以不从第一列开始书写;标号不要用指令助记符、寄存器名称或其他在系统中已有固定用途的字符串(这些又称为系统保留字);一个标号在程序中只能定义一次。
2.操作码
这个字段什么情况下都不能空缺,尽管其他3个字段有时会是空的。它可以是单片机指令系统中的助记符,也可以是用于控制汇编器的伪指令,还可以是宏命令。指令操作码的助记符在汇编过程中,汇编器把它与“操作码索引表”进行逐一比较,找出相应的机器码,并且取而代之,因此这一汇编过程又叫做代真。
在其前面没有标号时,操作码前面至少保留一个空格,以便与标号区别。
3.操作数
该字段是指令的操作对象,也就是数据或地址,可以用数值形式或标号形式表示。其中,“数值”可以是二进制、十进制、十六进制(各种数制的表示法见表2);“标号”可以是在此之前经过定义(或赋值)的代表数值或地址的标号。如果操作数有两个,中间应用逗号分开。MASM78的默认进制是十进制。
需要说明的是:十六进制数由数字0~9和字母A~F组成。当在源程序中采用后缀“H”表示一个以A~F打头的十六进制数时,则必须在它的前面增添一个“0”作为引导,以便于汇编器将其与标号或符号名相区别。如十六进制数EF应表示为0EFH。
4.注释
注释用来对程序作一些注解和说明,便于人们阅读、交流、修改和调试程序。注释不是程序的功能部分,通常用半解分号引导,汇编器对该部分不作任何处理。加注释时,一般应该说明指令的作用和执行的条件,尤其要说明程序在做什么;在用到子程序时,要说明子程序的入口条件和出口条件以及该程序完成的功能。
二、常用伪指令
汇编器不仅可以快速地把汇编语言源程序自动翻译成机器语言目标程序,而且还可以帮助我们查找出源程序中的简单错误(比如句法错误和格式错误等)。为此,我们必须掌握它能“听得懂”的语言——伪指令。
构成汇编语言源程序的成分,主要是指令助记符(亦称指令性语句),其次就是伪指令(也叫指示性语句)。伪指令与指令系统中的助记符不同,没有机器码与它对应。当源程序被汇编成目标程序时,目标程序中并不出现这些伪指令的代码,它们仅在汇编过程中起作用。伪指令是程序设计人员向汇编器发布的控制命令,告诉汇编器如何完成汇编过程和一些规定的操作,以及控制汇编器的输入、输出和数据定位等。对于汇编器MASM78,初学者掌握以下几条常用的伪指令即可满足一般编程的需要:
1. ORG:
下一条指令的地址定义伪指令。
格式:ORG nnn
说明:用于指定该伪指令后面的源程序开始存放的地址,也就是汇编后的机器码程序在单片机的程序存储器中开始存放的地址。其中nnn是一个12比特长的地址。
2. EQU:
定义数值常数伪指令。
格式:常数名 EQU nn
说明:用一个表意性很强的字符串作为常数名,给它定义一个常数值,在引用该常数的地方代之以常数名,给程序的阅读和修改及符号化调试带来便利。
3. REG:
定义寄存器地址伪指令。
格式:寄存器名REG nn
说明:用指定的字符串作为寄存器名,给它定义一个地址码,在引用该寄存器的地方代之以寄存器名,给程序的阅读和修改以及符号化调试带来便利。
4. ==:
给符号名定义寄存器地址或数值常数伪指令。
格式:符号名 == nn
说明:使“==”两端的值相等。其中,“符号名”通常是代表寄存器名称或专用常数的一个字符串,“nn”通常是一个不大于8位二进制数的数值。该指令可以取代EQU和REG两条指令的功能。
在以上3条指令中,对常数名、寄存器名和符号名的要求类似于对标号的要求,如应从一行的第一列开始书写。
5. INCLUDE:
含入外部程序文件伪指令。
格式:INCLUDE<路径\文件名>.DT或<路径\文件名>.ASM
说明:用来告知汇编器,将一个预先编制好的程序模块包含进来,作为本源程序的一部分。这样可以减少重复劳动,提高编程效率。调入的外部文件,通常是定义文件(或宏定义文件等),其中定义了单片机的复位矢量、专用寄存器的地址以及控制位和状态位的位地址等。
6. SETCHIP:
设定所需要的单片机芯片型号伪指令。
格式:SETCHIP 单片机型号名称
说明:用来告知汇编器,以便使得汇编之后的目标文件适用于EM78系列单片机的不同型号。单片机型号名称可以是EM78456、EM78447、EM78156或EM78153等等。如果省略该语句,则汇编器默认的型号为EM78456。
7. END:
程序结束伪指令。
格式:END
说明:该伪指令通知汇编器结束对源程序的汇编,即使其后还有指令语句也不再汇编。在一个源程序中必须要有并且只有一条END伪指令,放在整个程序的末尾。
三、程序书写格式
一般EM78的源程序并没有规定的统一格式,可以根据自己的风格来编写,在这里推荐一种格式供大家参考。
从这段程序清单中可以看出,为了程序便于阅读理解和整齐美观,将整个程序在纵向上按功能划分为几个区域;在横向上按4个不同字段分别上下对齐。
; ——————————
; 符号名定义
; ——————————
IAR ==00H ;把后面程序的指令中将
TCC ==01H ;要用到的专用寄存器单
PC == 02H ;元地址和位地址用表义
性很强的符号名预先定
义
STATUS == 03H
RSR == 04H
PORT5 == 05H
IOC5 == 05H
ISR == 3FH
X == 10H ;对程序所需的通用寄存器预先定义
Y == 11H
; ——————————
; 复位矢量和中断矢量安排(对于EM78P447S)
; ——————————
ORG 0FFFH ;地址FFFH为复位矢量
JMP MAIN ;跳转到主程序入口处
ORG 001H ;地址001H为中断矢量
JMP INT-BODY;跳转到中断服务程序入口处
; ——————————
; 中断服务程序区
; ——————————
INT_BODY: ;中断服务程序入口
MOV A,ISR ;读取中断状态寄存器判
断中断源
…… ;[中断服务程序主体部分]
RETI ;中断服务程序返回
; ——————————
; 主程序区
; ——————————
ORG 003H ;可以从003H开始存放
主程序
MAIN: WDTC
CALL SUB ;调用子程序SUB
…… ;[主程序主体部分]
JMP MAIN ;跳转回去形成循环
; ——————————
; 子程序区
; ——————————
SUB1: MOV A,01H ;子程序入口
…… ;[子程序主体部分]
RET ;子程序返回
; ——————————
END ;通知汇编源程序结束
四、汇编器MASM78的应用
“MASM78”由于具有“宏”功能,所以又叫做“宏汇编器”。MASM78是一种在低档微型计算机上(如486以下)也能够运行良好的DOS版本的宏汇编器。它对应的可运行文件名为:MASM78.EXE。启动方法可以是在Win-dows界面上的资源管理器中,找到该文件所在的路径,直接双击该文件即可打开如图1所示的窗口。然后在“Input filename:”(请输入文件名:)的后面输入用户编写的源程序的文件名称,并且以“.DT”或“.ASM”作为扩展名,比如“DEMO.DT”或“DEMO.ASM”。回车之后,汇编器又提示“Output CDS file name<DEMO.CDS>:”(请输入目标文件名称<默认为DEMO.CDS>:),可以直接按回车。此后,便开始了汇编过程,如果汇编器没有发现错误,则会出现如图2所示的窗口,表示汇编成功。在图2窗口中,“Total Compile Line:45”表示汇编文件的总行数为45行;“Total error message:0”表示出错提示信息总数为0。
汇编成功之后,汇编器将自动生成8个文件扩展名不同的文件,并且放置在与“.ASM”文件相同的目录下,扩展名分别为:.CDS、.LST、.SYM、.ERR、.ICE、.MDT、.LIN、.ADR。其中6个文件:.ASM、.LST、.SYM、.ERR、.ICE、.MDT均为ASCII码文件,可利用纯文本编辑器打开和查看。
MASM78的获取信息我刊将在以后的杂志中为您提供。
大海创作室
