5 MCS-51指令系统
作者:
MingXiao
5.1 指令概述
在系统定时时,最小间隔就是机器周期,12MHz的最小间隔就是1us
通用寄存器
在8bit寄存器间接寻址时,只能使用R0, R1,即
MOV A, @R0 ;@R1
R0, R1统称为Ri,R0-R7统称为Rn
16bit直接用DPTR
5.2 寻址方式
立即寻址
MOV A, #10H ;10H为idata优点是很快,缺点是占用ROM空间,因为立即数在机器码中占1B
直接寻址
MOV A, 10H ;10H为地址单元寄存器寻址
MOV A, R0虽然
R0地址为00H,但这条指令是单字节、单周期,而直接寻址是双字节、双周期寄存器间接寻址
MOV A, @R0 MOV B, @DPTR使用
R0, R1时,表示8bit寻址;使用DPTR时,表示16bit寻址基址变址寻址
MOVC A, @A+DPTR MOVC A, @A+PC ;执行时先要PC+=1,然后才赋值MOVC是程序存储器,但不一定外部;只有DPTR, PC能够基址变址寻址(作为基址使用)相对寻址
JC LABEL短距离跳转用
位寻址
SETB 3DH ;将27H.5位置为1 CLR C ;将CY置为0按位寻址来
5.3 数据传输类指令
例:将外部RAM的100H地址处的数据存放在200H处
MOV DPTR, #0100H
MOVX A, @DPTR
MOV DPTR, #0200H
MOVX @DPTR, A
查表
MOV DPTR, #0100H ;CODE Seg内的数据头位置
MOV A, R0
MOVC A, @A+DPTR
ORG 0100H
DB 0, 1, 4, 9
交换指令
XCH A, Rn ;交换A,Rn
XCH A, idata ;交换A,(idata)
XCHD A, @Ri ;交换低位, A.3-A.0 与 (Ri).3-(Ri).0
SWAP A ;交换A的高低位, A.3-A.0 与 A.7-A.4
5.4 算术运算指令
对A操作,均对PSW有影响
ADD A, #data ;不带进位
ADDC A, #data ;带进位,+CY
INC A ;A += 1
MOV A, #00010101 BCD ;BCD表示
ADD A, #8 ;A = 1DH,按二进制加
DA A ;修正BCD指令,A = 23H
CLR C ;清空CY
SUBB A, #data ;带借位,A = A - #data -CY,故第一次减法前要 CLR C
DEC A ;A -= 1
;乘除只能用AB
MUL AB ;BA = A*B,高8bit在B,低8bit在A
DIV AB ;A/B,商在A,余数在B
5.5 逻辑运算类指令
目的操作数为A时,影响PWS
ORL A, #data ;按位或
ORL A, address ;若为I/O口,则读引脚
ORL address, A ;(address)按位或A
ORL address, #data ;后两条指令若地址为I/O口,则为读锁存器-改写指令
ANL A, #data ;按位和
XRL A, #data ;按位异或
CPL A ;按位取反,A = A_bar
CLR A ;清零
RL A ;Rotate Left,A循环左移1bit
RR A ;循环右移1bit
RLC A ;CY-A.7-A.0循环左移,CY是MSB
RRC ;CY是MSB,循环右移
5.6 控制转移类指令
改变的是PC,对PSW无影响
AJMP addr11 ;短转移,2KB,即两个地址高5bit一致,且在同一个页内
;也就是不是在转移开始的2k,而是定死的
LJMP addr16 ;长转移,64KB
SJMP rel ;相对转移,-128~127,用的是偏移地址
JMP @A+DPTR ;间接转移,-128~127,常用的散转分支转移语句
JZ rel ;A=0转移,偏移地址,可以是label,下同
JNZ rel ;A!=0转移
CJNE A, #data, rel ;比较A与#data,不等就跳转,偏移地址;同时会A-#data,仅改变CY
;A的位置也能写Rn和@Ri
DJNZ Rn, rel ;先将Rn-1,若Rn!=0则跳转,Rn的位置可以写地址
JC rel ;JMP Carry,CY=1就JMP
JNC rel ;JMP Not Carry
JB bit, rel ;位地址(bit)=1,JMP
JNB bit, rel ;(bit)=0
JBC bit, rel ;若(bit)=1,则将其置为0,并JMP
LCALL addre16 ;长调用指令,16bit,64KB,指令3B,可以用label代替addre,PC+3压栈
ACALL addre11 ;短调用指令,11bit,2KB,指令2B,可以用label,PC+2压栈
RET ;子程序返回指令,栈顶的PC返回给PC,弹栈两次
RETI ;中断例程返回,栈顶PC返回,弹栈,对中断优先级状态触发器的清零
5.7 位操作指令
涉及到能按位寻址的寄存器等
MOV C, P1.0 ;将P1口的第0bit赋给CY寄存器
CLR C
SETB C ;令CY=1
ANL C, /P1.0 ;将P1.0取反后与C做and,赋给C,P1.0本身不会改变