段控制语句 SEGMENT
SEGMENT
■ SEGMENT语句声明一个通用的段,它带有存储器类和段位置选 项 k
■该语句的格式为:
段名字SEGMENT类[重定位[对齐]
其中:
■段名字:指定要分配给段的符号名字。该符号由后续的RSEG语句引用。 它也可以在表达式中用于表示组合段的基地址或起始地址
■类:段的存储器分配。类指定段所在的存储空间,链接器使用它访问属于 该类的所有段
类 | |
| BIT地址空间的有效地址范围为20H.0~2FH.7.比如,21H.5 |
| |
| CONST地址空间。它与CODE空间相同,但是只用于常数。该存储器使 用MOVC指令访问 |
| |
| |
| 兼容MCS-251 ISA单片机的整个地址空间(用于代码) |
| 兼容MCS-251 ISA单片机的扩展CONST空间(与EDATA相同) |
| 兼容MCS-251 ISA单片机的扩展DATA空间 |
| 兼容MCS-251 ISA单片机的整个地址空间(用于常数) 兼容MCS-251 ISA单片机的整个地址空间(用于数据) |
|
| |
RSEG,告诉编译器,我这个段是可以重定位的。由链接器来分配到代码段。
编写8051指令的汇编代码
复杂
编写80251扩展指令的汇编代码
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml11332\wps1.jpg
汇编代码中段的分配
EBIT段
MCS-251 ISA为EBIT段提供了扩展位可寻址存储器空间
该空间由扩展位指令寻址
■ MCS-251 ISA中,所有SFR也可以使用扩展位指令寻址
mybits SEGMENT EBIT ;定义EBIT段mybit
RSEG mybits ;引用该段
ORG 0x90 ;位地址偏移0x90,等效于 0x32.0
ZFLAG: DBIT 1 ;在0x32.0定义一个位ZFLAG
PSW1 DATA 0D1H ;80251中SFR PSW1 的地址
DAT DATA 40H :80251中的可位寻址区域
符号是定义的一个名字,用来表示一个值、文本块、地址 或者寄存器的名字。也可用符号表示常数和表达式
■符号最老可以由31个字符组成,包括
■ A~Z之间的大写字母
■ a~z之间的小写字母
■ 0~9之间的数字
■下划线
■问号"V
■符号名字可以以除0~9以外的任何字符开头
符号可以以多种方式定义
■在汇编语言程序代码中,可以使用EQU或SET控制语句定义符号,
用于表示表达式。例如:'
NUMBER FIVE | EQU | 5 |
TRUE FLAG | SET | 1 |
FALSE FLAG | SET | 0 |
■在汇编语言程序代码中,可以将符号定义为标号。比如:
LABEL1: DJNZ RO, LABEL1
■符号也用于引用一个变量的位置。比如:
SERIAL BUFFER DATA 99h
标号定义了程序或数据空间中的“位置“(地址)
■适用于符号名字的所智规则也适用于标号
■当定义标号时,标号必须是一行中第一个文本字段
■它前面可能是制表符或空格
■在符号名字后面必须紧跟着冒号字符":”,用于将其标识为标
■—行只能定义—个标号
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml11332\wps2.jpg
■标号可以指程序代码、基本数据或扩展数据存储器中的变量空间, 也可以指程再在程序或代码空间中的常数数据
■此外,程序开发人员也可以使用标号将程序执行转移到其他位置
■标号后面的指令可以通过使用标号来引用
■程序可以跳转到标号或调用标号。在标号后面的代码将被立即执行
■在调试程序代码时,标号可以给仿真器和调试器提供消息
■仿真器或调试器可以在调试时提供标号。这将有益于简化调试过程
注:标号只能定义一次,不能重新定义它
A251汇编器定义并保留MCS-251 ISA中寄存器集的名字
■在基于MCS-251 ISA的汇编程序代码中,这些预定义的名字用于访问处理器核中的寄存器
| |
| 表示8051单片机处理器核中的累加器.它与许多操作一起使用,包括乘 法和除法、将数据移动到外部存储器和从外部存储器移动数据、布尔运算 等 |
| 寄存器DPTR是16位的数据指针,用于访问XDATA或CODE存储器中的 地址数据 |
| 寄存器PC是16位的程序计数器。它包含着下一条要执行指令的地址 |
| 进位标志;指示产生进位的操作状态。操作也使用进位标志来表示借位 |
寄存器 | 功能 |
AB R0~R7 | 在乘法(MUL)和除法(DIV)指令中,使用寄存器A和寄存器B对 在当前活动寄存器组中的,8个8位通用8051寄存器。最多可以使用四 个寄存器组 |
AR0-AR7 | 表示当前寄存器组中R0~R7的绝对数据地址。这些寄存器的绝对地址根 据当前选择的寄存器组而变化。这些符号仪在给出USING汇编语句时才 可以使用 |
R8-R15 | MCS-251 ISA中提供的额外8个8位通用寄存器 |
| MCS-251 ISA中提供的16个16位通用寄存器。寄存器WR0~WR14与寄 存器R0~R15重叠。注意,此处没有可用的WR1 |
| MCS-251 ISA中提供的10个32位通用寄存器。寄存器DR0-DR28与寄 存器WR0~WR30重叠。注意,此处没有可用的DR1、DR2和DR3 |
•■表达式和操作数
操作数是与汇编命令或指令一起指定的参数或表达式
■汇编器命令需要常数或符号的操作数。比如:
VVV EQU 3
DS 10h
■汇编器指令比命令支持的操作数种类更多
■有些指令不需要操作数,有些指令最多需要3个操作数,多个操 作数用逗号分隔。比如:
MOV R2, #0
■所需操作数的个数以及类型取决于指定的指令或命令
■指令操作数的类型
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml11332\wps3.jpg
冒号表示法中的数字 | 用下面代替 |
VAL1 EQU 0:20H VAL2 EQU OFF: 1000H | VAL1 EQU EDATA 20H VAL2 EQU ECODE 0FF1000H |
ORG OFE:2000H | ?modulename?number SEGMENT ECODE AT 0FE2000H RSEG ?modulename?number |
ORG 0:400H | ?modulename?number SEGMENT EDATA AT 400H RSEG ?modulename?number |
CSEG AT 0FE:2000H | ?modulename?number SEGMENT ECODE AT 0FE2000H RSEG ?modulename?number |
BVAR1 BIT 0:20H.1 BVAR1 BIT 0:30H.1 PUSH.BM3 PUSH.W #13 | BVAR1 BIT20H.1 BAVR1 EQU EBIT 30H.1 PUSH BYTE #13 PUSH WORD 013 |
■在汇编语言的任何地方都可以使用字符,它可以用来作为立 即数。例如:
LETTR_A EQU 'A'
TEST: MOV @R0,#'F'
SUBB A,#'0'
字符串与汇编器描述DB—起使用,用来定义在A251汇编程序中的消息
■字符串用一对单引号''包含。比如:
KEYMSG: DB 'Press any key to continue.'
该声明将在KEYMSG指向的缓冷区内生成下面的十六进制数,即:50h、72h、
65h、73h、73h、20h ......6Eh、75h、6Sh、2Eh
■此外,也可以在同一行混合字符串和数字数据.比如:
EOLMSG: DB ‘End of line', 00h
在该例子中,后面添加的00h,用于表示字符串"行尾”的结束
•-位置计数器
在汇编器中,为每个段保留了一个位置计数器
■在这个计数器中,包含了指令或者数据的偏移地址
■位置计数器在每行之后递增该行中代码或数据的字节数
■默认,将每段的位置计数器初始化为0
■可以用ORG描述修改位置计数器的初值
■在表达式中,使用“$"符号,用于得到位置计数器当前的值, 可以使用位置计数器确定一个字符串的长度。比如:
msg: DB 'This is a message*, 0
msg_len: EQU $-msg
■此外,可以在指令中使用位置计数器.比如,下面的指令创建一个无限循环
JMP $ ; 相当于C语言中的while (1)
在汇编语言中,操作符可以是一元操作符(即,只有一个
操作数);或者二元操作符(即,有两个操作数)
*操作符及其操作数的组合就构成一个表达式
--优先级
括号可用于包含多个运算符的表达式中,以指定运算符的
求值顺序
■如果表达式中未使用括号,则运算符优先级顺序决定求值顺序
优先级
1(最高) ()
■ NOT、HIGH、LOW、BYTEO、BYTE1、BYTE2、BYTE3、WORDO、 WORD2
■ 一元+、―元-
■ *、/、MOD
5 +、-
SHL (左移)、SHR (右移)
AND、OR、XOR
(最低) EQ、NE、<>、LT、 <、LTE、<=、GT、>、GTE、>=
■ BYTEx根据x所指定操作数的位置,返回相应的字节
■ BYTE0返回鼠低的字节(与LOW等效);BYTE1返回紧挨BYTE0的字节
(与HIGH等效)
■ WORDx根据X指定的操作数的位置,返回相应的字
■ WORD0返回最低的字(16位);WORD2返回最高的两个字节(16位)
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml11332\wps4.jpg
类操作符
在本章前面介绍了类运算符,它们为表达式分配存储器类
■这就是将表达式与类关联的方式
| | |
| | 将类CODE分配给表达式 |
| | 将类CONST分配给表达式 |
| | 将类DATA分配给表达式 |
| | 将类E8IT分配给表达式 |
| | 将类ECODE分配给表达式 |
| | 将癸ECONST分配给表达式 将类EDATA分配给表达式 |
| | 将类IDATA分配给表达式 |
| | 将类HCONST分配给表达式 |
| | 将类HDATA分配给表达式 |
| | 将类XDATA分配给表达式 |
类型运算符为表达式指定数据类型
| | |
| | |
| WORD表达式 | 将类WORD分配绘表达式 |
| DWORD表达式 | 将类DWORD分配给表达式 |
| | |
| FAR表达式 | 将类FAR分配给表达式 |
表达式
EXTRN CODE (CLAB)
EXTRN DATA (DVAR)
MSK EQU OFOH
VALUE EQU MSK -1
LVAL EQU 12345678H myVar EQU EDATA OO3OH
FOO SEGMENT CODE RSEG FOO
;代码空间CODE入口
;数据空间DATA的变量
;定义符号用于代替0xF0
;另一个常数的符号值
;LVAL的值为12345678H ;用16位地址访问变量
;定义代码段CODE的名字FOO ;引用该段
MOV RO,DVAR+20 ;从地址DVAR+2。加载常敷
MOV R1,#LOW (CLAB+10) ;加载地址CLAB+10的低字节
MOV WR4,#WORD2 (LVAl);加载LVAL的高字
MOV DR0,#ENTRY ;加载地址的低字,ENTRY到DRO
MOVH DR0,#WORD2 (ENTRY);;加载地址的高字,ENTRY到DRO
MOV R4,@DR0 ;;将ENTRY的内内容加载到R4
MOV myVar,R1 ;:将R1 保存到EDATA变量myVar
A251汇编器提供了大量的控制语句,允许程序开发人员 定义符号值、保留和初始化存储空间,以及控制代码的存储位置
■这些语句不能和汇编助记符描述的机器指令混淆
■这些语句不能产生可执行代码,除了DB、DD和DW描述外,它们不影响 代码存储器的内容
■这些控制改变的是汇编器的状态、定义的用户符号和添加到目标文件的信 息
ALIGN
■ ALIGN语句将位置计数器设置为下一个地址模2表达式,这可用于确保下一条语句在2的n次方界上对齐
■例如,对于缓存行中的代码或数据。
■如果需要,汇编器会产生间隙。不同段的间隙字节内容不同。在data中, 间隙未定义;在const中,间隙为0;在code中,间隙为NOP。
ALIGN
. ALIGN语句将位置计数器设置为下一个地址模2幂次方,这可用 于确保下一条语句在或边界上对齐
■例如,对于缓存行中的代码或数据。
■如果需要,汇编器会产生间隙。不同段的间隙字节内容不同。在data中, 间隙未定义;在const中,间隙为0;在code中,间隙为NOP。
EVEN
■迫使位置计数器指向下一个偶数地址(如果当前的位置计数器为 奇数)
■该语句能确保下一个语句对齐字边界
■如果需要,汇编器产生一个字节的间隙,间隙的定义同ALIGN.例如:
MYDATA: SEGMENT DATA WORD
RSEG MYDATA
var1: DSB 1
EVEN
var2: DSW 1
ORG
■ ORG语句更改当前段的位置计数器,并为后续语句设置新的原点
■该表达式必须是一个简单的可重定位表达式,并且没有向前引用
■只能使用当前段中的绝对地址或符号值
■表达式中可以使用表示位置计数器当前值的美元符号字符('$')
■当遇到ORG语句时,汇编器计算表达式的值并修改位置计数器
■如果ORG语句出现在绝对段中,则将为位置计数器分配指定的绝对地址 值。位置计数器不能设置为低于段的基地址的地址
■如果ORG语句出现在可重定位的段中,则将为位置计数器分配指定表达 式的偏移量。例如,如果可重定位地址为1000h开始,并且ORG表达式 的值为1234可则下一条语句的绝对地址为2234h (1000h+1234h)
■ ORG语句更改位置计数器,这可能会创建一个间隙,但不会创建新段
■ORG语句的例子,如下:
ORG 100h
ORG RESTART
ORG EXIT1
ORG ($ + 15) AND 0FFF0h
USING
■ USING语句指定哪个寄存器组(0~3)用于编码AR0~AR7寄存 器
.所选的寄存器组被记录在目标文件中,并且存储器区域由链接器 保留
■ 一些8051指令(如PUSH和POP)只允许使用绝对地址
■汇编器使用当前寄存器组中寄存器的物理地址代替绝对寄存器 (AR0-AR7)
■当指令PUSH R0无效时,PUSH AR0有效
■汇编器必须知道使用哪个寄存器组来计算正确的物理地址这就是
使用USING语句的目的
■USING语句不生成任何代码来切换当前寄存器组。汇编程序必须选择正确的寄存器组
■例如,下面的代码选择寄存器组2
PUSH PSW ;保存当前的寄存器组
MOV PSW, #(2 SHL 3);设置寄存器组2
POP PSW ;恢复保存的寄存器组
物理地址按如下计算,即物理地址=(寄存器组X8)+寄存器
■谨慎地使用EQU语句来定义绝对寄存器(AR0~AR7)的符号
■符号值在定义时计算(而不是在使用时)
■如果随后使用USING语句更改寄存器组,则定义的符号将具有错误的地
址,生成的代码可能会失效
■使用USING语句的例子如下:
USING 3 ;选择寄存器组3
PUSH AR2、 ;将寄存器组3中的R2入栈(地址1Ah)
USING 1 ;选择寄存器组1
PUSH AR7 ;将寄存器组1中的R7入栈(地址1Fh)
DB
■ DB语句使用一个或多个字节值初始化存储器
■标号是分配给当前存储器的地址符号
■表达式保存在存储器中的字节值。每个表达式可以是符号、字符串或表达 式
■ DB语句只能在代码或常数段中指定
■如果在不同的段中使用,则会生成错误
■ DB语句的用法如下:
MSG: DB 'Press A Key To Continue', 0
TAB: DB 2, 3, 5,7,11,13,17,19, ‘;’
■ DD语句使用一个或多个32位双字值初始化存储器
■标号是分配给当前存储器的地址符号
■表达式保存在存储器中的双字值.每个表达式可以是符号、字符串或表达式
■ DD语句只能在代码或常数段中指定
■如果在不同的段中使用,则会生成错误
■ DD语句的用法如下:
TABLE: DD TABLE, TABLE+10, NEXT
DD $
NEXT: DD 0
VALS: DD 12345678h, 98765432h, 1
DW
■ DW语句使用一个或多个字值(2个字节)初始化存储器
■标号是分配给当前存储器的地址符号
■表达式保存在存储器中的字值,每个表达式可以是符号,字符串或表达式
■ DD语句只能在代码或常数段中指定
■如果在不同的段中使用,则会生成错误
■ DD语句的用法如下: '
TABLE DW TABLE. TABLE+10, HERE
HERE: DW 0
CTAB: DW CASE0, CASE1, CASE2, CASE3
DW $
DBIT
■ DBIT语句在bit段或ebit段中保留指定个数的位数
■标号是分配给当前存储器地址的符号.
■表达式是要保留的位致
■该语句在当前存储器空间中保留空间,并按保留的位数递增位置 计数器
■该语句的用法如下:
A FLAG: DBIT 1
B FLAG: DBIT 1
DS
■ DS语句在当前的存储器空间中保留指定个数的字节
■标号是分配给当前存储器地址的符号
■表达式是要保留的字节个数
■该语句在当前存储器空间中保留空间,并按保留的字节数递增位
置悔器
■该语句的用法如下:
GAP: DS (($ + 15) AND 0FFF0h) - $ ; 16字节对齐
DS 10
TIME: DS 8
DSB
■ DSB语句与DS语句的功能完全相同
■该语句的用法如下:
COUNT: DSB 10 TIME: DSB 8
DSD
■ DSD语句在当前的存储器空间中保留指定个数的32位双字
■标号是分配给当前存储器地址的符号
■表达式是要保留的双字个数
■该语句在当前存储器空间中保留空间,并按保留的双字个数递增 位置计数器
■该语句的用法如下:
COUNT: DSB 40
TIME: DSB 8
DSW
■ DSW语句在当前的存储器空间中保留指定个数的16位字
■标号是分配给当前存储器地址的混
■表达式是要保留字的个数
■该语句在当前存储器空间中保留空间,并按保留字的个数递增位 置谶器
PROC 和 ENDP
■指令PROC和ENDP用于定义一个标号,用于称为过程的机器指令序列
■对于兼容MCS-251 ISA的STC32G系列单片机来说,过程具有NEAR或 FAR类型这取决于调用它的类型-LCALL或ACALL (用于NEAR); ECALL (用于FAR)
■与C函数不同,汇编器的过程不为标号提供本地作用域。A251中的标识 符必须是唯一的,因为可见性是模块范围的
■该语句的格式如下:
name PROC [type]
......
RET
name ENDP
其中:
name: 指定过程的名字
PROC: 指定这是一个过程函数
type: 指定过程是NEAR/FAR.当未指定类型时,默认为NEAR
RET:程序通常以RET指令结束 .软件指令RET将自动转换为合适的机器返回指令 .RET用于从类型为NEAR的过程返回;ERET用于从类型为FAR的过段返回
ENP:用PROC语句定义的ENDP过程必须以ENDP结束,前面加上过程的名字
LABEL
■该语句为段中的位置定义符号名字,定义的标号继承了父段的属性,不能在段外定义它
■格式为:
符号[:]LABEL [类型]
(可选)标号定义可以包含指定汇编器所要访问类型的类型
■如果未指定类型,则根据段(NEAR用于Code段,BYTE用于Data段,
BIT用于Bit段)设置标号类型
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml11332\wps5.jpg
EXTRN/EXTERN
■该语句(可能出现在汇编源文件中的任何位置)指定当前源文件 使用但在其他目标模块中定义的符号
■定义符号的模块必须使用PUBLIC语句导出符号
■ EXTRN/EXTERN语句指定符号、其存储器类和数据类型
■其格式为:
EXTRN类:(符号1,符号2,…,符号N)
EXTRN/EXTERN类:类型(符号1,符号2,…,符号N)
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml11332\wps6.jpg
NAME
■ NAME语句指定要嵌入此汇编器模格的目标文件中的名字
■指定的模块名字最多可以包含40个字符;且必须遵守符号名字规则
■如果源模块中不存在NAME语句,则将文件名嵌入到目标模块中
■语句格式为:
NAME模块名
注:模块名字未用作目标文件名字
PUBLIC
■ PUBLIC语句指定可以在其他目标模块中使用列出的符号
■指定的符号在生成的对象模块中标记为公共符号,并由链接器用于解析来自其他目标模块的外部引用
■指定为PUBLIC的符号必须在源文件中定义
■下面的符号可以声明为PUBLIC,包括:
■类似BYTE、WORD和BIT等变量;
■在NEAR和FAR存储器中定义的标号;
■使用EQU定义的常数;
BSEG
. BSEG语句选择BIT空间内的绝对段,如果包含可选地址,则汇编器从该地址开始绝对段
■有两种表示位地址的方法:
■指定字节基地址和位偏移鬟有效地址范围为20.0H~2F.7H
■ 21H.5
■指定位号。在位表示法中,有效地址范围为0~127,其映射到 20H.0-2FH.7
・地址21 H.5可以表示为位编号13
.如果省略了可选地址,则汇编器从地址20H开始绝对段(如果没 有定义先前的绝对BIT段)
■如果先前定灯绝对BIT段,则汇编器从该段的末尾开始继续
ISEG
■ ISEG语句选择IDATA空间内的绝对段
.如果包含可选地址,则汇编器从该地址开始
■绝对段有效地址范围为00h~0FFh
■如果省略了可选地址,则汇编器从地址。开始绝对段(如果之前 没有定义绝对IDATA段)。如果先前定义了绝对IDATA段,则 汇编器从该段的末尾开始继续
注:起始地址必须是绝对表达式
RSEG
■ RSEG语句选择一个可重定位的段,该段之前使用SEGMENT语 句进行了声明
■该语句的用法,如下:
MYPROG SEGMENT CODE ;定义一个段
RSEG MYPROG ;选择段
SEGMENT
■ SEGMENT语句声明一个通用的段,它带有存储器类和段位置选 项
■该语句的格式为:
段名字SEGMENT类[重定位[对齐]
其中:
■段名字:指定要分配给段的符号名字。该符号由后续的RSEG语句引用。
它也可以在表达式中用于表示组合段的基地址或起始地址
■类:段的存储器分配。类指定段所在的存储空间,链接器使用它访问属于 该类的所有段
XSEG
. XSEG语句选择XDATA空间内的绝对段
■如果包含可选地址,则汇编器从该地址开始绝对段
■有效地址范围为0000h~0FFFFh
■如果省略了可选地址,则汇编器从地址0开始绝对段(如果之前 没有定义绝对XDATA段)。如果先前定义了绝对XDATA段,则 汇编器从该段的末尾开始继续
注:起始地址必须是绝对表达式
BIT
■ BIT语句为指定的符号分配地址(范围20h~2F或者MCS-251
ISA兼容的单片机位可寻址区域)
■符号不能重定义
. BIT语句为下面可位寻址条项创建一个位名字,包括:
■范围为20H.0~2F.7的绝对地址。比如,23H.2
■在可位寻址空间的SFR位。比如,P3.3或PSW.7.因为SFR符号是绝对的 因此该语句创建一个绝对位
■基于位可寻址数据段中包含的字节的位。如果位可寻址数据段是可重定位 的,则会产生可重定位的位
DATA
■ DATA语句给指定的符号分配地址(范围00h~0FFh)
■ ■不能重新定义符号
■ DATA语句的用法
SERBUF DATA SBUF P0RT1 DATA 90h RESULT DATA 44h
■ EBIT语句的用法
EXTRN DATA : BYTE (EXTBYTE)
DATA SEG SEGMENT DA"
RSEG DATA SEG ;可重定位.可位寻址段
BITS: DS 1 ;一个字节可位寻址的变・
ALARM EBIT, BITS.0 ;BITS中的位0
D1 OPEN EBIT ALARM + 1 :BITS中的位1
D2 OPEN EBIT ALARM+2 :BITS中的位2
X FLAG EBIT EXTBYTE.5 ;在EXTBYTE中的位5
EQU
■EQU语句使用表达式的值创建一个名字为所命名符号的新符号
■使用EQU创建的符号不能重新定义
■表达式可以是寄存器名字,也可以是不带正向引用的简单可重定 位表达式
■用EQU定义的符号可以在操作数、地址或表达式中的任何地方使 用。定义为寄存器的符号可以在任何允许寄存器的地方使用
■如果用EQU定义的符号为PUBLIC,则表达式的计算结果必须为 常数。导出的符号包括名字和值,但可能不包括修复方法。
A251汇编器后指定的表达式替换定义的符号名字的每个出现
■ EQU语句的用法
VAL EQU 45+3 ;简单定义
PUBLIC VAL ;定义PUBLIC
REG1 EQU R1 ;寄存器符号定义
VAR EQU PUTCHAR ;可重定位的符号定义
IDATA
■ IDATA语句为指定的符号分配一个地址(范围00h~0FFh)
■符号不能重新定义
■该语句的用法
BUF IDATA 60h
BUF LEN EQU 20h
BUF END IDATA BUF + BUF LEN - 1
sbit
■ sbit语句定义特殊功能寄存器的位
■语法格式如下:
sbit符号=位地址?
■ sbit语句允许程序开发人员以与C251编译器一致的方式定义
SFR位数据
■使用该语句,程序开发人员可以为C251编译器和A251汇编器使用通用 SFR寄存器定义文件
■该语句的用法,如下所示:
sbit P0_0=P0^0;
sbit P0_1=0x90^1;
SET
■ SET语句使用表达式的值创建一个命名符号的新符号
■可以重新定义使用SET创建的符号
■表达式可以是寄存器的名字,也可以是不带正向引用的简单可重定位表达 式
.用SET定义的符号可以在操作数、地址或表达式中的任何位置使用
■定义为寄存器的符号可以在任何允许寄存器的地方使用
注:(1)不能将用SET定义的符号设置为PUBLIC
(2)不要将SET语句与SET汇编器命令混淆
■ A251汇编器用指定的表达式替换定义的符号名字的每个出现
■该语句的用法
VAL SET 45 ;简单定义
REG1 SET R1 ;公共定义
VAL SET VAL+1 ;重新定义
VAR SET PUTCHAR ;可重定位的符号定义
VAL SET VAL+1 ;重新定义
■ sfr语句定义了特殊功能寄存器
.语法格式如下:
sii■符号=地址;
其中,符号是要定义的SFR符号的名字;地址是SFR的地址
■使用该语句,程序开发人员可以为C251编译器和A251汇编器使 用通用SFR寄存器定义文件
■该语句的用法
sfr P0=0x80;
sfr P1=0x90:
sfr16
■ sfr16语句为汇编程序定义了 16位SFR
注:A251汇编器忽略从sfr16开始的符号定义
■该实现是为了兼容C251编译器
■该语句的用法
sfr16 T2=0xCC; /* AX51 忽略 */
XDATA
■ XDATA语句为指定的符号分配地址(范围0000h~0FFFFh)
■这个符号不能重新定义
■该语法的用法
XD START XDATA 00000h
XD END XDATA 0FFFFh
ERROR
■ _ERROR_使用指定的文本来产生错误的信息
■该语句的用法
IF VARLEN > 10
_ERROR_ "Variable Length is Too Long"
ENDIF
END
■ END语句为汇编器标记输入文件的结束
■该语句是必须的,必须是源文件中的最后一条语句
■如果缺少END语句,将生成错误