ASM-51 宏汇编使用手册

    ASM-51 宏汇编主要用来开发Inter8051系列单片机,它具有宏处理,数据处理,列表处理和条件处理等多种功能。源程序的编写完全采

用Inter标准助记符和行格式。在编写程序过程中,可借助于文本编辑(Windows的记事本)或文字处理软件Word等编辑 , 经ASM-51汇编后

生成列表输出文件(.LST)和目标代码文件(.HEX)。 此目标代码文件(.HEX)可直接用CZS-51或MedWin、Keil、Debug8051进行模拟/调试,或

直接用于硬件仿真器上运行。当然,这也是要烧写到单片机ROM中的代码。

    1、 宏汇编语言的基本语法

    1、1  宏汇编的特点

    ASM-51宏汇编完全支持Inter助记符的汇编语言,它含有宏语句,英文大小写字母,变量名,标号等不受限制,有二,十,十六进制和串

参数类型,有汇编控制指令和多层条件语句,程序逻辑分段, 还有模块化程序设计的连接功能,汇编速度快等特点。

    1、2 汇编处理过程

    (1) 用行编辑EDLIN或文字处理软件WS或全屏幕编辑软件PE等,编辑宏汇编 语言源程序,它的文件扩展名为 .ASM。

    (2) 用ASM-51宏汇编程序对上述源程序文件进行汇编,产生扩展名为.LST的列表输出文件和扩展名为.HEX的目标代码文件(.HEX)。 列

表输出文件包含源程序语句所汇编成的代码,以及有关的地址,语句和符号表等。 目标代码文件包含源程序语句所汇编成的代码, 不包含任

何符号信息或助记符。 进行模拟/调试,或直接用于硬件仿真器上运行。

    1、3 语句

    汇编语言可分为两类语句:指令性语句和指示性语句。

    (1)指令性语句

    这一类语句是指在汇编过程中能生成指令代码的语句(如 MOV ,DEC等)。其格式为:

     [标号:] [指令助记符] [操作数] [;注释]

    其中方括号[  ]中为选择项。下同。

    (2)指示性语句

    这一类语句即通常所说的伪指令,它指示汇编程序后面的指示性语句如何产生代码。

    ASM-51宏汇编完全支持Inter助记符的汇编语言,因此汇编程序的格式,指令完全与8051汇编语言一样,这里不再介绍它们的指令系统。

    1、4 常量与数值运算

    (1) 常量及其表示

    常量,就是在汇编时已经确定的值。 在汇编语言中,常量主要用作指令性语句中的直接操作数 , 也可用于存储器操作的组成部分(如位

移量),或者为伪指令中的变量输初值。

    为便于程序设计,常量有多种表示形式:二、十、十六进制数和字符串等,它们的格式各不相同,并采用不同的基数标记加以区分。表-

1列出其格式。 

    表-1

    数据形式             取值范围        示    例          

    2进制        ********B   0,1           10110011B

    10进制       ******      0,1,2...9    32768           缺省基数标记

    16进制       ****H       0,1...E,F    0CDE3H          最前面一个字符应是0--9

    ASCII        '**'        ASCII          'AD'           只有DB命令中使用

 

    常量以数值形式直接写在汇编语言的语句中称为字面常量, 若预先为它定义一个符号名,然后在语句中用符号名来表示该常量称符号常

量。使用符号常量的优点可改善程序的可读性,它的定义需要使用伪操作命令"EQU"或“=“。

    (2) 数值运算

    宏汇编中,所有参数值均被认为是整数,并以16位的形式存放,表示的范围是0---65535,所有算术操作均对整数以补码形式运算。

    (1) 基本运算

    汇编语言对常量允许进行算术运算,逻辑运算,分离运算等三种类型的运算。如表-2所示。 

    表-2  基本运算

                                  以ADD为例

                 +           加操作            ADD  A,R1+36

                 -           减操作            ADD  A,R1-2EH

                 *           乘操作            ADD  A,R1*0E3H

                 /           除操作            ADD  A,R1/23

                MOD          模除              ADD  A,R1 MOD 12

                SHR          右移              ADD  A,R1 SHR 3

                SHL          左移              ADD  A,R1 SHL 2

                AND          与操作            ADD  A,R1 AND 10000101B

                OR           或操作            ADD  A,R1 OR 00110000B

                XOR          异或操作          ADD  A,R1 XOR 36H

                NOT          非操作            ADD  A,NOT 45H

                HIGH         高字节分离        ADD  A,HIGH 05E2H

                LOW          低字节分离        ADD  A,LOW 77F0H  

    说明:   R1为符号常量。

    (2) 综合运算

    综合运算规则 1: 计算表达式时,所有的运算全部从左到右顺序进行,遇到操作数就进行运算,不考虑优先关系,括号有助于视觉理解,

