C51汇编伪指令
来源:互联网 发布:mac语言切换 编辑:程序博客网 时间:2024/06/06 13:13
C51汇编伪指令:
1、DS ---预留存储区命令
格式: 〔标号:〕 DS 表达式值
其功能是从指定地址开始,定义一个存储区,以备源程序使用。
存储区预留的存储单元数由表达式的值决定。
TMP: DS 1
从标号TEP地址处开始保留1个存储单元(字节)。
2、BIT---定义位命令
格式: 字符名称 BIT 位地址
其功能用于给字符名称定义位地址。
SPK BIT P3.7
经定义后,允许在指令中用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 ;声明一个再定位DATA段
RSEG DATA_SEG ;选择前面声明的再定位DATA段作为当前段
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 表达式
或 符号名 EQU 寄存器名
表达式必须是一个简单再定位表达式。
用 EQU 指令赋值以后的字符名,可以用作数据地址、代码地址、位地址或者
直接当做一个立即数使用。
LIMIT EQU 1200
COUNT EQU R5
10、DATA 指令
DATA 指令用于将一个内部 RAM 的地址赋给指定的符号名。
格式: 符号名 DATA 表达式
数值表达式的值在 0-255 之间,表达式必须是一个简单再定位表达式。
PORT1 DATA 40H
11、DB 指令
DB 指令以表达式的值的字节形式初始化代码空间。
格式: [标号:] DB 表达式表
表达式中可包含符号、字符串、或表达式等项,各个项之间用逗号隔开,字符串应用引号括起来。
括号内的标号是可选项,如果使用了标号,则标号的值将是表达式表中第一字节的地址。
DB 指令必须位于 CODE 段之内,否则将会发生错误。
TABLE:
DB 0C0H, 0F9H, 0A4H
TABLE1:
DB " 89C51 "
51汇编程序基本框架
向大家介绍一种可以不用 EQU来定义变量的方法。
先说说用 EQU 定义变量的缺点:
1:人为为每一个变量指定地址,还必须注意防止地址冲突,工作量太大。
2:编译器只是把用 EQU 定义的标识符当作常数而已,在很多情况下当用户把该标识符用错时,编译器不会给出警告或报错。
例如,假设想在 IDATA 区定义一个变量,如果用 EQU方式作如下定义:
MYBYTE EQU87H ;(其实编译器只是将 MYBYTE视为一个常量而已)如果想将该变量(位于 IDATA 区)赋值到累加器 A,正确的访问方式应该是
MOV R0,#MYBYTE
MOV A,@R0
如果程序员将上面的语句错写为:
MOV A,MYBYTE
(原因可能是粗心,或者忘记了 MYBYTE 是大于 7FH的)
编译器不会为此报错,结果执行的操作是将地址为 87H的特殊功能寄存器的内容赋值到 A,而不是将 IDATA 区的 87H 赋值到 A,与用户的本意大相径庭。
这只是一个例子,实际上还会有其它类似的问题。
如果使用了下面描述的方式,则编译器会帮你指出此类错误。建议 EQU 只用于定义常数,不要做其它用途。
下面是一种比较好的变量定义方法,没有上面所说的缺点。
;定义变量的方法:
;1:定义字节变量用 DS 关键字,语法为:
; 变量名: DS 分配的字节数
;2:定义位变量用 DBIT 关键字,语法为:
; 位变量名: DBIT 分配的位数
;3:定义特殊功能寄存器(SFR)用 DATA 关键字,语法为:
; 寄存器名: DATA 寄存器地址
;4:定义可位寻址的特殊功能寄存器中的位用 BIT 关键字,语法为:
; 位名: BIT 位地址
;5:常量定义用 EQU 关键字,语法为:
; 常量名: EQU 常数
;具体见如下示例:
;51汇编程序基本框架
$NOMOD51 ;如果不使用默认的 51特殊功能寄存器定义,可以用本语句取消。
;$INCLUDE (W79E825.INC) ;用此语句可以包含头文件
;---------- 特殊功能寄存器定义 (仅作示范,不全)
P0 DATA 080H
SP DATA 081H
DPL DATA 082H
DPH DATA 083H
PCON DATA 087H
TCON DATA 088H
TMOD DATA 089H
TL0 DATA 08AH
TL1 DATA 08BH
TH0 DATA 08CH
TH1 DATA 08DH
P1 DATA 090H
SCON DATA 098H
SBUF DATA 099H
P2 DATA 0A0H
IE DATA 0A8H
PSW DATA 0D0H
;---------- 可位寻址的特殊功能寄存器中的位定义(仅作示范,不全)
BITIT0 BIT TCON.0 ;外部中断0触发方式
BITIE0 BIT TCON.1 ;外部中断0标志
BITIT1 BIT TCON.2 ;外部中断1触发方式
BITIE1 BIT TCON.3 ;外部中断1标志
BITTR0 BIT TCON.4 ;定时器0启动控制
BITTF0 BIT TCON.5 ;定时器0溢出标志
BITTR1 BIT TCON.6 ;定时器1启动控制
BITTF1 BIT TCON.7 ;定时器1溢出标志
BITRI
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
;---------- 可位寻址的特殊功能寄存器中的位定义(仅作示范,不全)