接下来这部分主要是51系列单片机指令系统的具体介绍
(3.1)数据传送类指令(28条)
通用格式:MOV <目的操作数>,<源操作数> 属于“”复制“”性质,不影响标志位
第一类:以累加器为目的的操作数
MOV A,Rn......................MOV A,R6; (R6)->A寄存器寻址。。。。。。(n=0-7)
MOV A,@Ri....................MOV A,70H; (70H)->A直接寻址
MOV A,direct..................MOV A,@R0;((R0))->A间接寻址
MOV A,#data..................MOV A,#78H;78H->A立即寻址
第二类:以Rn为目的的操作数指令
MOV Rn,A
MOV Rn, direct
MOV Rn, #data
//功能:是把源操作数的内容送入当前一组工作寄存器区的R0-R7中的某一个寄存器
第三类:以直接地址direct为目的的操作数指令
MOV direct,A
MOV direct,Rn
MOV direct1,direct2
MOV direct,@Ri
MOV direct,#data
//功能:把源操作数送入直接地址指出的存储单元。direct是指内部RAM或者SFR的地址
第四类:以寄存器间接地址为目的的操作数指令
MOV @Ri,A
MOV @Ri,direct
MOV @Ri,
第五类:16位数传送指令
MOV DPTR,#data16 (#data16->DPTR)
/唯一的16位数据传送指令,立即数的高8位送入DPH,立即数的低8位送入DPL/
第六类:堆栈操作指令
/堆栈:MCS-51内部RAM可设定一个后进先出的区域/
(1)进栈指令:
PUSH direct
//现将栈指针SP加一,然后把direct中内容送入到栈指针 SP的内部RAM单元中
(2)出栈指令;
POP direct
//SP指示的栈顶(内部RAM单元)内容送入到direct字节单元中,栈指针SP减一
第七类:累加器A与外部数据存储器传送指令
MOV A,@DPTR;
MOV A,@Ri;
MOV @DPTR,A;
MOV @Ri,A;
//功能:读取外部RAM存储起或者I/O中的一个字节,或把A中的一个字节的数据写入到外部RAM存储器或者I/O口中。(注意:RD*或者WR*信号有效)
第八类:查表指令
/用于读取程序寄存器中的数据表格的指令,均采用基址寄存器加变址寄存器间接寻址方法/
(1)MOVC A ,@A+PC
(2)MOVC A ,@A+DPTR
第九类:字节交换指令
XCH A,Rn
XCH A,direct
XCH A,@Ri
第十类:半字节交换指令
XCHD A,@Ri
/……………………………………………………………………………………………………………………………………../
(3.2)算数操作类(24条)
//单字节的加减乘除指令,都是针对8位二进制无符号数。执行结果对CyAcOV三种标志位有影响。但是增一 减一不影响上述标志位。
第一类:加法指令 (一个加数总是来自累加器A,而另一个加数可由不同的寻址方式得到。结果总是放到A中)
MOV A,Rn
MOV A,direct
MOV A,@Ri
MOV A,#data
//!!注意:使用加法指令的时候,要注意累加器A中的运算对各个标志位的影响:
第一:如果位七有进位,则置“1”进位标志Cy,否则则请“0”Cy;
第二:如果位三有进位,则置“1”辅助进位标志Ac,否则清“0”(Ac为PSW中的一位);
第三:如果为6有进位,位7没有进位;或者位7有进位,位6没有进位,则溢出标志位OV置“1”否则请“0”。
第二类:带进位的加法指令 (标志位Cy参与运算,因此是三个数相加)
ADDC A,Rn;.....................(A)+(Rn)+C->A
ADDC A,direct;.................(A)+(direct)+C->A
ADDC A,@Ri;....................(A)+(Ri)+C->A
ADDC A,#data;..................(A)+#data+C->A
第三类:增1指令:
INC A
INC Rn
INC direct
INC @Ri
INC DPTR
//不影响PSW中的任何标志位,若变量中的内容位FFH,程序执行后变量变为00H
第四类:十进制调整指令
格式: DA A
//两个压缩BCD码的数按二进制相加后,必须经过本指令的调整才能得到正确的和数(仍为压缩BCD码表示)
应用背景:
(1)该指令执行前,一般有一条加法指令
(2)加法指令中的两个加数,应该用压缩BCD码表示的十进制数,和存放在A中
(3)执行完DA指令后,A中存放的数是两个加数的十进制和,也用压缩BCD码表示
第五类:带借位的减法指令
SUBB A,Rn
SUBB A,direct
SUBB A,@Ri
SUBB A,#data
/从累加器A中的内容减去指定的变量和进位标志Cy的值,结果存在累加器A中/
//!!!!注意:
第一:如果位7需要借位则置‘1’Cy,否则清‘0’
第二:如果位3需要借位则置‘1’Ac,否则清‘0’
第三:如果位6需要借位而位7不需要借位,或者位7需要借位而位6不需要借位,则置‘1’溢出标志位OV,否则清‘0’
第六类:减1指令
DEC A
DEC Rn
DEC direct
DEC @Ri
//减1指令不影响标志位
第七类:乘法指令
MULL AB;...................AxB->BA
//如果积大于255,则置‘1’溢出标志位OV
第八类:除法指令
DIV AB;......................A/B->A(商) 余数->B
//如果B的内容位‘0’(即除数为0),则存放结果的A,B中的内容不定
/………………………………………………………………………………………………………………………………………/
(3.3)逻辑运算类指令(25条)
第一类:简单逻辑操作指令
(1)CLR A
//功能:累加器A清0.不影响Cy、Ac、等标志位
(2)CPL A
//功能:将累加器A的内容按位逻辑取反,不影响标志位
第二类:左环移指令
RL A
//功能:累加器A的8位向左循环移位,位7循环移入位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
第六类:累加器半字节交换指令
SWAP A
//功能:将累加器A的高半字节(Acc.7-Acc.4)和低半字节(Acc.3-Acc.0)互换
第七类:逻辑与指令
ANL A,Rn...................(A)^(Rn)->A
ANL A,direct
ANL A,#data
ANL A,@Ri;(i=0/1)
ANL direct,A
ANL direct,#data
//运算结果存入第一操作数中,按位进行与运算
第八类:逻辑或指令
ORL A,Rn...................(A)v(Rn)->A
ORL A,direct
ORL A,#data
ORL A,@Ri;(i=0/1)
ORL direct,A
ORL direct,#data
//运算结果存入第一操作数中,按位进行或运算
第九类:逻辑异或指令
XRL A,Rn;
XRL A,direct;
XRL A,#data;
XRL A,@Ri;(i=0/1);
XRL direct,A;
XRL direct,#data;
‘’‘
//运算结果存入第一操作数中,按位进行异或运算
/………………………………………………………………………………………………………………………………………/
(3.4)控制转移类指令(17条)
第一类:无条件转移指令
(1)绝对跳转指令
AJMP addr11
//2K字节范围内的无条件转移指令,64k程序存储器空间分为32个区,每个区2k字节 ,
转移的目标地址必须与AJMP下一条指令的地址(pc)的高五位地址码A15-A11相同。
(2)长跳转指令
LJMP addr16
//指令执行时把指令的第二个和第三个字节分别装入pc的高位和低位字节中,
无条件的跳转向addr16指出的目标地址。目标地址可以在64k程序存储器地址空间的任何位置。
(3)相对转移指令
SJMP rel
//在编写程序时,直接写上要转向的目标地址标号就可以,由汇编程序自动计算和填入偏移量
跳转目标地址处于当前pc值的-128字节~+127字节之间。
(4)间接跳转指令
JMP @A+DPTR
//由A中8位无符号数与DPTR的16位数内容之和来确定。以DPTR内容作为基址,A的内容作为变址,给A赋不同的值,即可实现程序的多分支转移。
第二类:条件转移指令
(1)判0跳转指令
JZ rel;............如果累加器为0,则转移
JNZ rel;..........如果累加器非0,则转移
//规定的条件满足,则进行转移,跳转到相应的标号处,跳转目的地址的要求同SJMP。条件不满足则执行下一条指令
(2)比较不相等跳转指令
CJNE A,direct,rel
CJNE A,#data,rel
CJNE Rn,#data,rel
CJNE Ri,#data,rel
//比较前两个操作数的大小,如果他们不相等则转移,转换的目的地址要求同SJMP
//如果第一操作数(无符号位整数)小于第二操作数(无符号整数),则置进位标志位Cy,否则清0
(3)减一不为0跳转指令
DJNZ Rn,rel; (n=0~7)
DJNZ direct,rel
//将源操作数减一,结果回送到Rn寄存器或者direct中去,如果结果不为0则转移,转移的目的地址要求同SJMP
//允许程序员把寄存器Rn或者内部RAM的direct单元用作程序循环计数器。主要用于控制程序循环。
以减一后是否为0作为转移条件,即可实现按次数控制转移循环
第三类:调用和返回指令
(1)短调用指令
ACALL addr11
//与AJMP指令相似,是为了与MCS-48中的CALL指令兼容而设立的,不建议使用
(2)长调用指令
LCALL addr16
//该指令执行时,MCS51执行如下操作:(1)当前PCL,PCH进栈(2)addr16送入PC
(3)从子程序返回指令
RET
//执行该指令的时候:
(SP)->PCH,然后(SP)-1->SP
(SP)->PCL,然后(SP)-1->SP
//功能:从堆栈中退出PC的高8位和低8位字节,把栈指针减2,从PC值开始执行程序
(4)中断返回指令
RETI
//功能与RET相似,不同之处是本指令清楚中断响应时,被置1的MCS51内部中断优先级寄存器的优先级状态
第四类:空操作指令
NOP
/………………………………………………………………………………………………………………………………………/
(3.5)位操作指令(17条)
第一类:数据传送指令
MOV C,bit
MOV bit,C
第二类:位变量修改指令
CLR C; 清0Cy位
CLR bit; 清0bit位
CLR C; Cy求反
CPL bit; bit位求反
SETB C; 置1Cy
SETB bit; 置1bit位
第三类:位变量逻辑与指令
ANL C,bit; bit^Cy->Cy
ANL C,/bit;
第四类:位变量逻辑或指令
ORL C,bit;
ORL C,/bit;
第五类:条件转移类指令
JC rel; 如果进位位Cy=1,则转移
JNC rel; 如果进位位Cy=0,则转移
JB bit,rel; 如果直接寻址位=1,则转移
JNB bit,rel;如果直接寻址位=0,则转移
JBC bit,rel;如果直接寻址位=1,则转移,并清0直接寻址位
(持续更新中!!!)