当前位置:文档之家› 汇编伪指令和编译出错说明

汇编伪指令和编译出错说明

ASM-51 宏汇编使用手册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 10011100B10进制 ****** 0,1,2...9 45723 缺省基数标记16进制 ****H 0,1...E,F 0CDE3H 最前面一个字符应是0--9ASCII '**' 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/23MOD 模除 ADD A,R1 MOD 12SHR 右移 ADD A,R1 SHR 3SHL 左移 ADD A,R1 SHL 2逻 AND 与操作 ADD A,R1 AND 10000101BOR 或操作 ADD A,R1 OR 00110000BXOR 异或操作 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,SET2 段定义伪操作 ORG,END,CSEG,DSEG,XSEG,FSEG,ENDS3 数据定义伪操作 DB,DW,DS4 列表伪操作 $TITLE,$SUBTTL,$PAGE,$LIST,$NOLIST,$NOCODE5 条件伪操作 IF,ELSE,ENDIF6 宏处理伪操作 MACRO,ENDM7 其它 ALTNAME,INCLUDE2、1 符号定义伪操作符号定义伪操作及其格式: 符号名符号定义名常量或表达式其中符号定义名可以为EQU,=,DA TA,BYTE,WORD,BIT,SET等。

下面就是这些符号定义伪操作的用法及说明。

如表--4所示。

表--4 符号定义伪操作符号定义名用法说明EQU 为常量,符号名等定义符号化常量名符号名不能重名定义= 为常量,符号名等定义符号化常量名符号名不能重名定义DATA 用来为一个字节类型的符号定值符号名不能重名定义BYTE 用来为一个字节类型的符号定值符号名不能重名定义WORD 用来为一个字类型的符号定值符号名不能重名定义8051中没有字操作BIT 用来定义一个字位类型SET 用来定义整数类型的符号名符号名可重名定义DATA与BYTE的区别: DA TA与BYTE是相类似的伪指令。

当程序运行到DA TA伪指令定义的符号名时,该符号名将被显示;而由BYTE定义的符号名不被显示。

2、2 段定义伪操作(1) ORG 用于设臵或改变程序计数器的值。

其格式为: ORG 常数或表达式例如: ORG 0008HORG $+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,DA TA,BYTE,WORD,EDNS等组成。

无目标码生成。

外部段(XSEG) 由外部工作寄存区和RAM组成。

使用方法同数据段。

无目标码生成。

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

无目标代码生成。

位段(BSEG) 由一些独立的位组成,可以用布尔函数实现。

该段地址被解释为位地址。

无目标代码生成。

表--6 程序分段的类型符号段标号(Label) 字节型操作数(Byte) 字型操作数(Word)代码段CSEG LDW数据段DSEG DDW外部段XSEG XXE功能段FSEG FFG位段BSEG BBB说明: (1)在不同的段中类型符号不同;(2)字节型操作数(Byte)一般通过DA TA指令赋给符号; 字型操作数一般通过WORD指令赋给符号;(3)如果各段中用BYTE赋值,则在各段中符号全以S表示;在SIM51模拟/调试中的符号区显示功能中,对BYTE赋值的将被跳过。

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

相关主题