标题：单片机系统指令
mcs-51单微机处理指令
MCS-51共111条指令， 
指令分类 
1、按指令所占的字节来分： 
(1)单字节指令（49条） 如MOV A，R2，(机器码11101010) 
(2)双字节指令（46条） 如MOV A，#0BH，(机器码74H，        
0BH)
(3)三字节指令（16条） 如MOV 0BH, #0BH ,(机器码75H, 
0BH,0BH)
2、按指令的执行时间来分：（1个机器周期为12个时钟周期） 
(1) 1个机器周期（64条） ，如MOV A，R2 MOV A，#0BH， 
(2) 2个机器周期（45条） ，如MOV 0BH, #0BH 
(3) 4个机器周期（2条） ，乘、除指令。
指令格式
一、按操作码和操作数分 
1、操作码：用来规定指令进行什么操作 
如MOV A，#0BH，(机器码74H，0BH)
其中74H为操作码，指明“将立即数送入ACC”这种操作； 
2、操作数：则是指令操作的对象,有可能是数据,也可能是地址 
如MOV A，#0BH，其中#0BH为操作数。 
有单字节指令、双字节指令、三字节不同长度的指令，格式不同： （1）单字节指令：操作码、操作数同在一个字节中。 
（2）双字节指令：操作码+操作数。 
（3）三字节指令：操作码+操作数+操作数。 
二、按助记符和操作数分 mcs-51指令小结(5张)
操作助记符[目的操作数，源操作数] 
如MOV A，#0BH，(机器码74H，0BH)，其中： 
(1)MOV为操作助记符, 指明“内部数据传送”这种操作； 
(2)A为目的操作数，指明“数据传送的目的寄存器”是A； 
(3) #0BH为源操作数。
指令系统的寻址方式
访问指令
一、操作数在寄存器中； 
如MOV  A，Rn  ；(Rn)→A，n=0～7 
1、4组工作寄存区，共32个工作寄存器。 
2、部分特殊功能寄存器，例如A、B 及DPTR等。  
二、访问片外数据存储器 
(1)用R0或R1作为间址寄存器，寻址范围为片外低256个字节； 
(2)用DPTR作为间址寄存器，寻址范围为片外64K。 
a)                      MOVX  A，@Ri     ；i=0或1 
若(Ri)=70H，把外部RAM中70H单元的内容送到A 
b)                      MOVX  A，@DPTR 
若(DPTR)=2000H，把外部RAM中2000H单元的内容送到A 
3、堆栈操作指令访问堆栈区
堆栈专用操作指令PUSH（压栈）和POP（出栈）使用堆栈 
指针（SP）作间址寄存器 
指令PUSH(压栈)和POP(出栈)，无前缀标志“@” 
四、立即(数)寻址方式 
操作数在指令中直接给出,需在操作数前面加前缀标志“#”。
如MOV   A，#40H，此时立即数在程序存储单元中。 
五、基址寄存器加变址寄存器间址寻址方式 
1、以DPTR或PC作基址寄存器，以累加器A作为变址寄存器；   
2、基址寄存器+变址寄存器形成操作数地址； 
3、本寻址方式专门针对程序存储器，寻址范围可达到64KB。 
4、本寻址方式的指令只有3条： 
MOVC   A，@A+DPTR 
MOVC   A，@A+PC 
JMP    @A+DPTR 
前2条又称查表指令，将程序存储器单元内容给ACC；       
后1条为散转指令，属于转移类指令。
（注）
（1）本寻址方式是专门针对程序存储器的寻址方式，寻址范围可达到64KB。 
（2）本寻址方式的指令只有3条： 
MOVC   A，@A+DPTR 
MOVC   A，@A+PC 
JMP    @A+DPTR 
六、位寻址方式
89C51有位处理功能，可以对数据位进行操作， 
如MOV  C，40H是把位40H的值送到进位位C。 
寻址范围： 
1、内部RAM中的位寻址区（20H—2FH），有2种表示方法。 
(1) 直接给出位地址，如MOV  C，40H； 
(2) 单元地址加位数，如MOV  C，(28H).0，指的是28H单元中的最低位。 
2、SFR中的可寻址位（70H—FFH，共83位），有4种表示方法。
(1) 直接给出位地址，如MOV  C，0D5H(PSW.5的位地址)； 
(2) 直接写位名称，如MOV  C，F0； 
(3) 单元地址加位数，如MOV  C， (0D0H).5； 
(4) SFR符号加位数，如MOV  C， PSW.5。 
七、相对寻址方式
在相对寻址的转移指令中，给出了地址偏移量“rel”，即 
把PC的当前值+ rel 就构成了程序转移的目的地址。即 
目的地址=转移指令所在的地址+ 转移指令的字节数+ rel   
偏移量rel是带符号的8位二进制补码数,范围是：–128 ~ +127 ； 
注意：PC的当前值是紧接在转移指令后的下一条指令的PC值。 
指令系统分类介绍
指令中符号意义： 
DPTR数据指针，可用作16位的数据地址寄存器。 
bit内部RAM或特殊功能寄存器中的直接寻址位。 
C（或Cy）进位标志位或位处理机中的累加器。 
addr11  11位目的地址 
addr16  16位目的地址 
@ 间接寻址寄存器前缀，如@Ri，@A+DPTR 
(X)X中的内容。 
((X))由X寻址的单元中的内容。 
→箭头右边的内容被箭头左边的内容所取代。
Rn 当前寄存器区的8个工作寄存器R0～R7(n=0～7)。 
Ri 当前寄存器区中可作间接寻址寄存器的2个寄存器R0、R1 
(i=0,1)。 
Direct直接地址，即8位的内部RAM或特殊功能寄存器的字节 
地址。 
#data  包含在指令中的8位立即数。 
#data16  包含在指令中的16位立即数。 
rel相对转移指令中的偏移量，为8位的带符号补码数。             
数据传送类指令
格式：MOV或MOVX或MOVC  <目的操作数>，<源操作数> 
将源操作数复制给目的操作数，源操作数不变，而不是“
搬家”。数据传送类指令不影响标志位Cy、Ac和OV，影响奇偶标志位P。 
一、以累加器为目的操作数的指令 
MOV  A, Rn      ; (Rn)→A，n=0～7 
MOV  A, @Ri     ; ((Ri))→A,i=0,1 
MOV  A, direct  ;(direct)→A 
MOV  A, #data   ; #data→A 
二、以Rn为目的操作数的指令 
MOV   Rn, A       ; (A)→Rn,  n=0～7 
MOV   Rn, direct  ;(direct)→Rn,  n=0～7 
MOV   Rn, #data    ; #data→Rn,  n=0～7 
三、以直接地址direct为目的操作数的指令 
MOV direct, A ; (A)→direct 
MOV direct, Rn ;(Rn)→direct, n=0～7 
MOV direct1, direct2; 
MOV direct, @Ri ;((Ri))→direct 
MOV direct, #data ; #data→direct 
注意：寄存器之间不可相互传送数据； 
直接地址之间可相互传送数据。
直接寻址方式（直接给出操作数的单元地址） 
寻址范围： 
1、内部RAM的128个单元(00-7FH) 
2、特殊功能寄存器(80-FFH) ，注意SFR区单元除了以单元地址的形式外，还可用寄存器符号的形式给出，如： 
MOV  A，80H 与  MOV  A，P0是等价的。 
直接寻址方式是访问特殊功能寄存器的唯一寻址方式 
四、以寄存器间接地址为目的操作数的指令 
MOV   @Ri, A       ;(A)→((Ri)),i=0,1 
MOV   @Ri, direct  ;(direct)→((Ri)) 
MOV   @Ri, #data   ; #data→((Ri)) 
五、16位数传送指令
MOV   DPTR, #data16   ; #data16→DPTR 
唯一的16位数据的传送指令, 
立即数的高8位送入DPH， 
立即数的低8位送入DPL。
六、堆栈操作指令 
内部RAM中可以设定一个后进先出(LIFO-Last In First Out)的区域称作堆栈，堆栈指针SP始终指向堆栈的 
栈顶位置。 
1、进栈指令    PUSH   direct 
先将栈指针SP加1，然后把direct中的内容送到SP指示的内部RAM单元中
2、出栈指令         POP  direct 
SP指示的栈顶(内部RAM单元)内容送入direct字节单元 
中，栈指针SP减1
七、累加器A与外部数据存储器传送指令 
MOVX  A, @DPTR ;((DPTR))→A,读外部RAM/IO 
MOVX  A, @Ri ;((Ri))→A,读外部RAM/IO 
MOVX@DPTR, A ;(A)→((DPTR)),写外部RAM/IO 
MOVX@Ri, A ;(A)→((Ri)),写外部RAM/IO 
功能：A与外部RAM存储器传送数据，RD*（P3.7）或WR*（P3.6）信号有效。 
1、采用DPTR间接寻址时，高8位地址（DPH）由P2口输出，低8位地址（DPL）由P0口输出。 
2、采用Ri（i=0,1）间接寻址时，可寻址片外256个单元的数据存储器。Ri内容（地址）由P0口输出。 
3、数据均由P0口输出。
八、查表指令
用于读程序存储器（内外）中的表格数据的指令，仅两条 
，均采用基址寄存器加变址寄存器间接寻址方式。 
1、MOVC   A,@A+PC 
(1) 以PC作为基址寄存器，A为变址寄存器； 
(2) 两寄存器的内容相加，得到一个16位的地址； 
(3) 取出此地址中的数据，传送给ACC。 
注意：PC中的内容为下一条指令的起始地址,PSEN信号有效（作用同RD*、WR*）。
2、MOVC   A，@A+DPTR 
(1) 以DPTR 作为基址寄存器，A为变址寄存器； 
(2) 两寄存器的内容相加，得到一个16位的地址； 
(3) 取出此地址中的数据，传送给ACC。 
如  (DPTR)=8100H   (A)=40H  执行指令       
MOVC   A, @A+DPTR 
执行结果将程序存储器中8140H的内容送入A。 
本指令的执行结果只和指针DPTR及累加器A的内容有关， 
与该指令存放的地址及常数表格存放的地址无关，因此表格的 
大小和位置可以在64K程序存储器中任意安排，一个表格可以 
为各个程序块公用。 
功能指令
一、字节交换指令 
XCH   A, Rn 
若(A)=80H,(R7)=08H，执行后(A)=08H,(R7)=80H 
XCH   A, direct 
若(A)=80H,(40H)=F0H，执行后(A)=F0H ,(40H)= 80H
XCH   A, @Ri 
若(A)=80H , (R0)=6AH, (6AH)=0FH ， 
执行后(A)=0FH,(6AH)=80H 
二、半字节交换指令 
XCHD   A, @Ri    累加器的低4位与内部RAM低4位交换 
三、累加器半字节交换指令 
SWAP   A 
将累加器A的高半字节和低半字节互换。 
四、算术运算指令
加、减、乘、除指令，都是针对8位二进制无符号数。执行
的结果对Cy、Ac、OV等标志位有影响，但增1和减1指令不影 
响上述标志。 
1、加法指令，目的操作数均为ACC。 
ADD  A, Rn       ;(A)+(Rn)→A，n=0～7       
ADD  A, direct   ;(A)+(direct)→A  
ADD  A, @Ri      ;(A)+((Ri))→A，i=0,1 
ADD  A, #data  ;(A)+#data→A 
注意运算结果对各个标志位的影响： 
（1）、如果位7有进位，则进位标志Cy置“1”，否则清0； 
（2）、如果位3有进位，则辅助进位标志Ac置“1”，否则清0； 
（3）、溢出标志位OV： 
          如果位6有进位，而位7没有进位；或者位7有进位，而位6  没有，则溢出标志位OV置“1”，否则清0。
