符号定义
Rn:当前寄存器区的8个工作寄存器(n=0~7)
Ri:当前寄存器区中可作间接寻址寄存器的2个寄存器(i=0 1)
direct:直接地址
#data:包含在指令中的8位立即数
rel:相对转移指令中的偏移量,为8位带符号补码数
DPTR:数据指针,16位数据地址寄存器PC:程序寄存器,存有正在执行的指令的地址
bit:直接寻址位
C:进位标志位
addr11:11位目的地址
addr16:16位目的地址
@:间接寻址寄存器前缀
一、数据传送类指令 28条
1.以累加器为目标的操作指令
MOV A,Rn //将寄存器Rn中的数据传送到累加器,Rn中的数据不变
MOV A,@Ri //将寄存器Ri中的值作为地址,将对应的地址单元的值传送到累加器中,原数据不变
MOV A,direct //将直接地址的地址单元中的值传送到累加器中,原数据不变
MOV A,#data //将直接数传送给累加器
2.以Rn为目标的操作指令
MOV Rn,A //将累加器中的数送入Rn寄存器
MOV Rn,direct
MOV Rn,#data
不能传递工作区寄存器数据
不能传递间接寻址数据
3.以直接地址为目标的操作数指令
MOV direct,A
MOV direct,Rn
MOV direct1,direct2
MOV direct,@Ri
MOV direct,#data
所有地址都可以使用
4.以寄存器间接地址为目标的操作指令
MOV @Ri,A //将累加器中的数据传送到Ri地址单元,源数据不变
MOV @Ri,direct
MOV @Ri,#data
不能传递工作区寄存器数据
不能传递间接寻址数据
5.16位传送指令
MOV DPTR,#data16 //将一个16位的立即数送入DPTR中去。其中高8位送入DPH(083H),低8位送入DPL(082H)。
唯一的一条16位立即数传递指令
6.堆栈操作指令
进栈:PUSH direct
出栈:POP direct
7.累加器和外部数据寄存器传送指令
MOVX A,@DPTR
MOVX A,@Ri
MOVX @DPTR,A
MOVX @Ri,A
8.查表指令
MOVC A,@A+PC //变址寻址,将PC中存储的地址加上累计器中的数得到新地址,将改地址单元中的值传送到累加器中。本指令执行前后,累加器中的值改变。
MOVC A,@A+DPTR
9.字节交换指令
XCH A,Rn //交换累加器和寄存器Rn中的值
XCH A,direct
XCH A,@Ri //交换累加器和Ri中的值对应的地址单元中的值
10.半字节交换指令
XCHD A,@Ri //交换累加器和Ri中的值对应的地址单元中的值,但只交换低半字节数据
二 、算术操作类指令 24条
1.加法指令
ADD A,Rn //将累加器中的值与寄存器Rn中的值相加,计算结果返回累加器。本指令执行完毕,累加器的值前后不同。
ADD A,direct
ADD A,@Ri
ADD A,#data
2.带进位加法指令
ADDC A,Rn //将A中的值和其后面的值相加,并且加上进位位C中的值。
ADDC A,direct
ADDC A,@Ri
ADDC A,#data
3.增加1指令
INC A
INC Rn
INC direct
INC @Ri
INC DPTR
从结果上看INC A和ADD A,#1差不多,但INC A是单字节,单周期指令,而ADD #1则是双字节,双周期指令,而且INC A不会影响PSW位。
4.十进制调整指令
DA A
现在12H+39H,将12H放于A中,执行 ADD A,#39H指令,则结果为4BH,这不是我们希望的51H的数据形式!!这时执行DA A 指令后,就会将A中的数据调整为51H。
5.带借位减法
SUBB A,Rn
SUBB A,direct
SUBB A,@Ri
SUBB A,#data
包含进位位的减法
没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将C清零即可。
6.减1指令
DEC A
DEC Rn
DEC direct
DEC @Ri
7.乘法指令
MUL AB //将A和B中的两个8位无符号数相乘
两数相乘结果一般比较大,因此最终结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。在乘积大于FFFFFH(65535)时,OV置1(溢出),否则OV为0,而C总是0。
8.除法指令
DIV AB //将A中的8位无符号数除以B中的8位无符号数(A/B)
除了以后,商放在A中,余数放在B中。CY和OV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么OV=1。
三、逻辑操作类指令 25条
1.简单逻辑操作指令
累加器A清零:
CLR A
累加器A按位取反:
CPL A
2.左循环指令
RL A //将A中的值逻辑左移
逻辑左移时,最高位丢失,最低位补0
3.带进位左移指令
RLC A //将A中的值加上进位位进行逻辑左移
4.右移指令
RR A //将A中的值进行逻辑右移
逻辑右移时,最高位补0,最低位丢失
5.带进位循环指令
RRC A //将A中的值加上进位位进行逻辑右移
6.累加器半字节交换指令
SWAP A //将A中的值高、低4位交换
7.逻辑与指令
ANL A,Rn //A与Rn中的值按位'与',结果送入A中
ANL A,direct
ANL A,#data
ANL A,@Ri
ANL direct,A
ANL direct,#data
7.逻辑或指令
ORL A,Rn //A和Rn中的值按位'或',结果送入A中
ORL A,direct
ORL A,#data
ORL A,@Ri
ORL direct,A
ORL direct,#data
7.逻辑异或指令
XRL A,Rn //A和Rn中的值按位'异或',结果送入A中
XRL A,direct
XRL A,#data
XRL A,@Ri
XRL direct,A
XRL direct,#data
参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0
四、控制转移类指令 17条
1.无条件转移指令
AJMP addr11
2.相对转移指令
SJMP rel
3.长跳转指令
LJMP addr16
上面的三条指令,如果要仔细分析的话,区别较大,但初学时,可不理会这么多,统统理解成:JMP标号,也就是跳转到一个标号处。
那么他们的区别何在呢?在于跳转的范围不一样。好比跳远,LJMP一下就能跳64K这么远(当然近了更没关系了)。而AJMP最多只能跳2K距离,而SJMP则最多只能跳256这么远。原则上,所有用 SJMP或AJMP的地方都可以用LJMP来替代。因此在初学时,需要跳转时可以全用LJMP,除了一个场合。什么场合呢?先了解一下AJMP,AJMP 是一条双字节指令,也就说这条指令本身占用存储器(ROM)的两个单元。而LJMP则是三字节指令,即这条指令占用存储器(ROM)的三个单元。
4.间接跳转指令
JMP @A+DPTR //变址寻址跳转
5.条件转移指令
若A为0则转移:
JZ rel
若A非0则转移:
JNZ rel
6.比较不相等转移指令
CJNE A,direct,rel //将A中的值和direct中的值比较,如果两者相等,就顺序执行(执行本指令的下一条指令),如果不相等,就转移到rel
CJNE A,#data,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
7.减1不为0转移指令
DJNZ Rn,rel //先将工作寄存器Rn中的数减“1”,判断结果是否为“0”,不为“0”程序就跳转到rel执行,否则,为“0”就不转移,继续执行下一条指令
DJNZ direct,rel
8.调用子程序指令
ACALL addr11 //跳转到子程序
LCALL addr16
9.子程序返回指令
RET
10.中断返回指令
RETI
11.空操作指令
NOP //延时
五、位操作指令
1.数据位传送指令
MOV C,bit
MOV bit,C
2.位变量修改指令
清0:
CLR C
CLR bit
求反:
CPL C
CPL bit
置1:
SETB C
SETB bit
3.位变量逻辑与指令
ANL C,bit
ANL C,/bit
3.位变量逻辑或指令
ORL C,bit
ORL C,/bit
4.条件转移类指令
JC rel //如果CY等于1就转移,如果不等于1就顺序执行
JNC rel //如果CY=0就转移,不等于0就顺序执行
JB bit,rel //如果指定的bit位中的值是1,则转移,否则顺序执行
JNB bit,rel //如果指定的bit位中的值是0,则转移,否则顺序执行
JBC bit,rel //JBC是判断可位寻址区域内指定位是否为1,为1则跳转到指定位置,并同时清除该位(置0)