单片机指令详解
1、数据传送类指令
1.MOV:MOV(目的字节),(源字节);
2.MOVC:和MOV用法基本相同,主要用于ROM查表,也就是基址变址中。
3.MOVX:和MOV用法基本相同,主要读写片外RAM中,也就是间接寻址,如MOVXA,@Ri。
4.PUSH:主要用于堆栈操作中的压栈操作,例如:(SP)=07H,(40H)=88H,执行指令PUSH40H后,(SP)=08H)(08H)=88H。其中,SP为堆栈指针,压栈之后堆栈指针加一。
5.POP:主要用于堆栈操作中的弹栈操作,(SP)=5FH,(5FH)=90H,执行指令POP70H后,(70H)=90H,(SP)=5EH,弹栈后堆栈指针减一。
6.XCH:主要用于两个数据之间交换,例如:(R0)=80H,(A)=20H。执行指令XCHA,R0后,(A)=80H,(R0)=20H。
7.XCHD:这个指令的主要功能是间址操作数的低半字节与A的低半字节内容相互交换。例如:(A)=20H,(R0)=30H,(30H)=67H。执行XCHDA,@R0后(A)=27,(30H)=60H.
8.SWAP:这个指令的功能是累加器的高、低四位进行互换。例如:(A)=23H,执行SWAPA指令之后(A)=32H。
2、算术运算类指令
1)加法
a)不带进位加法
影响程序状态字标志位PSW中的CY(CY是进位标志位,即和的D7为有进位时(CY)=1,否则,(CY)=0)、AC(AC为辅助进位标志位,当D3为有进位时为1,否则为0)、OV(和的D7和D6为只有一个进位时为1,否则为0)和P(当累加器ACC中的1为奇数时为1,否则为0)
例如:(A)= 84H,(30H)= 8DH,执行指令 ADD A,30H 结果A=11H
b)带进位加法
影响的程序状态字标志位与不带进位的加法相同。表达形式为ADDC A,Rn
c)增一
例如:INC A A的数值自加一
d)十进制调整
当累加器A中的低4位数出现了非BCD码或第四位产生进位时,应在第四位加六调整,以产生第四位正确的BCD码结果。
当累加器A中的高4位数出现了非BCD码或第四位产生进位时,应在第四位加六调整,以产生第四位正确的BCD码结果。
例如:(A)= 0101 0110B (R2)= 0110 0111B
ADD A,R2 DAA结果为123
2)减法
a)带错位减法
要是想实现不带错位减法只需要在每次执行带错位减法之前给CY清零即可。
例如:(A)=C9H,(R2)=54H,CY=1。执行SUBBA,R2之后结果为A-CY-R2。
b)减一
例如:DECAA自减一。
3)乘法
乘法运算之后第八位放在累加器A中,高八位放在寄存器中。
例如:(A)=50H,(B)=A0H。执行指令MULAB后(A)=00H,(B)=32H
4)除法
该指令的功能是将累加器A中的无符号8位二进制数除以B中的无符号8位二进制数,商的整数部分放在累加器A中,余数部分放在寄存器B中。
例如:(A)=FBH,(B)=12H,执行指令DIVAB后,(A)=0DH,B=11H。
3、逻辑运算和循环类指令
1、逻辑与ANL:例如:(A)=C3H,(R0)=AAH,执行指令ANLA,R0后,(A)=82H。
2、逻辑或ORL例如:(A)=C3H,(R0)=55H,执行指令ORGA,R0后,(A)=D7H。
3、逻辑异或XRL:例如:(A)=C3H,(R0)=AAH,执行指令XRLA,R0后(A)=69H。
4、累加器清0:例如:执行指令CLRA,那么无论累加器A之前是什么值,执行这条指令后都为0。
5、累加器取反:例如:CPLA那么累加器A=A非。
6、循环移位:RR循环右移;RL循环左移;有时候循环移位可以很方便的把原来的数据乘以2。
4、控制转移类指令
a)无条件转移指令
1.短跳转指令:AJPM addr11;程序跳转到addr11指示的地址处。
2.长跳转指令:LJPMaddr16;程序跳转到addr16指示的地址处。
3.相对跳转指令:SJMPrel;程序跳转到rel相对地址处。
4.散转移跳转指令:JMP@A+DPTR;程序跳转到变址指出的地址处。
b)条件转移指令
1.判0跳转指令:JZ rel;A为0,程序跳转到rel的相对地址出;
JNZrel;A不为0,程序跳转到rel的相对地址出;
2.比较不等跳转指令:例如:CJNEA,#data;A的内容与data的内容不等则跳转。
3.减一不为0跳转指令:例如:DJNZRn;Rn内容减一不为零则跳转。
4.子程序跳转:ACALLaddr11;调用addr11处理子程序;
LCALLaddr16;调用addr16处理子程序;
5.返回:RET:子程序返回;RETI:中断返回
6.NOP:空操作,耗时一个机器周期。
5、位操作指令
首先,我们想要处理位操作,那么,我们必须知道两个关键字;1、bit代表一个位。2、C相当于A不过只能代表一个bit。
a)位传送:其实和MOV的普通用法没有什么区别,只是每次只传送一个bit。例如:C=1、(P3)=11000101B、(P1)=00110101B。执行一下指令:
MOVP1.3,C
MOVC,P3.3
MOVP1.2,C
结果为:C=0,P3内容不变,P1的内容变为0011001B。
b)位状态子设置:
1、位清零:CLRC或bit可以实现给累加器C和地址内容清零。
2、位置位:SETBC或bit可以实现给累加器C和地址内容设置为1。
c)位逻辑运算:
1、位逻辑“与”:ANLC,bit执行这条指令之后bit的值不发生改变,把与的结果送给累加器C。
2、为逻辑“或”:ORLC,bit执行这条指令之后bit的值不发生改变,把或的结果送给累加器C。
3、位取反:CPLC;
d)位跳转指令(条件转移)
1、判断C:JC C为0跳转
JNC C为0不跳转
2、判断bit:JB bit位为1跳转
JBC bit位为1跳转,同时把bit清零
JNB bit位不为1跳转