51微控制器
# MCS-51微控制器汇编语言与指令格式
寻址方式 | 寻址空间 |
---|---|
立即寻址 | 程序存储器ROM |
直接寻址 | 片内RAM低128B和特殊功能寄存器 |
寄存器寻址 | 工作寄存器R0~R7和A,B,C,DPTR |
寄存器间接寻址 | 片内RAM低128B[@R0];片外RAM(@R0, @R1, @DPTR) |
变址寻址 | 程序存储器(@A+PC,@A+DPTR) |
相对寻址 | 程序存储器256B范围(PC+偏移量) |
位寻址 | 片内RAM的20H~2FH字节地址,部分特殊功能寄存器 |
# 数据传送类
# 内部数据存储器间数据传送指令
MOV 目的操作数, 源操作数
MOV A, Rn
MOV A, direct
MOV A, @Ri
MOV A, #data
MOV Rn, A
MOV Rn, direct
MOV Rn, #data
MOV direct, A
MOV direct, Rn
MOV direct, direct
MOV direct, @Ri
MOV direct, #data
MOV @Ri, A
MOV @Ri, direct
MOV @Ri, #data
MOV DPTR, #data16
- 目的操作数和源操作数不能有
Rn
和@Ri
配对
# 外部数据存储器间数据传送指令
MOVX A, @DPTR
MOVX @DPTR, A
MOVX A, @Ri
MOVX @Ri, A
# 程序存储器向累加器A传送数据指令
MOVC A, @A+DPTR
MOVC A, @A+PC
# 数据交换指令
XCH A, Rn
XCH A, direct
XCH A, @Ri
XCHD A, @Ri ;A与(Ri)低四位交换
SWAP A ;A低四位和高四位交换
# 堆栈操作类指令
PUSH direct ;SP <-- (SP+1),(SP) <-- (direct)
POP direct ;(direct) <-- (SP),(SP) <-- (SP-1)
# 算数运算类指令
加法和减法的执行结果将影响程序状态标志寄存器PSW的进位位CY、溢出位OV、辅助进位位AC和奇偶校验位P;
乘、除指令的执行结果将影响PSW的溢出位OV、进位位CY和奇偶校验位P;
加1、减1指令的执行结果只影响PSW的奇偶校验位P。
# 加法运算
;不带进位
ADD A, Rn
ADD A, direct
ADD A, @Ri
ADD A, #data
;带进位
ADDC A, Rn
ADDC A, direct
ADDC A, @Ri
ADDC A, #data
;加1指令
INC A
INC Rn
INC direct
INC @Ri
INC DPTR
# 减法运算
;带借位
SUBB A, Rn
SUBB A, direct
SUBB A, @Ri
SUBB A, #data
;减1指令
DEC A
DEC Rn
DEC direct
DEC @Ri
# 乘法运算
MUL AB ;高字节 --> B 低字节 --> A
# 除法运算
DIV AB ;商 --> A 余数 --> B
# 十进制调整指令
- 只用在
ADD
,ADDC
后面
DA A
它的调整过程为: (1)若累加器A的低四位为十六进制的A~F或辅助进位标志AC为1,则累加器A中的内容作加06H调整。 (2)若累加器A的高四位为十六进制的A~F或进位标志CY为1,则累加器A中的内容作加60H调整。
# 逻辑运算及移位类指令
# 基本逻辑与清零
与:ANL
或:ORL
异或:XRL
; 只能对累加器A进行求反与清零
求反:CPL
清零:CLR
# 移位指令
RL A
RR A
RLC A
RRC A
# 控制转移类指令
# 无条件转移
# 长转移指令
LJMP addr16 ;PC <-- addr16
# 绝对转移指令(2B)
AJMP addr11 ;PC10~0 <-- addr11,低11位
# 相对转移指令(2B)
SJMP rel ;rel取值范围-128~127
SJMP $ ;原地等待
# 间接转移指令
JMP @A+DPTR
# 条件转移
# 累加器A判零条件转移指令
JZ rel ;为零转移
JNZ rel ;非零转移
# 比较转移指令
CJNE A, #DATA, rel
CJNE Rn, #data, rel
CJNE @Ri, #data, rel
CJNE A, direct, rel
“大零小一”:大于则C=0,小于则C=1
# 减一不为零转移指令(3B)
DJNZ Rn, rel
DJNZ direct, rel
通常用DJNZ指令来构造循环结构,实现重复处理。DJNZ的指令长度为3个字节
# 子程序调用及返回指令
# 长调用指令
LCALL addr16
执行过程:(PC)←(PC)+3 SP← SP + 1 (SP)←(PCL) SP ← SP + 1 (SP)←(PCH) (PC)←addr16
# 绝对调用指令
ACALL addr11
执行过程:(PC)←(PC)+2 SP ← SP + 1 (SP)←(PC)7~0 (SP)← SP + 1 (SP)←(PC)15~8 (PC)10~0←addr11
# 子程序返回指令
RET
# 中断返回指令
RETI ;会清除中断的优先级触发器
# 位操作类指令
位地址的表示方法:
- 直接用位地址: D4H
- 用特殊功能寄存器名加位数: PSW.4
- 用位名称: RS1
- 用bit定义的有名字的位地址
# 位传送指令
MOV C, bit
MOV bit, C
- 必须使用位运算器C进行传送
# 位置位指令
位清零
CLR C
CLR bit
位置1
SETB C
SETB bit
# 位逻辑指令
+ 位逻辑
+ 求反
CPL C
CPL bit
+ 位与
ANL C,bit
ANL C, /bit
+ 位或
ORL C, bit
ORL C, /bit
# 位条件转移指令
- 以C为条件的位转移指令
JC rel ;C=1转移
JNC rel ;C=0转移
- 以bit为条件的位转移指令
JB bit, rel ;(bit)=1转移
JNB bit, rel ;(bit)=0转移
JBC bit, rel ;(bit)=1转移 且 (bit) <-- 0
# 其他
# 空操作指令(单字节)
NOP
# 伪指令
# ORG伪指令
用于指明程序或数据从程序存储空间什么位置开始存放
# END伪指令
该指令放于程序最后位置,用于指明汇编语言源程序的结束位置
# DB伪指令
用于定义字节数据
ORG 3000H
TAB1: DB 12H, 34H
DB '5', 'A', 'abc'
# DW伪指令
与DB相似,但用于定义字数据
ORG 3000H
TAB2: DW 1234H,5678H
# DS伪指令
保留一定数量的字节单元,保留存贮空间主要为以后存放数据
ORG 2000H
TAB1: DB 12H,34H
DS 4H
DB '5'
# EQU伪指令
符号 EQU 项 ;将项赋值给符号
TAB1 EQU 1000H
# bit伪指令
符号 bit 位地址 ;将位地址用符号重新起名
PLG bit P1.0
之后P1.0可以用PLG使用
# 程序设计方法
ORG 0000H ;主程序入口
AJMP MAIN
ORG 0003H ;中断子程序入口
AJMP INTR0
MAIN: MOV R2,#10H ;主程序
LOOP: LCALL F1
JB 70H,LOP1
LCALL F2
LOP1: LCALL F3
AJMP LOOP
F1: NOP ;子程序
RET
F2: NOP
RET
F3: NOP
RET
INTR0: NOP ;中断子程序
RETI
编辑 (opens new window)
上次更新: 2023/08/09, 13:21:24