OV状态，只有在带符号数加法运算时才有意义。 
当两个带符号数相加时，OV=1，表示加法运算超出了累加器A所能表示的带符号数的有效范围。
2、带进位加法指令 
标志位Cy参加运算，因此是三个数相加。共4条： 
ADDC A, Rn ;(A)+(Rn)+C→A，n=0～7                 ADDC A, direct ;(A)+(direct)+C→A 
ADDC A, @Ri  ;(A)+(Ri)+C→A，i=0,1 
ADDC A, #data ;(A)+#data+C→A 
3、增1（加1）指令（C语言的++ ）  
INC   A 
INC   Rn        ;n=0～7 
INC   direct    
INC   @Ri                  ;i=0,1        
INC   DPTR                     （除立即数以外） 
（1）、不影响PSW中的任何标志（除了INC  A 外）。 
（2）、INC    DPTR 
该指令是16位数增1指令。指令首先对低8位指针DPL的内容执行加1的操作，当产生溢出时，就对DPH的内容进行加1操作，不影响标志Cy的状态。 
4、DA   A，十进制调整指令 
用于对BCD码加法运算结果的修正。 
两个BCD码按二进制相加之后，必须经本指令的调整才能 
得到正确的压缩BCD码的和数。 
调整方法：十进制调整修正，即结果加6调整。具体为： 
a) 累加器低4位大于9或辅助进位位Ac=1，则进行低4位加6修正； 
b) 累加器高4位大于9或进位位Cy=1，则进行高4位加6修正； 
c) 累加器高4位大于9, 低4位大于9, 则高4位和低4位分别加6修正；是否加6是通过执行指令     DA A     来自动实现的。
5、带借位的减法指令（注意：减法只有带借位的）
SUBB  A, Rn   ;(A)-(Rn)- Cy→A，n=0～7 
SUBB  A, direct ; (A)-(direct)- Cy→A 
SUBB  A, @Ri ;(A)-((Ri))- Cy→A, i=0,1 
SUBB  A, #data  ;(A)-#data - Cy→A 
A的内容减去源操作数和进位标志Cy的值,结果存在A中。 
1、如果位7需借位，则Cy置1，否则清0；
2、如果位3需借位，则Ac置1 ，否则清0； 
3、如果位6需借位而位7不需要借位，或者位7需借位，位6 
不需借位，则溢出标志位OV置1，否则清0。
6、减1指令（C语言的－－） 
DEC  A ；(A)-1→A 
DEC  Rn  ；(Rn)-1→Rn，n=0～7 
DEC  direct ；(direct)-1→direct 
DEC  @Ri ；((Ri))-1→（Ri），i=0,1 
1、减1指令不影响标志位。 
2、增1/加1指令有INC  DPTR，减1无DEC  DPTR指令。
7、乘法指令 
MUL  AB ；A×B→BA 
1、积的高字节在B中，低字节在A中；        
2、如果积大于255，则置“1”溢出标志位OV 
8、除法指令
DIV   AB ；A/B→A（商），余数→B 
如果B的内容为“0”（即除数为“0”），则存放结果的A、B中的内容不定，并置“1”溢出标志位OV。
五、左环移指令RL  A 
累加器A的内容向左环移一位，Acc.7移入Acc.0 ，不影响标志。 
六、带进位左环移指令RLC  A 
累加器A的内容和进位标志位Cy一起向左环移一位，Acc.7移入进位位Cy，Cy移入Acc.0，不影响其它标志。 
七、右环移指令RR   A 
累加器A的内容向右环移一位，Acc.0移入Acc.7，不影响标志。 
八、带进位环移指令RRC   A 
累加器A的内容和进位标志Cy一起向右环移一位，Acc.0移入Cy，Cy移入Acc.7。不影响其它标志。 
九、逻辑与指令 
ANL A, Rn     ; （A）∧（Rn）→A，n=0～7 
ANL A, direct ; （A）∧（direct）→A 
ANL A, #data  ; （A）∧#data→A 
ANL A, @Ri  ; （A）∧(（Ri）)→A，i=0～1 
ANL direct, A ; （direct）∧(A)→direct 
ANL direct, #data   ; （direct）∧#data→direct 
十、逻辑或指令 
ORL A, Rn ；(A) ∨(Rn)→A ，n=0～7 
ORL A, direct  ；(A) ∨(direct)→A 
ORL A, #data   ；(A) ∨data→A 
ORL A, @Ri ；(A) ∨((Ri))→A，i=0,1 
ORL direct, A  ；(direct) ∨(A)→direct 
ORL direct, #data ；(direct) ∨#data→direct 
十一、逻辑异或指令 
XRL A, Rn      ；(A) ⊕(Rn)→A 
XRL A, direct  ；(A) ⊕(direct)→A 
XRL A, @Ri ；(A) ⊕((Ri))→A ,i=0,1 
XRL A, #data   ；(A) ⊕#data→A 
XRL direct, A      ；(direct) ⊕(A)→direct 
XRL direct, #data  ；(direct) ⊕#data →direct 
与1相与取反，与0相与不变。 
控制转移指令
一、无条件转移指令                   AJMP  addrll （2字节指令） 
2K（地址211）字节范围内的无条件跳转指令。        
64K程序存储器空间分为32个区，每区2K字节，转移的目标地址必须与AJMP下一条指令的地址高5位地址码A15-A11相同。 
指令执行时，先PC加2，然后把addrll送入PC.10～PC.0， 
PC.15～PC.11保持不变，程序转移到目标地址。 
注意：转移目标首地址必须在AJMP指令下一条指令地址（PC+2)的2KB范围内。
二、长跳转指令                       LJMP  addr16 （3字节指令） 
64K字节范围内的无条件跳转指令。 
指令执行时，把指令的第二和第三字节分别装入PC的高位和低位字节中，无条件地转向addr16指出的目标地址。 
目标地址可以在64K程序存储器地址空间的任何位置。 
注意：短跳转、长跳转指令中addrll、addr16直接写上要转向的目标地址标号（即符号地址）就可以。 
三、相对转移指令                   SJMP  rel     （双字节） 
rel为8位带符号二进制补码数（-128~+127），实现程序的双向转移。 
在编写程序时，直接写上要转向的目标地址标号就可以。
四、间接跳转（散转）指令JMP   @A+DPTR （三字节） 
由A中8位无符号数与DPTR的16位数内容之和来确定。以DPTR内容作为基址，A的内容作变址。 
五、条件转移指令    （双字节） 
JZ   rel  ；     如果累加器为“0”，则转移 
JNZ  rel；     如果累加器非“0”，则转移 
六、比较不相等转移指令（3字节指令） 
CJNE   A, direct, rel 
CJNE   A, #data, rel 
CJNE   Rn, #data, rel 
CJNE   @Ri, #data, rel 
1、比较前面两个操作数（无符号整数）的大小，如果不相等则 
转移，若相等则顺序执行下一条指令。 
2、如果第一操作数小于第二操作数, 则Cy标志位置1, 否则清0。 
如常把CJNE 第一操作数, 第二操作数,  $+3 
和JNC  rel或JC  rel 写在一块来判别2个数的大小。
$：本条指令在程序存储单元的首地址； 
$+3：CJNE指令的下一条指令，即JNC  rel或JC  rel
七、减1不为0转移指令 
DJNZ   Rn, rel ;n=0～7 
DJNZ   direct, rel 
将源操作数内容减1，结果回送到Rn寄存器或direct中去。如果源操作数内容不为0则转移，为0则顺序执行下一条指令。 
主要用于控制程序循环。 
1、把寄存器Rn或内部RAM的direct单元用作程序循环计数器 
2、以减1后是否为“0”作为转移条件，实现按次数控制循环
八、子程序调用、返回指令 
1、短调用指令          ACALL   addr11      （双字节） 
2K范围内的子程序调用。 
2、长调用指令          LCALL   addr16      （三字节）
64K范围内的子程序调用。 
执行本指令时： 
（1）断点地址(调用指令的下一条指令的首地址PC+2或PC+3) 
保护 
(SP)+1→SP，然后PCL →(SP) 
(SP)+1→SP，然后PCH →(SP) 
（2）将子程序首地址送入PC，执行子程序  
3、子程序返回指令                  RET 
断点地址恢复 
(SP) →PCH，(SP) - 1→SP 
(SP) →PCL ，(SP) - 1→SP 
功能：从堆栈中退出PC的高8位和低8位字节，把栈指针减2，从PC值开始继续执行程序。不影响标志位。 
4、中断返回指令                      RETI 
与RET指令相似，不同之处在于断点地址恢复，清除中断响应时被置“1”的51内部中断优先级寄存器的优先级状态。 
子程序是编程时就已确定的固定位置调用，而中断服务子程序是由中断系统控制在特定条件下随机调用的。 
九、空操作指令                        NOP，消耗1个机器周期的时间 
位操作指令
一、数据位传送指令 
MOV   C,bit 
MOV   bit,C 
如MOV   C,06H     ；(20H).6→Cy 
06H是内部RAM 20H字节位6的位地址。 
MOV   P1.0,C       ；Cy→P1.0 
可寻址位的具体定义：从20H单元的第一位开始一直到2FH单元的最后一位分别为00H~7FH以及特殊功能寄存器中80H~F7H。
二、位变量修改指令
CLR   C             ；清“0”Cy 
CLR   bit    ；清“0”bit位 
CPL   C                ；Cy求反 
CPL   bit         ；bit位求反 
SETB  C    ；置“1” Cy 
SETB  bit         ；置“1”bit位 
三、位变量逻辑与指令 
ANL   C,bit       ；bit ∧Cy →Cy 
ANL   C,/bit； ；/ bit ∧Cy →Cy 
四、位变量逻辑或指令 
ORL   C,bit  ；bit ∨ Cy →Cy 
ORL   C,/bit ；/ bit ∨ Cy →Cy 
五、条件转移类指令 
JC     rel     ；如果进位位Cy=1，则转移 
JNC  rel    ；如果进位位Cy=0，则转移 
JB     bit,rel  ；如果直接寻址位=1，则转移 
JNB  bit,rel  ；如果直接寻址位=0，则转移 
JBC  bit,rel   ；如果直接寻址位=1，则转移，并对bit位清0