但不改变表达式的?计算顺序。

    例如:     R1 SET NOT(0C5FH OR 000CH)

              其结果应为 0F3ACH。

    综合运算规则 2: 当两个操作数之间没有参数相隔时, 第二个操作符优先于第一个操作符计算。

    例如:     R1 SET NOT 10011010B

              其结果应为 65H。

    1、5 程序分段

    8051系列的处理器的结构, 把内存分成五个独立的内存段, 即代码段(段名CSEG),数据段(段名DSEG), 外部段(段名XSEG),功能段

(段名FSEG)和位段(段名BSEG)等。各个段在源程序中的次序可以任意,段的数目可以根据需要确定,原则上不受限制。程序中的所有段都必

须用段名开头,段结束语句ENDS结束。

    1、6 源文件

    源文件是由汇编语言代码和汇编程序指令组成的 ASCII 字符文件, 扩展名为.ASM。源文件的每一语句行,最多有四个域。每一行的长

度不超过80个字符, 且以“回车“键结束。

    1、7 列表输出文件和目标代码文件

    (1) 目标代码文件(.HEX)

    目标代码文件(.HEX)是ASCII文件,它只包含由各种程序语句所生成的代码,而不包含任何信息或助记符。 该文件是能够在处理器上运

行的实际机器指令码。

    目标代码文件格式如下:

     :cc       aaaa       tt       dd     aa       dd         ss      <CR>  

     计数器    记录地址    数据类型        记录地址  代码的字节  和校验   回车                                

    目标代码文件(.HEX)的每一行以一个冒号开始,后面跟着的数字和符号分别表示十六进制数据的计数器(cc),记录第一个数据字节的16

位地址(aaaa), 目标记录的数据类型(tt),代码的实际字节(dd), 计数器从第一个数据字节到最后的所有字节值累加和的相反数即和校验

(ss)等等。

    (2)列表输出文件(.LST)

    列表输出文件也是个ASCII文件,它由源程序和目标代码文件组成, 可作为程序文档也可被打印。

    列表输出文件是分页显示,打印的,其长度由缺省值或伪指令$PAGE决定。 每页一开始指出汇编程序的类型,版本以及页号等。

    2、 伪操作指令

    汇编语言中的指示性语句(伪指令), 不象指令性语句会产生目标代码,它主要是用来“控制指挥“汇编程序如何把指令性语句翻译成目标代

码。除本身伪指令申请分配一部分存贮空间作数据区和堆栈区外,不产生任何目标代码。

    按照它们的功能,大致分成七类: 符号定义伪操作,段定义伪操作,数据定义崐伪操作,列表伪操作,条件伪操作,宏处理伪操作以及其

它操作等。如表-3所示。  

    表-3    伪操作指令

    序号                           

    1       符号定义伪操作       EQU,=,DATA,BYTE,WORD,BIT,SET

    2       段定义伪操作         ORG,END,CSEG,DSEG,XSEG,FSEG,ENDS

    3       数据定义伪操作       DB,DW,DS

    4       列表伪操作           $TITLE,$SUBTTL,$PAGE,$LIST,$NOLIST,$NOCODE

    5       条件伪操作           IF,ELSE,ENDIF

    6       宏处理伪操作         MACRO,ENDM

    7       其它                ALTNAME,INCLUDE

 

    2、1 符号定义伪操作

    符号定义伪操作及其格式:      符号名  符号定义名  常量或表达式

    其中符号定义名可以为EQU,=,DATA,BYTE,WORD,BIT,SET等。下面就是这些符 号定义伪操作的用法及说明。如表-4所示。  

    表-4    符号定义伪操作

    符号定义名                                           

    EQU            为常量,符号名等定义符号化常量名     符号名不能重名定义

    =              为常量,符号名等定义符号化常量名     符号名不能重名定义

    DATA           用来为一个字节类型的符号定值        符号名不能重名定义

    BYTE           用来为一个字节类型的符号定值        符号名不能重名定义

    WORD           用来为一个字类型的符号定值          符号名不能重名定义

                                                     8051中没有字操作

    BIT            用来定义一个字位类型

    SET            用来定义整数类型的符号名            符号名可重名定义

 

    DATA与BYTE的区别: DATA与BYTE是相类似的伪指令。 当程序运行到DATA伪指令定义的符号名时,该符号名将被显示;而由BYTE定义的

符号名不被显示。

    2、2 段定义伪操作

    (1)  ORG  用于设置或改变程序计数器的值。

    其格式为:   ORG    常数或表达式

    例如:  ORG  0008H

            ORG  $+5

    其中$表示程序计数器的当前值。

    (2)  END  表示源代码结束。

    其格式为:   END  常数或表达式

    汇编程序遇到END语句即停止运行。 若程序中没有END,则在汇编源程序时显出错

    (3)  8051系列的处理器把内存结构分成五个段,代码段CSEG,数据段DSEG,外部段XSEG,功能段FSEG和位段BSEG等,其用法及区别如 

