转自:http://blog.sina.com.cn/s/blog_6728e8790100i1r1.html
1、DS ---预留存储区命令
格式: 〔标号:〕 DS
其功能是从指定地址开始,定义一个存储区,以备源程序使用。
存储区预留的存储单元数由表达式的值决定。
TMP:
从标号TEP地址处开始保留1个存储单元(字节)。
2、BIT---定义位命令
格式:
其功能用于给字符名称定义位地址。
SPK
经定义后,允许在指令中用SPK代替P3.7。
3、USING指令
USING指令通知汇编器使用8051的哪一个工作寄存器组。
格式: USING 表达式 (值必须为0-3,默认值为0。)
USING 0
使用第0组工作寄存器。
4、SEGMENT指令
SEGMENT 指令用来声明一个再定位段和一个可选的再定位类型。
格式: 再定位段名 SEGMENT 段类型〔再定位类型〕
其中,“再定位段名”用于指明所声明的段。
“段类型”用于指定所声明的段将处的存储器地址空间。
可用的段类型有 CODE、XDATA、DATA、IDATA和BIT。
STACK_SEG SEGMENT IDATA
DATA_SEG SEGMENT DATA
5、RSEG---再定位段选择指令
再定位段选择指令为RSEG,用于选择一个已在前面定义过的再定位段作为当前段。
格式: RSEG 段名
段名必须是在前面已经声明过的再定位段。
DATA_SEG SEGMENT DATA
RSEG
6、绝对段选择指令
CSEG---绝对代码段
DSEG---内部绝对数据段
XSEG---外部绝对数据段
ISEG---内部间接寻址数据段
BSEG---绝对位寻址数据段
格式:
CSEG [AT 绝对地址表达式]
DSEG [AT 绝对地址表达式]
XSEG [AT 绝对地址表达式]
ISEG [AT 绝对地址表达式]
BSEG [AT 绝对地址表达式]
括号内是可选项,用来指定当前绝对段的基地址。
CSEG AT 0000H
AJMP MAIN
7、ORG指令
ORG指令用来改变汇编器的计数器,从而设定一个新的程序起始地址。
格式: ORG 表达式
表达式必须是绝对或简单再定位表达式。
ORG 0000H
AJMP MAIN
设定 MAIN 程序的起始地址为 0000H。
8、END指令
END指令用来控制汇编结束。在每个汇编程序的最后一行必须有一条END指令,
并且END指令只能出现一次。
9、EQU指令
EQU 指令用于将一个数值或寄存器名赋给一个指定的符号名。
格式: 符号名
或
表达式必须是一个简单再定位表达式。
用 EQU 指令赋值以后的字符名,可以用作数据地址、代码地址、位地址或者
直接当做一个立即数使用。
LIMIT
COUNT
10、DATA 指令
DATA 指令用于将一个内部 RAM 的地址赋给指定的符号名。
格式: 符号名
数值表达式的值在 0-255 之间,表达式必须是一个简单再定位表达式。
PORT1
11、DB 指令
DB 指令以表达式的值的字节形式初始化代码空间。
格式: [标号:]
表达式中可包含符号、字符串、或表达式等项,各个项之间用逗号隔开,字符串应用引号括起来。
括号内的标号是可选项,如果使用了标号,则标号的值将是表达式表中第一字节的地址。
DB 指令必须位于 CODE 段之内,否则将会发生错误。
TABLE:
DB 0C0H, 0F9H, 0A4H
TABLE1:
DB " 89C51 "
51汇编程序基本框架
向大家介绍一种可以不用 EQU来定义变量的方法。
先说说用 EQU 定义变量的缺点:
1:人为为每一个变量指定地址,还必须注意防止地址冲突,工作量太大。
2:编译器只是把用 EQU 定义的标识符当作常数而已,在很多情况下当用户把该标识符用错时,编译器不会给出警告或报错。
MOV R0,#MYBYTE
这只是一个例子,实际上还会有其它类似的问题。
如果使用了下面描述的方式,则编译器会帮你指出此类错误。建议 EQU 只用于定义常数,不要做其它用途。
下面是一种比较好的变量定义方法,没有上面所说的缺点。
;定义变量的方法:
;1:定义字节变量用 DS 关键字,语法为:
;
;2:定义位变量用 DBIT 关键字,语法为:
;
;3:定义特殊功能寄存器(SFR)用 DATA 关键字,语法为:
;
;4:定义可位寻址的特殊功能寄存器中的位用 BIT 关键字,语法为:
;
;5:常量定义用 EQU 关键字,语法为:
;
;具体见如下示例:
;51汇编程序基本框架
$NOMOD51
;$INCLUDE
;---------- 特殊功能寄存器定义 (仅作示范,不全)
PCON
;---------- 可位寻址的特殊功能寄存器中的位定义(仅作示范,不全)
;---------- 常量定义
NSTACKSIZE
;---------- 以下为变量定义
;如果MCU没有某些数据段,就删除或注释掉相应的段。
;变量定义有不可重定位和可重定位之分,这二种方式可混合使用。
;需要注意的是,某些编译器对可重定位方式支持的不是很好,
;而且可重定位方式对汇编不是很有用,所以建议不用可重定位方式。
;---- 下面为不可重定位的变量分配方式
; BSEG 关键词指定 BIT 区
; DSEG 关键词指定 DATA 区
; ISEG 关键词指定 IDATA 区
; XSEG 关键词指定 XDATA 区
; CSEG 关键词指定 CDATA 区
;注意:BIT 区的位地址 00H~7FH 范围与 DATA 区的20H~2FH范围是同一存储空间,
; 所以在分配 DATA 区字节变量和 BIT 区位变量时要注意不要重叠。
BEXAMPLE:
BTESTA:
BTESTB:
;在 DATA 区定义变量时要注意不要与 R0~R7 寄存器重叠。
DEXAMPLE:
DTEST:
DLCDBUFFER:
DSEG
DBYTEA:
DBYTEB:
DSEG
DBYTEC:
DBYTED:
DBYTEE:
ISEG
IEXAMPLEA:
IEXAMPLEB:
ISEG
ISTACK:
XSEG
XEXAMPLE0:
XEXAMPLE1:
;==============================================================================;
;CODE 段
A_START:
;==============================================================================;
A_MAIN:
;注意:内存清零不要放在子函数中,
;
;
A_MAIN01:
;用户初始化代码
...
A_LOOP: ;主循环
;用户代码
;用户代码(子程序)
_TEST:
A_UARTINT: //串口中断处理子函数
END