111条指令,按功能分类,分为5大类:
1,数据传送指令(28)
2,算术操作指令(24
3,逻辑运算指令(25
4,控制转移指令(17
5,位操作指令(17
一,数据传送指令
分为三组:普通数据传送指令、数据交换指令、堆栈操作指令。助记符:MOV、MOVX、MOVC、XCH、XCHD、PUSH、POP和SWAP。 1, 普通数据传送指令
1)片内数据存储器传送指令MOV 指令格式:MOV 目的操作数,源操作数
【
==概念区分==:什么叫源操作数?什么叫目的操作数?他们的关系怎样?
操作数的概念:操作数是运算符作用于的实体,是表达式中的一个组成部分,它规定了指令中进行数字运算的量 。表达式是操作数与操作符的组合。
——1. 源操作数:
数据传送指令一般都是操作数自源地址单元传送到目的地址单元,指令执行后,源地址单元的操作不变,目的地址单元的操作数则修改为源单元的操作数叫做源操作数。
——2. 目的操作数: 交换指令数据作双向传送,涉及传送的双方互为源地址、目的地址,指令执行后,每方的操作数都修改为另一方的操作数叫做目的操作数。
——关系: MOV指令中源操作数和目的操作数不能同时出现工作寄存器
】
- 片外数据存储器传送指令MOVX
MOVX A,@DPTR ;A ← (DPTR)
MOVX @DPTR,A ;(DPTR) ← A
MOVX A,@Ri ;A ← (Ri)
MOVX @Ri,A ;(Ri)← A
- 程序存储器传送指令MOVC
MOVC A, @A+DPTR ;A ← (A+DPTR)
MOVC A, @A+PC ;A ← (A+PC)
二,算术运算指令
-
加法指令
加法指令有一般的加法指令、带进位的加法指令和加1指令。
1)一般的加法指令ADD
ADD A,Rn ;A← A + Rn
ADD A,direct ;A← A +(direct)
ADD A,@Ri ;A← A +(Ri)
ADD A,#data ;A← A + #data- 带进位加法指令ADDC
ADDC A,Rn ;A← A + Rn + C
ADDC A,direct ;A← A +(direct)+ C
ADDC A,@Ri ;A← A +(Ri)+ C
ADDC A,#data ;A← A + #data + C- 加1指令INC
INC A ;A← A + 1
INC Rn ;Rn← Rn + 1
INC direct ;(direct)← (direct)+ 1
INC @Ri ;(Ri)←(Ri)+ 1
INC DPTR ;DPTR← DPTR + 1 -
减法指令
- 带借位减法指令SUBB
SUBB A,Rn ;A← A - Rn - C
SUBB A,direct ;A← A -(direct)- C
SUBB A,@Ri ;A← A -(Ri)- C
SUBB A,#data ;A← A - #data - C- 减1指令DEC
DEC A ;A← A - 1
DEC Rn ;Rn← Rn - 1
DEC direct ;direct← (direct)- 1
DEC @Ri ;(Ri)←(Ri)- 1- 乘法指令MUL
MUL AB A×B←BA
注意:
△该指令只能实现==无符号数==相乘。
△该指令执行后积的高字节存放于B寄存器中,低字节存放于累加器A中。
△执行后,CY复位。对于OV:当积大于255时(即B中不为0),OV为1;否则,OV为0。- 除法指令DIV
DIV AB A÷B
注意:
△ 该指令只能实现无符号数除法。
△ 该指令实现整除关系,执行后商存于累加器A中,余数存于B寄存器中。
△ 指令执行后将影响CY和OV标志,一般情况下CY和OV都清0,只有当B寄存器中的除数为0时,CY和OV才被置1- 十进制调整指令
DA A
只能用在ADD或ADDC指令的后面,用来对两个二位压缩的BCD码数通过用ADD或ADDC指令相加后存于累加器A中的结果进行调整,使之得到正确的十进制结果。通过该指令可实现两位十进制BCD码数的加法运算。
调整过程如下:
(1) 若累加器A的低四位为十六进制的A~F或辅助进位标志AC为1,则累加器A中的内容做加06H调整。
(2) 若累加器A的高四位为十六进制的A~F或进位标志CY为1,则累加器A中的内容做加60H调整。
什么是06H调整,什么是60H调整?
例如:
75D+94D=169D
75H+94H=109H
为了在形式上将75H+94H结果与75D+94D一致,经过DA后有
DA(109H)=109H+60H=169H
虽然一个是16进制一个是10进制但172在形式上是相等的。
MOV R5,#81H
MOV A, #91H
ADD A, R5
DA A
首先75H+94H=109H,此时AC=0,Cy=1,A=09H,所以DA A后A=09H+60H=69H,AC=0,Cy=1,结果为169H,当然运算应该理解为75D+94D=169D
三,逻辑运算指令
-
逻辑与指令ANL
ANL A,Rn ;A← A ^ Rn
ANL A,direct ; A← A ^ (direct)
ANL A,@Ri ; A← A ^ (Ri)
ANL A,#data ;A← A ^ data
ANL direct,A ;(direct)← (direct) ^ A
ANL direct,#data ;(direct)← (direct) ^ data -
逻辑或指令ORL
-
逻辑异或指令XRL
功能:逻辑与用于实现对指定位清0,其余位不变;逻辑或用于实现对指定位置1,其余位不变;逻辑异或用于实现指定位取反,其余位不变。
- 清零和求反指令
- 循环移位指令
四,控制转移指令
-
无条件转移指令
- 长转移指令LJMP
LJMP addr16 ;PC ← addr16
-
绝对转移指令
-
相对转移指令
-
间接转移指令指令JMP
-
条件转移指令
-
累加器A判零条件转移指令
-
比较转移指令
-
减1不为零转移指令
-
-
子程序调用及返回指令
-
长调用指令
指令格式: LCALL addr16 -
绝对调用指令
指令格式: ACALL addr11 -
子程序返回指令
指令格式: RET -
中断返回指令
指令格式: RETI
-
五,位操作指令
-
位传送指令
-
位逻辑操作指令
-
位清0
CLR C ;C←0
CLR bit ;(bit)←0 -
位置1
SETB C ;C←1
SETB bit ;(bit)←1 -
位取反
CPL C ;C←/C
CPL bit ;(bit)←(bit) -
位与
ANL C,bit ;C←C∧(bit)
ANL C,/bit ;C←C∧(/bit) -
位或
ORL C,bit ;C←C∨(bit)
ORL C,/bit ;C←C∨(/bit)
-
-
位转移指令
-
空操作指令
NOP ;PC ← PC+1
指令中符号的意义汇总:
Rn: 当前寄存器区的8个工作寄存器R0~R7(n = 0~7)
Ri: 当前选中的寄存器中可作间接寻址寄存器的2个寄存器R0,R1(i=0,1)
Direct 直接地址,即8位的内部数据存储器单元或特殊功能寄存器的地址(从00到7F的128个单元,每个单元的字节地址都可以出现)
#data: 包含在指令中的8位立即数
#data16: 包含在指令中的16位立即数
rel: 相对转移指令中的偏移量,为8位的带符号补码数
DPTR: 数据指针,可用作16位的数据地址寄存器
bit: 内部RAM或特殊功能寄存器中的直接寻址位
C(或Cy): 进位标志位(在加减运算中)或位处理机中的累加器(做二传手)
addr 11 11位目的地址
addr 16 16位目的地址
@ 间接寻址寄存器前缀,如@Ri,@A+DPTR
(X) X中的内容
((X)) 由X寻址的单元中的内容
箭头右边的内容被箭头左边的内容所取代
疑问
直接寻址和间接寻址的区别?
一、存放操作数的地址不同
寄存器直接寻址指令直接包含有操作数的有效地址(偏移地址),即直接给出操作数地址。而寄存器间接寻址指令以寄存器中的内容为地址,该地址的内容为操作数,即寄存器间接寻址方式中,寄存器内存放的是操作数的地址,而不是操作数本身。
二、寄存器对象不同
寄存器直接寻址对象为内部数据寄存器和特殊功能寄存器SFR。而寄存器间接寻址对象为R0、R1、DPTR,用前面加@表示,如@R0、@R1、@DPTR。
带进位加法和不带进位实现有什么区别?
ADD 是求两个指定整数的和,而 ADC 除了两个指定整数以外,还会加上 C(进位)状态的值。需要 ADC 指令,是因为如果要加的整数长于微处理器每次能加的位元数,就要分开来加,高位字节的结果取决于低位字节相加时有没有进位。 举例:假如有8位元微处理器每次只能加一个字节,如果我们要加两个 16 位元整数:00110101 11001010 + 00010100 01111101 先用 ADD 加 11001010 和 01111101,得 01000111,有进位,状态 C 设为 1再用 ADC 加 00110101 和 00010100 和 状态C(现在是1),得 01001010 所以和是 01001010 01000111
注:学识浅薄,如有纰漏,请多多指教。