表-5所示。

    在汇编以上各段所定义的符号时,系统根据符号所在不同段,赋与不同类型的字母,如表-6所示。

    2、3  数据定义伪操作

    数据定义伪操作格式:

     [ 标号: ]   数据定义名  [ 表达式1,表达式2,... ]

    其中数据定义名可为DB,DW,DS等。

    如表-7所示,数据定义伪操作的含义及说明。

 

    表-5           段定义伪操作

                                        

    代码段(CSEG)   包含由处理器所执行的程序。段名可缺省。有目标代码生成。

    数据段(DESG)   由内部工作寄存器的处理器的RAM组成。用来对程序使用的数据地址赋符号名,大多以ORG,DATA,BYTE,WORD,EDNS

                   等组成。无目标码生成。

    外部段(XSEG)   由外部工作寄存区和RAM组成。使用方法同数据段。无目标码生成。

    功能段(FSEG)   由特殊寄存器位置组成(如:输入/输出部件,计时器,中断控制和连续的寄存器部件接口等)。无目标代码生成。

    位  段(BSEG)   由一些独立的位组成,可以用布尔函数实现。 该段地址被解释为位地址。无目标代码生成。

 

    表-6           程序分段的类型符号

                 标号(Label) 字节型操作数(Byte)  字型操作数(Word)

    代码段CSEG                                         

    数据段DSEG                                         

    外部段XSEG                                         

    功能段FSEG                                         

    位  段BSEG                                         

 

    说明:   (1)在不同的段中类型符号不同;

            (2)字节型操作数(Byte)一般通过DATA指令赋给符号; 字型操作数 一般通过WORD指令赋给符号;

            (3)如果各段中用BYTE赋值,则在各段中符号全以S表示;在SIM51模 /调试中的符号区显示功能中,对BYTE赋值的将被跳过。

            (4)在各段中,位类型可以用BIT指令赋给。

 

    表-7           数据定义伪操作

    数据定义名      含义                          说明

    DB             用于定义一个字节包含的值        表达式不是字符串时,每个表达式赋给一个字节,是字符串时,用单引号 ' “ 

                                                 作为分隔符。

    DW             用于定义一个字(16位)           每个表达式占16位。如果表达式中的存贮内容为字符串,只取最后两个字符。若字

                                                 符串只有一个字符,高字节置“0“。

    DS             定义一个存贮区                 通常用在代码段中,作为程序的一部分。若用在数据段,外部段,则作为位置标志使

                                                 用。  

    表-8           列表伪操作

    伪指令         含义及格式                     说明

    $TITLE         给源程序指定一个标题            标题不加 “  “,其最大长度

                   格式: $TITLE [标题行]          60个字符。若标题行省略, 原来定义的标题行作废。

    $SUBTTL        给源程序指定一个副标题          副标题不加 “  “,其最大长度60字符。若副标题行省略,

                   格式: $SUBTTL [副标题行]       原来定义的副标题行作废。

    $PAGE          用于形成或定义新的一页或行数    汇编时页长为66行(适合于格式: $PAGE [表达式] 标准打印纸) 。表达式最大

                                                 为65535,最小为12, 表达式缺省,则从新的一页开始。

    $LIST          使源程序汇编时,产生程序清单    汇编时无此指令照样产生清单。

                   格式: $LIST

    $NOLIST        使源程序汇编时不产生程序清单

                   格式: $NOLIST

    $NOCODE        源程序汇编时,条件汇编程序值    没有此指令汇编时,不论其值是为假的不产生清单。真、假的条件都不产生目标码。

                   格式: $NOCODE

    2、4  列表伪操作

    如表--8所示,列表伪操作的含义,格式及说明。

    2、5 条件伪操作

    条件伪操作格式:

     IF   表达式

          [ 程序块1 ]

     [ ELSE ]

          [ 程序块2 ]

     ENDIF

    当IF指令中的表达式为真时,被汇编的代码段是程序块1;当IF指令中的表达式为假时,被汇编的代码段是程序块2。 在一个条件结构中,

仅有一个代码段被汇编,其它的则被忽略。

    2、6 宏处理操作

    在源程序中,如果有一段程序需要多次使用,为使程序不重复书写这段程序,可用宏定义把所需要重复出现的程序块定义成宏指令,此后

