目录
2,带Cy(Carry进位标志)的加法指令, Cy用于保存低字节向高字节的进位
1,调用指令,LCALL指令为长调用指令,ACALL绝对调用指令
1,转移指令包括:A是否为零,2个字节数据是否相等,一个操作数减1后是否为零和一个bit的状态等
内部数据传送指令的源操作数和目的操作数都在单片机内部, 一般格式如下:
MOV 目的操作数, 源操作数 ;目的操作数<-源操作数,源操作数不变(相当于COPY)
(1)MOV A,#data ;(A)<-data
(2)MOV Rn,#data ;(Rn)<-data
(3)MOV @Ri,#data ;((Ri))<-data
(4)MOV direct,#data ;(direct)<-data
(1)MOV A,direct ;(A)<-(direct)
(2)MOV direct,A ;(direct)<-(A)
(3)MOV Rn,direct ;(Rn)<-(direct)
(4)MOV @Ri,direct ;((Ri))<-(direct)
(5)MOV direct2,direct1 ;(direct2)<-(direct1)
(1)MOV A,Rn ;(A)<-(Rn)
(2)MOV Rn,A ;(Rn)<-(A)
(3)MOV direct,Rn ;(direct)<-(Rn)
(1)MOV A,@Ri ;(A)<-((Ri))
(2)MOV @Ri,A ;((Ri))<-((A))
(3)MOV direct,@Ri ;(direct)<-((Ri))
外部数据传送指令用于CPU存取外部数据存储器中的数据,数据传送及相关指令共6条,如下:
(1)MOV DPTR,#data16 ;(DPTR)<-data16, DPTR中一般是外部数据存储器单元的地址,16位传送指令
(2)INC DPTR ;(DPTR)<-(DPTR) + 1, 16位加法指令
(3)MOVX A,@DPTR ;(A)<-((DPTR)),将DPTR指定的外部数据存储单元中数据存入A
(4)MOVX @DPTR,A ;((DPTR))<-(A)
(5)MOVX A,@Ri ;(A)<-((Ri))
(6)MOVX @Ri,A ;((Ri))<-(A)
堆栈指令操作数只能采用直接寻址方式
(1)PUSH direct ;进栈指令:(SP)<-(SP)+1,((SP))<-(direct)
(2)POP direct ;出栈指令:(direct)<-((SP)),(SP)<-(SP)-1
数据交换指令用于A与寄存器或内部数据存储单元相互交换数据
(1)XCH A,Rn ;(A)<->(Rn):字节(8bit)相互交换
(2)XCH A,direct ;(A)<->(direct):字节(8bit)相互交换
(3)XCH A,@Ri ;(A)<->((Ri)):字节(8bit)相互交换
(4)XCHD A,@Ri ;(A.3~0)<->((Ri).3~0):半字节(低4bit)相互交换
查表指令采用变址寻址方式,以DTPR或PC作为基址,用来存放表格起始地址,以A作为偏移量。
(1)MOVC A,@A+DPTR ;(A)<-((A)+(DPTR)),DTPR存放表格起始地址,A存放偏移量
(2)MOVC A,@A+PC ;(PC)<-(PC)+1,(A)<-((A)+(PC)),PC存放表格起始地址,A存放偏移量
(1)ADD A,Rn ;(A)<-(A)+(Rn)
(2)ADD A,direct ;(A)<-(A)+(direct)
(3)ADD A,@Ri ;(A)<-(A)+((Ri))
(4)ADD A,#data ;(A)<-(A)+data
(1)ADDC A,Rn ;(A)<-(A)+(Rn)+(Cy)
(2)ADDC A,direct ;(A)<-(A)+(direct)+(Cy)
(3)ADDC A,@Ri ;(A)<-(A)+((Ri))+(Cy)
(4)ADDC A,#data ;(A)<-(A)+data+(Cy)
(1)INC A ;(A)<-(A)+1
(1)INC Rn ;(Rn)<-(Rn)+1
(1)INC direct ;(direct)<-(direct)+1
(1)INC @Ri ;((Ri))<-((Ri))+1
十进制调整指令专门用于BCD码十进制加法运算
DA A
减法指令没有不带Cy(Carry)的减法指令
(1)SUBB A,Rn ;(A)<-(A)-(Rn)-(Cy)
(2)SUBB A,direct ;(A)<-(A)-(direct)-(Cy)
(3)SUBB A,@Ri ;(A)<-(A)-((Ri))-(Cy)
(4)SUBB A,#data ;(A)<-(A)-data-(Cy)
(1)DEC A ;(A)<-(A)-1
(1)DEC Rn ;(Rn)<-(Rn)-1
(1)DEC direct ;(direct)<-(direct)-1
(1)DEC @Ri ;((Ri))<-((Ri))-1
MUL AB ;(B)(A)<-(A)X(B),若积大于255,Cy被置1
DIV AB ;(A)[商]...(B)[余数]<-(A)/(B),Cy,OV被无条件清零
(1)ANL A,Rn ;(A)<-(A)&(Rn)
(2)ANL A,direct ;(A)<-(A)&(direct)
(3)ANL A,@Ri ;(A)<-(A)&((Ri))
(4)ANL A,#data ;(A)<-(A)&data
(5)ANL direct,A ;(direct)<-(direct)&(A)
(6)ANL direct,#data ;(direct)<-(direct)&data
(1)ORL A,Rn ;(A)<-(A)|(Rn)
(2)ORL A,direct ;(A)<-(A)|(direct)
(3)ORL A,@Ri ;(A)<-(A)|((Ri))
(4)ORL A,#data ;(A)<-(A)|data
(5)ORL direct,A ;(direct)<-(direct)|(A)
(6)ORL direct,#data ;(direct)<-(direct)|data
(1)XRL A,Rn ;(A)<-(A)^(Rn)
(2)XRL A,direct ;(A)<-(A)^(direct)
(3)XRL A,@Ri ;(A)<-(A)^((Ri))
(4)XRL A,#data ;(A)<-(A)^data
(5)XRL direct,A ;(direct)<-(direct)^(A)
(6)XRL direct,#data ;(direct)<-(direct)^data
(1)CLR A ;(A)<-0
(2)CPL A ;(A)<-(~A), CPL是取反指令
(1)RL A ;不带Cy左移,(b7)<-(b6)...(b1)<-(b0)<-(b7)
(2)RR A ;不带Cy右移,(b7)->(b6)...(b1)->(b0)->(b7)
(3)RLC A ;带Cy左移,(Cy)<-(b7)<-(b6)...(b1)<-(b0)<-(Cy)
(4)RRC A ;带Cy右移,(Cy)->(b7)->(b6)...(b1)->(b0)->(Cy)
(5)SWAP A ;A的高4bit和低4bit互相交换
(1)MOV C,bit ;(Cy)<-(bit)
(2)MOV bit,C ;(bit)<-(Cy)
(1)CLR C ;(Cy)<-0
(2)CLR bit ;(bit)<-0
(3)SETB C ;(Cy)<-1
(4)SETB bit ;(bit)<-1
(1)ANL C,bit ;(Cy)<-(Cy)&(bit)
(2)ANL C,(~bit) ;(Cy)<-(Cy)&(~bit),(~bit)表示对bit取反
(3)ORL C,bit ;(Cy)<-(Cy)|(bit)
(4)ORL C,(~bit) ;(Cy)<-(Cy)|(~bit)
(5)CPL C ;(Cy)<-(~Cy)
(6)CPL bit ;(bit)<-(~bit)
(1)LJMP addr16 ;(PC)<-addr16,长转移指令
(2)AJMP addr11 ;(PC)<-(PC)+2,(PC10~0)<-addr11,绝对转移指令
(3)SJMP rel ;(PC)<-(PC)+2,(PC)<-(PC)+rel,短转移指令
(4)JMP @A+DPTR ;(PC)<-(A)+(DPTR),变址转移指令
(1)LCALL addr16 ;(PC)<-(PC)+3
;(SP)<-(SP)+1,((SP))<-(PC7~0)
;(SP)<-(SP)+1,((SP))<-(PC15~8)
;(PC)<-addr16
(2)ACALL addr11 ;(PC)<-(PC)+2
;(SP)<-(SP)+1,((SP))<-(PC7~0)
;(SP)<-(SP)+1,((SP))<-(PC15~8)
;(PC10~0)<-addr11
RET ;(PC15~8)<-((SP));(SP)<-(SP)-1
;(PC7~0)<-((SP));(SP)<-(SP)-1
(1)JZ rel ;若(A)=0,则(PC)<-(PC)+2+rel:转移
;若(A)!=0,则(PC)<-(PC)+2:继续执行下一条(2)JNZ rel ;若(A)!=0,则(PC)<-(PC)+2+rel:转移
;若(A)=0,则(PC)<-(PC)+2:继续执行下一条
(1)CJNE A,#data,rel ;(A)=data,(PC)<-(PC)+3:继续执行下一条
;(A)!=data,(PC)<-(PC)+3+rel:转移
;设置Cy标志位
(2)CJNE A,direct,rel ;(A)=(direct),(PC)<-(PC)+3:继续执行下一条
;(A)!=(direct),(PC)<-(PC)+3+rel:转移
;设置Cy标志位
(3)CJNE Rn,#data,rel ;(Rn)=(direct),(PC)<-(PC)+3:继续执行下一条
;(Rn)!=(direct),(PC)<-(PC)+3+rel:转移
;设置Cy标志位
(4)CJNE @Ri,#data,rel ;((Ri))=(direct),(PC)<-(PC)+3:继续执行下一条
;((Ri))!=(direct),(PC)<-(PC)+3+rel:转移
;设置Cy标志位
(1)DJNZ Rn,rel ;(Rn)<-(Rn)-1,若(Rn)!=0,则(PC)<-(PC)+2+rel:转移
;若(Rn)=0,(PC)<-(PC)+2:继续执行下一条
(2)DJNZ direct,rel ;(direct)<-(direct)-1,若(direct)!=0,则(PC)<-(PC)+3+rel:转移
;若(direct)=0,(PC)<-(PC)+3:继续执行下一条
(1)JC rel ;若(Cy)=1,则(PC)<-(PC)+2+rel:转移
;若(Cy)=0,则(PC)<-(PC)+2:继续执行下一条
(2)JNC rel ;若(Cy)=0,则(PC)<-(PC)+2+rel:转移
;若(Cy)=1,则(PC)<-(PC)+2:继续执行下一条
(1)JB bit,rel ;若(bit)=1,则(PC)<-(PC)+3+rel:转移
;若(bit)=0,则(PC)<-(PC)+3:继续执行下一条
(2)JNB bit,rel ;若(bit)=0,则(PC)<-(PC)+3+rel:转移
;若(bit)=1,则(PC)<-(PC)+3:继续执行下一条
(3)JBC bit,rel ;若(bit)=1,则(bit)<-0,(PC)<-(PC)+3+rel:转移
;若(bit)=0,则(PC)<-(PC)+3:继续执行下一条
NOP ;(PC)<-(PC)+1