gzyueqian
13352868059
首页 > 新闻中心 > > 正文

ASM-51 宏汇编使用手册

更新时间: 2007-01-23 15:26:31来源: 粤嵌教育浏览量:1592

  A51与ASM51基本相同  

  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        10011100B 

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

  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      L                D                    W 

  数据段DSEG      D                D                    W 

  外部段XSEG      X                X                    E 

  功能段FSEG      F                F                    G 

  位  段BSEG      B                B                    B 

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

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

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

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

  表--7           数据定义伪操作 

  数据定义名        含          义                说                明 

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

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

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

  表--8              列表伪操作 

  伪指令          含义及格式                    说              明 

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

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

  $SUBTTL  给源程序指定一个副标题           副标题不加 “  “,其长 

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

  $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 有一个非法的值来说明一个有着可能值限制的语句。

免费预约试听课