单片机指令详解
1. MOV:MOV (目的字节),(源字节);
2. MOVC:和MOV用法基本相同,主要用于ROM查表,也就是基址变址中。
3. MOVX:和MOV用法基本相同,主要读写片外RAM中,也就是间接寻址,如MOVX A,@Ri 。
4. PUSH:主要用于堆栈操作中的压栈操作,例如:(SP)=07H,(40H)= 88H,执行指令PUSH 40H后,(SP)= 08H)(08H)= 88H。其中,SP为堆栈指针,压栈之后堆栈指针加一。
5. POP:主要用于堆栈操作中的弹栈操作,(SP)= 5FH,(5FH)= 90H,执行指令POP 70H后,(70H)= 90H,(SP)= 5EH,弹栈后堆栈指针减一。
6. XCH:主要用于两个数据之间交换,例如:(R0)= 80H,(A)= 20H。执行指令XCH A,R0后,(A)= 80H,(R0)= 20H。
7. XCHD:这个指令的主要功能是间址操作数的低半字节与A的低半字节内容相互交换。例如:(A)= 20H,(R0)= 30H,(30H)= 67H。执行XCHD A,@R0后(A)= 27,(30H)= 60H.
8. SWAP:这个指令的功能是累加器的高、低四位进行互换。例如:(A)= 23H,执行SWAP A指令之后 (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 DA A 结果为123
2) 减法
a) 带错位减法
要是想实现不带错位减法只需要在每次执行带错位减法之前给CY清零即可。
例如:(A)= C9H,(R2)= 54H,CY = 1。执行 SUBB A,R2之后结果为A-CY-R2。
b) 减一
例如:DEC A A自减一。
3) 乘法
乘法运算之后第八位放在累加器A中,高八位放在寄存器中。
例如:(A)= 50H,(B)= A0H。执行指令 MUL AB后(A)= 00H,(B)= 32H
4) 除法
该指令的功能是将累加器A中的无符号8位二进制数除以B中的无符号8位二进制数,商的整数部分放在累加器A中,余数部分放在寄存器B中。
例如:(A)= FBH,(B)= 12H,执行指令 DIV AB后,(A) = 0DH,B = 11H。
3、 逻辑运算和循环类指令
1、 逻辑与ANL:例如:(A)= C3H,(R0)= AAH,执行指令 ANL A,R0后,(A)= 82H。
2、 逻辑或ORL例如:(A)= C3H,(R0)= 55H,执行指令 ORG A ,R0后,(A)= D7H。
3、 逻辑异或XRL:例如:(A)= C3H,(R0)= AAH,执行指令 XRL A,R0后(A)= 69H。
4、 累加器清0:例如:执行指令CLR A,那么无论累加器A之前是什么值,执行这条指令后都为0。
5、 累加器取反:例如:CPL A 那么累加器A = A非。
6、 循环移位:RR循环右移;RL循环左移;有时候循环移位可以很方便的把原来的数据乘以2。
4、控制转移类指令
a) 无条件转移指令
1. 短跳转指令:AJPM addr11;程序跳转到addr11指示的地址处。
2. 长跳转指令:LJPM addr16;程序跳转到addr16指示的地址处。
3. 相对跳转指令:SJMP rel; 程序跳转到rel相对地址处。
4. 散转移跳转指令:JMP @A+DPTR;程序跳转到变址指出的地址处。
b) 条件转移指令
1. 判0跳转指令:JZ rel; A为0,程序跳转到rel的相对地址出;
JNZ rel; A不为0,程序跳转到rel的相对地址出;
2. 比较不等跳转指令:例如:CJNE A,#data; A的内容与data的内容不等则跳转。
3. 减一不为0跳转指令:例如:DJNZ Rn;Rn内容减一不为零则跳转。
4. 子程序跳转:ACALL addr11;调用addr11 处理子程序;
LCALL addr16;调用addr16处理子程序;
5. 返回:RET:子程序返回; RETI:中断返回
6. NOP:空操作,耗时一个机器周期。
5、位操作指令
首先,我们想要处理位操作,那么,我们必须知道两个关键字;1、bit代表一个位。2、C相当于A不过只能代表一个bit。
a) 位传送:其实和MOV的普通用法没有什么区别,只是每次只传送一个bit。例如:C=1、(P3)= 1100 0101B、(P1)= 0011 0101B。执行一下指令:
MOV P1.3,C
MOV C,P3.3
MOV P1.2,C
结果为:C=0,P3内容不变,P1的内容变为0011001B。
b) 位状态子设置:
1、位清零:CLR C或bit可以实现给累加器C和地址内容清零。
2、位置位:SETB C或bit可以实现给累加器C和地址内容设置为1。
c) 位逻辑运算:
1、位逻辑“与”:ANL C,bit 执行这条指令之后bit的值不发生改变,把与的结果送给累加器C。
2、为逻辑“或”:ORL C,bit 执行这条指令之后bit的值不发生改变,把或的结果送给累加器C。
3、位取反:CPL C;
d) 位跳转指令(条件转移)
1、判断C:JC C为0跳转
JNC C为0不跳转
2、判断bit: JB bit 位为1跳转
JBC bit 位为1跳转,同时把bit清零
JNB bit 位不为1跳转