51手记之指令篇
在介绍各条分类指令之前,将指令中的操作数及注释中的符号说明如下。
Rn:当前指定的工作寄存器组中的Ro-R7(其中n=0,1,2,…,7)。
Ri:当前指定的工作寄存器组中的RO,R1(其中i=0,1)。
(Ri):Ri间址寻址指定的地址单元。
((Ri)):Ri间址寻址指定地址单元中的内容。
dir:8位直接字节地址(在片内RAM和SFR存储空间中)。
#data8:8位立即数。
#datal6:16位立即数。
addrl6:16位地址值。
addrll:11位地址值。
bit:位地址(在位地址空间中)。
rel:相对偏移量(一字节补码数)。
下面介绍各条分类指令的主要功能和操作,详细的指令操作说明及机器码形式可见附录。
一、数据传送与交换类指令
共有28条指令,包括以A,Rn,DPTR,直接地址单元,间接地址单元为目的的操作数的指令;访问外部RAM的指令;读程序存储器的指令;数据交换指令以及准栈操作指令。
1.以A为目的的操作数
MOVA,Rn; A="Rn"
MOVA,dir; A=(dir)
MOVA,@Ri; A=((Ri))
MOVA,#data; A="#data"
2.以Rn为目的的操作数
MOVRn,A; Rn="A"
MOVRn,dir; Rn=(dir)
MOVRn,#data; Rn="#data"
3.以DPTR为目的的操作数
MOVDPTR,#data16;DPTR=#data16
4.以直接地址为目的的操作数
MOVdir,A; dir="A"
MOVdir,Rn; dir="Rn"
MOVdir,dir’; dir=(dir’)
MOVA,@Ri; dir=((Ri))
MOVA,#data; dir="#data"
5.以间接地址为目的的操作数
MOV@Ri,A; (Ri)=A
MOV@Ri,dir; (Ri)=dir
MOV@Ri,#data; (Ri)=#data
6.访问外部数据RAM
MOVXA,@DPTR;A=((DPTR))
MOVXA,@Ri;A=((P2 Ri))
MOVX@DPTR,A;(DPTR)=A
MOVXRi,A;(P2 Ri)=A
例1:DPTR=2000H,外部RAM(2000H)=18H,指令MOVX A,@DPTR执行后,A=18H。
例2:P2=10H,R1=50H,A=64H,指令MOVX @R1,A执行后,外部RAM(1050H)=64H。
7.读程序存储器
MOVCA,@A+DPTR;A=((A+DPTR))
MOVCA,@A+PC;A=((A+PC))
8.堆栈操作
PUSH dir;SP十1-6P,(dir)一(SP)
POP dir;((SP))一dir,SP-1--P,
例1:SP=07H,(35H)=55H,指令PUSH 35H执行后,55H送入08H地址单元,SP=08H。
例2:SP=13H,(13H)= 1FH,指令POP 25H执行后,1FH压入25H地址单元,SP此时为12H。
二、算术运算类指令
共有24条指令,主要包括加、减、乘、除、增量、减量和十进制调整等指令。其中,大多数指令都同时以A为源操作数之一和目的操作数。
1.加指令
ADDA,Rn; A+Rn=A
ADDA,dir; A+(dir)=A
ADDA,@Ri; A+((Ri))=A
ADDA,#data; A+#data=A
2.带进位加
ADDCA,Rn; A+Rn+C=A
ADDCA,dir; A+(dir)+C=A
ADDCA,@Ri; A+((Ri))+C=A
ADDCA,#data; A+#data+C=A
3.带借位减
SUBBA,Rn; A-Rn-C=A
SUBBA,dir; A-(dir)-C=A
SUBBA,@Ri; A-((Ri))-C=A
SUBBA,#data; A-#data-C=A
说明:借位位来自程序状态字PSW中的进位位C,只是在作减法运算时,被用作借位位。
例:A=38H,R1=20H,(20H)=23H,C=1指令SUBB A,@R1执行后,A=14H。
4.乘法指令
MUL AB;A×B = BA
说明:本指令实现8位无符号乘法。A,B中各放一个8位乘数,指令执行后,16位积的高位在B中,低位在A中。
例A=50H,B=40H,指令MUL AB执行后,A=00H,B=32H
5.除法指令
DIV AB;A÷B的商在A中,余数在B中
说明:本指令实现8位无符号除法。A放被除数,B放除数,指令执行后,A中为商,B中为 余数。若除数B=00H,则指令执行后,溢出标志OV=1,且A,B内容不变。
例1:A=28H,B=12H,指令DIV AB执行后,A=02H,B=04H。
例2:A=08H,B=09H,指令DIV AB执行后,A=00H,B=08H。
6.增量
INCA
INCRn
INCdir
INC@Ri
INCDPTR
7.减量
DECA
DECRn
DECdir
DEC@Ri
DECDPTR
8.十进制调整
DAA;把A中按二进制相加后的结果调整成按BCD数相加的结果
综合例1:把在R4和R5中的两字节数取补(高位在R4中)
CLRC
MOVA,R5
CPLA
INCA
MOVR5,A
MOVA,R4
CPLA
ADDCA,#00H
MOVR4,A
SJMP$
综合例2:把R7中的无符号数扩大10D倍(设原数小于25D)
MOVA,R7
MOVB,#0AH
MULAB
MOVR7,A
SJMP$
综合例3:把R1R0和R3R2中的2个4位跃D数相加,结果送入R5R4中,如有进位则存于进位位C中。
CLRC
MOVA,R0
ADDA,R2
DAA
MOVR4,A
MOVA,R1
ADDCA,R3
DAA
MOVR5,A
SJMP$
在MCS-51系列单片机的算术运算类指令中,乘除法指令是许多8位微处理器和一些8位单片机所没有的,执行时间为4个机器周期。这种指令对编制比较复杂的运算程序,例如,比例-积分-微分(PID)运算、浮点运算、多字节数乘除运算等是经常要用到的。
评论