51手記之指令篇
在介紹各條分類指令之前,將指令中的操作數及注釋中的符號說明如下。
Rn:當前指定的工作寄存器組中的Ro-R7(其中n=0,1,2,…,7)。
Ri:當前指定的工作寄存器組中的RO,R1(其中i=0,1)。
(Ri):Ri間址尋址指定的地址單元。
((Ri)):Ri間址尋址指定地址單元中的內容。
dir:8位直接字節(jié)地址(在片內RAM和SFR存儲空間中)。
#data8:8位立即數。
#datal6:16位立即數。
addrl6:16位地址值。
addrll:11位地址值。
bit:位地址(在位地址空間中)。
rel:相對偏移量(一字節(jié)補碼數)。
下面介紹各條分類指令的主要功能和操作,詳細的指令操作說明及機器碼形式可見附錄。
一、數據傳送與交換類指令
共有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執(zhí)行后,A=18H。
例2:P2=10H,R1=50H,A=64H,指令MOVX @R1,A執(zhí)行后,外部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執(zhí)行后,55H送入08H地址單元,SP=08H。
例2:SP=13H,(13H)= 1FH,指令POP 25H執(zhí)行后,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
說明:借位位來自程序狀態(tài)字PSW中的進位位C,只是在作減法運算時,被用作借位位。
例:A=38H,R1=20H,(20H)=23H,C=1指令SUBB A,@R1執(zhí)行后,A=14H。
4.乘法指令
MUL AB;A×B = BA
說明:本指令實現8位無符號乘法。A,B中各放一個8位乘數,指令執(zhí)行后,16位積的高位在B中,低位在A中。
例A=50H,B=40H,指令MUL AB執(zhí)行后,A=00H,B=32H
5.除法指令
DIV AB;A÷B的商在A中,余數在B中
說明:本指令實現8位無符號除法。A放被除數,B放除數,指令執(zhí)行后,A中為商,B中為 余數。若除數B=00H,則指令執(zhí)行后,溢出標志OV=1,且A,B內容不變。
例1:A=28H,B=12H,指令DIV AB執(zhí)行后,A=02H,B=04H。
例2:A=08H,B=09H,指令DIV AB執(zhí)行后,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中的兩字節(jié)數取補(高位在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位單片機所沒有的,執(zhí)行時間為4個機器周期。這種指令對編制比較復雜的運算程序,例如,比例-積分-微分(PID)運算、浮點運算、多字節(jié)數乘除運算等是經常要用到的。
評論