旅发 2016 51号:A51汇编器的解释
来源:百度文库 编辑:中财网 时间:2024/04/26 12:22:55
A51汇编器的解释one--看了后悔找我
分类: C51和A51学习 2006-05-04 20:53A51汇编器是运行于IBM PC系列及其兼容机上的交叉汇编软件,其主要功能是将MCS-51系列单片机汇编语言源程序翻译成符合Intel目标文件格式的可再定位的目标代码,经过L51连接器的连接和装配,产生可被DS51仿真器调试或其它任何一种与Intel 目标文件格式兼容的仿真器使用的绝对目标代码.
一:A51的符号:在A51中可使用符号表示数值(EQU),地址和寄存器名,符号具有段类型,作用域,值域和可变性等属性.
符号的段属性:指出符号所位于的地址空间.段类型有:
NUMBER 无类型符号
DATA DATA段符号(可直接寻址的内部RAM空间)
IDATA IDATA段符号(可间接寻址的内部RAM空间)
XDATA XDATA段符号(外部数据存储空间)
BIT BIT段符号(内部RAM低地址区的可位寻址的空间)
CODE CODE段符号(程序存储器空间)
REGISTER 寄存器符号
作用域:指出符号是外部的,局部的还是全局的.(PUBLIC,EXTRN关键字说明)
二:标号:定义标号时,标号名后必须接冒号”:”,以示区别,每行只能定义一个标号,标号一经定义,其值为当前地址计数器的当前值,因此标号代表了指令和数据的地址,不能重复定义.
三:特殊的汇编符号:A51宏汇编语言定义了代表CPU寄存器的特殊符号,这些是保留的关键字,AR0---AR7:表示当前工作寄存器的R0—R7的绝对地址,它的值取决于指令所选择的工作寄存器组.
四:运算符:有三种1):算术运算符包括:+,-(正负号),加---+,减,乘,除,MOD(取模),()—括号,改变运算顺序.2):二进制运算符号:用来对二进制数进行按位取反,移位或逻辑运算.包括:NOT(按位取反),HIGH(取右边操作数的高8位,LOW(取右边操作数的低8位)SHR(右移位),SHL(左移位),AND(逻辑与),OR(逻辑或),XOR(逻辑异或).3):关系运算符:>=,<=,<>,=,<,>.
所有运算符的优先级顺序:()àNOT,HIGH,LOWà+,-(正负号)à*,/,MODà+,-(加减)àSHR,SHLàAND,OR,XORà>=,<=,<>,>,<,=.
数值表达式:数值表达式由运算符和操作数组成,一个操作数又可以是表达式,与符号具有段属性一样,表达式也具有段类型属性,表达式的类型依赖于操作数的类型.表达式的类型如下:BIT,NUMBER,CODE,DATA,IDATA,XDATA.大多数的表达式是无类型的,当表达式中包含有段类型的操作数或者是子表达式时,运算结果的段类型遵循下面的原则:
对于单目运算符:(+/-/HIGH/LOW/NOT)表达式的结果与操作数具有相同的类型.
对于所有的双目运算符(除+/-),表达式的结果均为无类型的结果.
对加减运算,只有当其中的一个操作数具有段类型的时候,运算结果才具有相同的段类型,如果两个操作数具有段类型,即使他们的段类型一样,结果也是无类型的(NUMBER).
总结:只有当操作数加上或者是减去一个无类型时,才可能产生一类型,其他所有的组合均产生无类型的表达式.
A51提供了伪指令,可以利用这些伪指令在汇编程序中定义符号,保留和初始化存储空间,定位目标代码等功能,伪指令中除DB,DW外均不产生目标代码,但可以改变汇编器的状态,并将有关信息(如段定义)加到目标文件中.
伪指令分四类:
1):定义符号:SEGMENT,EQU,SET,DATA,IDATA,XDATA,BIT,CODE
2):保留和初始化存储空间:DS,DB,DW,DBIT
3):程序链接:PUBLIC,EXTRN,NAME
4):汇编状态控制和段选择
:ORG,END,RSEG,CSEG,DSEG,XSEG,ISEG,BSEG,USING
一 :定义符号的伪指令
1)SEGMENT
格式: 段名符号 SEGMENT 段类型 [再定位类型]
SEGMENT指令可声明一个可再定位(区别于CSEG,DSEG,XSEG,BSEG,ISEG等 定义的在相对应的空间固定地址定义的绝对段—在连接的过程中不允许重新定位)的段符号和一个可选的再定位类型,段符号可以用来定义段,L51连接器可将多个模块内的具有相同段名和再定位类型的几个段合成为一个段.段类型说明了段所处的地址空间.
如果是编写的汇编程序要与C源程序接口,即被C源程序调用,则全部的汇编子程序所命名的定义的代码段的段名必须是可用SEGMENT来定义的,而且名字的命名的方法也应该参照C51编译器产生的局部段的段名的转换规则.段名的作用主要是在汇编的时候用RSEG来激活的,在连接定位的时候用到的.与段名相应的是用于存储和传递参数的别名,可以在汇编源程序中直接应用局部段的别名,这个别名主要是在传递函数参数的时候用的.在汇编程序中要用PUBLIC 声明被其他模块引用的全局符号.
DATA (可直接寻址的内部RAM空间)
IDATA (可间接寻址的内部RAM空间)
XDATA (外部数据存储空间)
BIT (内部RAM低地址区的可位寻址的空间)
CODE (程序存储器空间)
可选的再定位类型定义了L51连接时的定位方式,再定位类型:
UNIT:定义一个可开始于任一单元的段对于BIT型的段,一个单元是一个位,
其它所有的段一个单元是一个字节.
PAGE:定义一个起始地址必须是256的整数倍的段,段的绝对地址由L51自己计算,该类型只允许用于XDATA和CODE类型段.
INPAGE:定义一个由L51连接后必须包含在256B的块中,只适用于XDATA和CODE段.
INBLOCK:定义一个L51连接后必须包含在2KB中的段,只适用于CODE段.
OVERLAYABLE:定义一个可与其他段交叠的覆盖段,其段名符号必须按C51或者PL/M51的规则命名.C51把局部数据段和局部位段定义成DT?FUNCTIONNAME?MODULENAME和BI?FUNCTIONNAME?MODULENAME这是在small模式下.其他的模式略有不同。
BITADDRESSABLE:定义一个L51连接后位于可位寻址的区,段长不能超过16B.
2) EQU
格式: 符号名 EQU 表达式
符号名 EQU 寄存器名
EQU伪指令定义一表示数值或寄存器的符号,该符号可用于表达式或助记符指令的操作数,EQU指令定义的符号不能被改变或重新定义,其段类型取决于表达式中的操作数类型类型,无类型的EQU符号可用于任何表达式中.
LIMIT EQU 200
VALUE EQU LIMIT-100+’A’
COUNTER EQU R5
3) SET
格式: 符号名 SET 表达式
符号名 SET 寄存器名
SET指令的功能与EQU指令的功能一样,区别是SET指令定义的符号可以再定义和改变.
VALUE EQU 200
VALUE SET VALUE/2
COUNTER SET R1
TEMP SET COUNTER/2
4) BIT
格式: 符号名 BIT 表达式
BIT指令定义一表示位地址的符号,该符号一经定义便不能重新定义和改变.
DATA_BSEG SEGMENT BIT
RSEG DATA_BSEG
CTRL DS 1
FLAG BIT CTRL.1
FLAG2 BIT FLAG+1
5) DATA
格式: 符号名 DATA 表达式
DATA指令定义一表示MCS-51内部数据存储器字节地址的符号,表达式必须是一个绝对地址值或者是一个简单的再定位表达式(即数值确定的,且其值必须在0—255之间,类型必须是DATA或者是NUMBER类型)
例如在汇编程序中:
PORT DATA 90H
RESULT_L DATA 40H
RESULT_H DATA RESULT_L+1
6) XDATA,IDATA,CODE 均是也和DATA一样,都是定义一个代表相应存储空间单元的地址符号,表达式也必须是相对应的类型或者是NUMBER类型。
二 初始化和保留指令
1)DS
格式: [标号:] DS 表达式
DS指令以字节为单位,在内部或者外部地址空间中保留存储空间,表达式中不能包含前向地址参考量,可为除BIT段的任何类型。该伪指令语句使当前地址计数器加上表达式的值,需要注意的是地址计数器加上表达式结果的值不能超出地址空间的范围。(无论是汇编器还是编译器,对每一种不同类型的地址空间(DATA,CODE,PDATA,XDATA,BIT)都产生一个独立的地址计数器,每汇编一条指令,计数器都会自动增加,不过可以用ORG伪指令改变当前段地址计数器,用ORG伪指令表达式的值作为当前段地址计数器的初值,而当前段的改变可以用RSEG伪指令来改变。
RSEG ?DT?FUNCTION?MODULENAE----声明当前段为局部数据段
FUNCTION?BYTE:-------------函数局部段的别名
TIME: DS 5
2) DBIT
格式 [标号:] DBIT 表达式
以位为单位在可位寻址段内保留存储空间, 表达式中不能包含前向地址参考量或者是再定位的符号和外部符号,该指令使当前地址计数器增加表达式结果值,其增加量以位为单位.
3) DB DW
格式: [标号]: DB/DW 表达式1[,表达式2,………]
这两个指令的作用相同,均是以字节或者是字初始化程序存储空间,上面是保留存储空间,存储空间可以使RAM和ROM,而这两个指令直接就是初始化程序存储空间.
Table: DB “any key to continue!”
Requst: DB LOW(Table),HIGH(Table)