第六课 第二部分 单片机汇编语言设计
伪指令
伪指令并不产生目标程序,不影响程序的执行,仅仅产生供汇编用的某些指令,以便在汇编时执行一些特殊操作。
设置起始地址ORG (Origin)
ORG addr16 其中,ORG是该伪指令的操作助记符,操作数addr16是16位二进制数,前者表明为后续源程序汇编后的目标程序安排存放位置,后者则给出了存放的起始地址值。ORG伪指令总是出现在每段源程序或数据块的开始。可使程序员把程序、子程序或数据块存放在存储器的任何位置。例如:
ORG 2000H
MOV A, 20H
表示后面的目标程序从2000H单元开始存放。
若在源程序开始不放ORG指令,则汇编将从0000H单元开始存放目标程序。
定义字节DB (Define Byte)
(标号: ) DB <项或项表>
其中项或项表是指一个字节、数或字符串,或以引号括起来的ASCII码字符串。该指令的功能是把项或项表的数值(字符则用它的ASCI码表示)
存入从标号开始的连续单元中。
例如: HERE: DB 84H (HERE) =84
DB 43H (HERE+1) =43H
又如: ORG 1000H
SEG: DB 23H,'MCS-51'
定义字DW (Define Word)
(标号: ) DW <项或项表>
DW的基本含义与DB相同,但DB一般用于定义8位数据(一个字节) DW定义16位数据
即一个字。在执行汇编程序时,机器会自动按低位字节在前,高位字节在后的格式排列(与程序中的地址规定一致) 。所以DW伪指令常用来建立地址表。
例:
ABC: DW 1234H.08H
ABC: DB 12H,34H,00H.08H
上两条指令是等价的。
伪指令DB、DW均是根据源程序需要,用来定义程序中用到的数据(地址) 或数据块
般应放在源程序之后,汇编后的数据块将紧挨着目标程序的末尾地址开始存放
为标号赋值EOU
(标号 ) EQU <数值或表达式>
其功能是将语句操作数的值赋于本语句的标号,故又称为等值指令。相当于 C语言#define
如: BLK EQU 1000H ;起别名
DATA指令 符号名 DATA 表达式
DATA 指令用于将一个内部 RAM 的地址赋给指定的符号名。
数值表达式的值在00H~0FFH之间,表达式必须是一个简单表达式。如:
BUFFER DATA 40H ;起别名
XDATA指令(External Data)
符号名 XDATA 表达式
XDATA 指令用于将一个外部 RAM 的地址赋给指定的符号名。数值表达式的值在0000H~OFFFFH之间,表达式必须是一个简单表达式。如:
MYDATA XDATA 0400H
定义位命令BIT 字符名称 BIT 位地址
该指令用于给字符名称定义位地址。如:
DOGOUT BIT P3.4 ;给看门狗起别名
经定义后,允许在指令中用DOGOUT代替P3.4。
文件包含命令INCLUDE
文件包含命令INCLUDE用于将寄存器定义文件 (一般的后缀名为.INC) 包含于当前程序中,与C语言中的#include语句的作用类似。使用格式为:
$ISNCLUDE (文件名)
可以STC8H8K64U单片机的寄存器定义保存在文件STC8H.INC中,使用时,将STC8H.INC文件拷贝到当前工程文件夹或者Keil安装文件夹的C51MNC文件夹中,并在程序的开始处使用下面的命令将其包含到用户程序中:
$INCLUDE(STC8H.INC)
使用上述命令后,在用户程序中就可以直接使用STC8H8K64U单片机的特殊寄存器名称
了。例如:
MOV P1M1,#00000000B
MOV P1M0.#00000001B ;设置P1口的工作模式
源程序结束 END
END 《表达式)
END语句是一个结束标志,它告诉汇编程序,该程序段已结束。因此,该语句必须放在整个程序(包括伪指令)之后
- ;点灯
- $include (stc32g.inc)
- ORG 0000H
- LJMP MAIN
- ORG 0100H
- MAIN: MOV SP, #70H
- MOV P2M1,#3CH
- MOV P2M0,#3CH
- main_loop: CLR P2.0;
- LCALL DELAY500MS;
- SETB P2.0;
- LCALL DELAY500MS;
- LJMP main_loop;
- DELAY500MS: ;@11.0592MHz
- PUSH DR0
- MOV WR0,#21
- MOV WR2,#6142
- NEXT:
- DEC DR0,#1
- JNE NEXT
- POP DR0
- RET
- END
复制代码
- MCS-51系列单片机汇编语言程序框架
- ORG 0000H
- LJMP MAIN ;跳转到主程序
- ORG 0003H
- LJMP INTO ISR;外部中断0入口
- ORG 000BH
- LIMP TO_ISR ;定时器0中断入口
- ORG 0013H
- LJMP INT1_ISR ;外部中断1入口
- ORG 001BH
- LJMP TI_ISR;定时器1中断入口
- ORG 0023H
- LJMP UART_ISR ;串口通信中断入口
-
- ORG 0100H
- MAIN: MOV SP,#70H ;设置堆栈指针
- ......;初始化内存区域内容
- ......;设置有关SFR的控制字
- ......;开放相应的中断控制
- LOOP:
- ;进入主程序循环
- LJMP LOOP
- ;下面是各个中断服务子程序的入口
- INTO_ISR:......;外部中断0服务子程序
- ......;根据需要填入适当的内容
- RETI
- INT1_ISR:......;外部中断1服务子程序
- ......;根据需要填入适当的内容
- RETI
- TO_ISR:......;定时器0中断服务子程序
- ......;根据需要填入适当的内容
- RETI
- T1_ISR:......;定时器1中断服务子程序
- ......;根据需要填入适当的内容
- RET
- UART_ISR:......;串口通信中断服务子程序@V
- ......;根据需要填入适当的内容
- RETI
- ;下面可以编写其他子程序
- ;或者使用DB定义程序中所用的常数
复制代码
|