在宏指令出现的地方,宏汇编程序总是自动地把它们替换成相应的代码段。

    (1) 宏指令格式

    [ 宏指令名 ]   MACRO  [形式参数,。。。]

                    代码段

                   ENDM

    在宏定义中,使用了“形式参数“,它们引用宏指令时被给出的一些名字或数值(实在参数)所替换。使用形式参数给宏指令带来了很大的

灵活性。

    (2)宏调用格式

     [ 宏指令名 ]  [实在参数, ...]

    注意:

    1、当有两个以上的实参数时,它们之间要用逗号,空格或列表符隔开。    

    2、实参数项将对应替换宏指令中形式参数。如果形式参数为标号时,则在宏调用中,实参也应为标号,且要求实参是唯一的。如果宏定

义中有自己的标号,则在宏调用时,汇编程序自动地把标号变成唯一的标号。

    2、7 其他

    (1) 替换名 ALTNAME

    功能: 这一伪指令用来自定义名字,以替换源程序中原来的保留字,替换的保留字均可等效地用于子程序中。

    格式: ALTNAME  保留字  自定义名

    注意: 自定义名与保留字之间首字符必须相同。 

    (2) 附加文件的链结 INCLUDE

    功能: 利用此伪指令可将一个源文件插入到当前源文件中一起汇编,最终成为一个完整的源程序。

    格式: INCLUDE  [ 驱动器名: ]  [ 路径名 ]  文件名

    注意:1、文件名中若没有扩展名,则系统默认是。ASM(该文件必须是能打开的)。

         2、被插入的源程序中不能包含END伪指令,否则汇编会停止运行。被链接文件的每一行,在程序清单中以“I“开头。

         3、链接伪指令可有8级嵌套, 若要求嵌套的多, 则要修改 DOS 中的 CONFIG.SYS文件的FILES参数。

    3 宏汇编运行

    3、1 系统运行环境

    ASM-51宏汇编要在IBM-PC及其兼容机上运行(至少128K字节的RAM);具有一个软驱动器或硬驱动器,采用ANSI标准终端(包括键盘,显示

控制器,打印机,至少一个RS-232异步通讯接口)。软件有PC-DOS,MS-DOS 2.0 以上版本,ASM_51系统。

    3、2 宏汇编程序的运行

    以 8051 宏汇编为例,在DOS系统的提示符下键入

    A> ASM51  文件名.ASM <CR>

    等错误的个数出现后 ,键入 <CR> 变返回到DOS提示符下。8051的宏汇编与此相似。

    4 汇编的使用

    使用ASM-51宏汇编是将8051源程序汇编生成列表输出文件和目标代码文件,供模拟/调试时使用。我们使用的宏汇编完全采用Inter标准

助记符和行格式,因此在编写源程序时,可以使用宏汇编中的伪指令,以增加源程序的运行速度和可读性。也可以直接用 Inter 标准助记

来编写源程序。再经过ASM-51宏汇编进行汇编,便可得到列表输出文件和目标代码文件。

    汇编的格式如下:

    > ASM51  文件名。ASM  [ 可选项 ]

    其中可选项为: /L, /H, /S, /P, /N

    /L 表示源程序汇编后不生成列表册输出文件(.LST),只显示在屏幕上。

    /H 表示源程序汇编后不生成目标代码文件(.HEX)。

    /S 表示源程序汇编后不生成符号表。

    /P 表示源程序汇编后生成符号表。

    /N 表示源程序汇编后,程序是连续的显示。

    如果没有选择项,则表示产生列表输出文件和目标代码文件,且在LST文件后面列出符号表。 生成的目标代码便可以进行模拟/调试,如

果在模拟/调试中发现错误,则源程序要经过修改,重新汇编,然后再进行模拟/调试,直到完全正确。

    若程序汇编过程中有错误,则给出出错信息(出错信息见附录)。 生成的目标代码可以进行模拟/调试/烧写。 

    附录    ASM-51 汇编出错信息表

    1  Address Out of Range 一个被计值的目标地址超出了当前语句的范围。

    2  Badly Formed Argument 数字规定的类型中有非法数字存在。

    3  Illefal Equale 有不允许的类型约定。

    4  Label Name Conflicts With Symbol Name 在程序中有两个符号相同。

    5  Label Address Changed On Pass 2。 源程序在此错误之前,还有一些错误。

    6  Missing Argument in Expression 表达式中算术运算符后面没有操作数。

    7  Missing END Statrment 汇编的源程序结尾未发现END语句。

    8  Multiply Defined Label 源程序中定义了两个标号。

    9  Unbalanced Parentheses 表达式中多余或缺少括号。

    10 Undefined Symbol 语句中的符号名可能拼错或未被定义。

    11 Unrecognized Statemen or Undefined Argument 未定义参数的指令或代码。

    12 Value Out of Range 有一个非法的值来说明一个有着可能值限制的语句。