第 3章 80C51系列单片机指令系统本章要点
80C51指令的基本格式
80C51指令功能分类
指令系统中的常用符号
80C51指令系统的七种寻址方式
数据传送类指令
算术运算类指令
逻辑运算及移位指令
位操作类指令
控制转移类指令
51系列单片机指令集含有 111条指令每条指令在执行时要花去一定的 时间,以机器周期为单位。按指令 执行时间 分类:
单周期 (64条 );双周期 (45条 );4周期 (2条 )
按指令的 功能 分类,可分为 5大类:
数据传送类( 29条);算术运算类( 24条)
逻辑运算及移位类( 24);控制转移类( 17条)
位操作类( 17条)
每条指令在程序存储器 ROM中占据一定的 空间,
以字节为单位。按指令 所占字节数 分类:
单字节 (49条 );双字节 (46条 );3字节 (16条 )
§ 3-1 指令系统基本概念标号:操作码 操作数;注释
3.1.1 指令基本格式
方括符 [ ]表示可选项
标号代表指令所在地址,1-8个字母 /数字,,,”结尾
[标号,]操作码 [目的操作数 ][,源操作数 ][;注释 ]
START:MOV A,#30H ;将立即数 30H传送至 A中
MOV DPTR,#5678H ;将立即数 5678H传送至 DPTR
⑴ 标号:指令的符号地址。
① 用于一段功能程序的识别标记或控制转移地址 。
② 指令前的标号代表该指令的地址,
是 用符号表示的地址 。
③ 一般用英文字母和数字组成。
④ 标号必须用冒号,:”与操作码分隔。
⑵ 操作码:表示指令的操作功能。
① 操作码用助记符表示,
它 代表了指令 的操作功能 。
② 操作码是指令的必需部分,
是指令的核心,不可缺少。
⑶ 操作数:参加操作的数据或数据地址。
⑤ 操作数与操作码之间用空格分隔,操作数与操作数之间用逗号,,,分隔 。
① 操作数可以是 数据,也可以是 数据的地址,
数据地址的地址 或 操作数的其他信息 。
② 操作数可分为目的操作数和源操作数。
③ 操作数可用二进制数、十进制数或十六进制数表示。
④ 操作数的个数可以是 0~ 3个。
⑷ 注释:指令功能说明。
① 注释属于非必需项,是为便于阅读,
对指令功能作的说明和注解 。
② 注释必须以,;,开始。
3.1.2 指令分类
⑶ 按指令功能分类,
可分为数据传送类,算术运算类,
逻辑运算类,位操作类和控制转移类 等 5大 类 指令 。
80C51共有 111条指令。
⑴ 按指令长度分类,
可分为 1字节,2字节和 3字 节指令。
⑵ 按指令执行时间分类,
可分为 1机周,2机周和 4机 周指令。
3.1.3 指令系统中的常用符号
⑹ bit,位地址 。 SETB ACC.7
代表片内 RAM中的可寻址位 00H~ 7FH及 SFR中的可寻址位 。
⑴ #,立即数符 。 MOV A,#30H
#data,8位立即数; #data16,16位立即数。
⑵ direct,8位直接地址 MOV A,3AH
代表内 RAM 00H~ 7FH或 SFR的 80H~ FFH 。
⑶ @,间接寻址符 。 MOV A,@R0
如 @Ri,@DPTR,@A+PC,@A+DPTR。
⑷ addr11,11位目的地址 。
addr16,16位目的地址 。
⑸ rel,带符号的 8位偏移地址 。 SJMP rel
用于转移指令,其范围是相对于下一条指令第 1字节地址的 -128~ +127个字节。
3.1.4 寻址方式寻址就是寻找操作数的地址。
七种寻址方式,一条指令可能含多种寻址方式
立即寻址
直接寻址
寄存器寻址
寄存器间接寻址
变址寻址 (基址寄存器 +变址寄存器间接寻址 )
相对寻址
位寻址
【 例 】
⒈ 立即寻址立即寻址是 直接给出操作数,操作数前有立即数符,#,。
MOV A,#30H ;将立即数 30H传送至 A中
MOV DPTR,#5678H ;将立即数 5678H传送至 DPTR
ADD A,#05H ; (A)←(A)+ 立即数 05H
注意:符号,#”表明其后跟的是立即数,
立即数 —— 就是数字量本身 。
⒉ 直接寻址
MOV A,3AH ; 将内 RAM 3AH单元中的数据传送至 A中
MOV A,P0 ; 将特殊功能寄存器 P0口中的数据传送至 A
中说明,3AH和 P0是以 direct形式出现的直接地址访问特殊功能寄存器 SFR只能采用直接寻址方式 。
直接寻址是 给出操作数的直接地址 。 直接寻址范围 为内 RAM 128B和特殊功能寄存器。
【 例 】
⒊ 寄存器寻址
MOV A,R0 ;将 R0中的数据传送至 A中
INC A
MUL AB
从寄存器中读取操作数或存放操作数进寄存器寄存器寻址的操作数在规定的寄存器中。
规定的寄存器有,① 工作寄存器 R0~ R7
② 累加器 A
③ 双字节 AB
④ 数据指针 DPTR
⑤ 位累加器 Cy
这些被寻址寄存器中的内容就是操作数
【 例 】
⒋ 寄存器间接寻址
MOV A,@R0 ;将以 R0中内容为地址的存储单元中的数据传送至 A中
MOVX A,@DPTR ;将外 RAM DPTR所指存储单元中的数据传送至 A中
PUSH PSW ;将 PSW中数据传送至堆栈指针 SP所指的存储单元中
MOV @R1,#0FH ;(30H)← 立即数 0FH
寄存器中的内容是一个地址,由该地址单元寻址到所需的操作数 。 间接寻址用间址符,@” 作为前缀 。
【 例 】
注意:
1),间接,表示某寄存器中的,内容,只是一个,单元地址,,这个地址单元中存放的数据才是要找的,操作数,。
2) 符号,@”表示,在 …,,其含义与读音皆同,at”。
⒌ 变址寻址
MOVC A,@A+DPTR
【 例 】
在变址寻址中,操作数 地址=基址+变址用于读 ROM数据操作。;将 A的内容与 DPTR内容相加,
得到一个新地址,从该地址
ROM中读取数据送入 A中。
以 16位的地址指针寄存器 DPTR或 16位的 PC寄存器为 基址寄存器,以累加器 A 为 变址寄存器,两者中的,内容,形成一个 16位的,地址,,该,地址,
所指的存储单元中的内容才是操作数。
MOVC A,@A+PC ; A ( A+PC)
当前 PC值加上指令中规定的偏移量 rel,构成实际的操作数地址例,SJMP rel
操作,跳转到的目的地址 = 当前 16位 PC值 + rel
⒍ 相对寻址注意:
1),当前 PC值,指程序中下一条指令所在的首地址,是一个 16位数;
2) 符号,rel”表示,偏移量,,是一个带符号的单字节数,范围是,-128— +127(80H— 7FH)
在实际编程中,,rel” 通常用标号代替在实际编程中,,rel”
通常用标号代替例,SJMP LOOP1
例,2000H,SJMP 08H ;
原 PC值为 2000H;执行这条指令后的当前 PC
值为 2002H,rel为 08H。 2002H+08H=200AH,转移目的地址为 200AH,程序就跳转至 200AH去执行了。
右图为 SJMP 08H相对寻址示意图。;将位地址 07H(字节地址 20H 中最高位 )中的数据传送至进位位 Cy。
⒎ 位寻址位寻址是对内 RAM和特殊功能寄存器中的可寻址位进行操作的寻址方式。
MOV C,07H
指令中直接给出了操作数所在的位地址。
例,CLR P1.0 ; (P1.0) ← 0
SETB ACC.7 ; (ACC.7)← 1
CPL C ; ( C )← NOT( C )
注意:
1) 位地址里的数据只可能是一个 0 或 1
2) 有的位地址十分明确,如 P1.0,ACC.7等,有的位地址则,不太明确,,如:
MOV A,17H ; (A)←( 17H),17H是 字节地址
MOV ACC.0,17H ;(ACC.0)←( 17H),这里
ACC.0 是 位地址 所以该指令中的 17H是 22H单元的第 7位
§ 3-2 指令系统功能分五类,共 111条指令数据传送类指令算术运算类指令逻辑运算及移位指令位操作类指令控制转移类指令
① MOV A,Rn ;Rn→A,n=0~ 7
② MOV A,@Ri ;(Ri)→A,i= 0,1
③ MOV A,direct ;(direct)→A
④ MOV A,#data ;data→A
3.2.1 数据传送类指令
⒈ 内 RAM数据传送指令
⑴ 以 累加器 A为目的字节的传送指令 (4条 )
【 例 3-1】 若 R0=40H,(30H)=60H,(40H)=50H
MOV A,R0 ;将工作寄存器 R0中的数据传送至 A中,A=40H
MOV A,@R0 ;将以 R0中内容为地址的存储单元中的数据送至 A
中 A=50H
MOV A,30H ;将直接地址 30H存储单元中的数据传送至 A中,
A=60H
MOV A,#30H ;将立即数 #30H送入 A中,A=30H
① MOV Rn,A ;A→Rn,n= 0~ 7
② MOV Rn,direct;(direct)→Rn,n= 0~ 7
③ MOV Rn,#data ;data→Rn,n= 0~ 7
⑵ 以 工作寄存器 Rn为目的字节的传送指令 (3条 )
⑶ 以 直接地址 为目的字节的传送指令 (5条 )
① MOV direct,A ;A→ ( direct)
② MOV direct,Rn ;Rn→ ( direct),n=0~ 7
③ MOV direct,@Ri ;(Ri)→ ( direct),i=0,1
④ MOV direct1,direct2;(direct2)→ ( direct1)
⑤ MOV direct,#data;data→ ( direct)
⑷ 以 寄存器间址 为目的字节的传送指令 (3条 )
① MOV @Ri,A ;A→(Ri),i= 0,1
② MOV @Ri,direct;(direct)→(Ri),i= 0,1
③ MOV @Ri,#data ;data→(Ri),i= 0,1
⒉ 16位数据传送指令
MOV DPTR,#data16 ;data16→DPTR
【 例 】
MOV DPTR,#1234H ;DPTR=1234H
该指令也可以用两条 8位数据传送指令实现:
MOV DPH,#12H ;DPH=12H
MOV DPL,#34H ;DPL=34H,DPTR=1234H
① MOVX A,@Ri ;(Ri)→A,i= 0,1
② MOVX A,@DPTR ;(DPTR)→A
③ MOVX @Ri,A ;A→(Ri),i= 0,1
④ MOVX @DATR,A ;A→(DATR)
⒊ 外 RAM传送指令 (4条 )
⒋ 读 ROM指令 (2条 )
内 RAM(包括特殊功能寄存器 ),用 MOV指令传送;
外 RAM,用 MOVX指令传送;
ROM,用 MOVC指令传送。
① MOVC A,@A+DPTR ;(A+DPTR)→A
② MOVC A,@A+PC ;PC+1→PC,(A+PC)→A
三个不同的存储空间用三种不同的指令传送:
【 例 3-9】 按下列要求传送数据:设 ROM(2000H)=ABH
(1)ROM 2000H单元数据送内 RAM 10H单元;
(2)R0M 2000H单元数据送外 RAM 80H单元;
(3)ROM 2000H单元数据送外 RAM 1000H单元;
解 (1),MOV DPTR,#2000H ;置基址 2000H,DPTR=2000H
MOV A,#00H ;置变址 0,A=00H
MOVC A,@A+DPTR ;读 ROM 2000H,A=ABH
MOV 10H,A ;存内 RAM 10H单元,(10H)=ABH
解 (2),MOV DPTR,#1FFFH ;置基址 1FFFH,DPTR=1FFFH
MOV A,#01H ;置变址 01H,A=01H
MOVC A,@A+DPTR ;读 ROM 2000H,A=ABH
NOV R0,#80H ;置外 RAN间址,R0=80H
MOVX @R0,A ;写外 RAM 80H,外 RAM(80H)=ABH
解 (3),MOV DPTR,#2000H ;置基址 2000H,DPTR=2000H
MOV A,#00H ;置变址 0,A=00H
MOVC A,@A+DPTR ;读 ROM 2000H,A=ABH
MOV DPH,1OH ;修改外 RAN地址,DPTR=1000H
MOVX @DPTR,A ;写外 RAM 1000H,外 RAM(1000H)=ABH
【 例 3,10】 已知 ROM中存有 0~9的平方表,首地址为 2000H,
试根据累加器 A中的数值查找对应的平方值,存入内 RAM 30H。
(设 A=3)
解,若用 DPTR作为基址寄存器,可编程如下:
1000H,MOV DPTR,#2000H ;置 ROM平方表首地址
MOVC A,@A+DPTR ; A+2000H=2003H(设 A=3),; A=(2003H)=09H
MOV 30H,A ;平方值存入内 RAM 30H中
…… ……
2000H,00H ;平方表,02=0
2001H,01H ; 12=1
2002H,04H ; 22=4
2003H,09H ; 32=9
2004H,10H ; 42=16,16=10H
…… ……
2009H,51H ; 92=81,81=51H
① PUSH direct ;SP+1→SP,(direct)→(SP)
② POP direct ;(SP)→(direct),SP-1→SP
⒌ 堆栈操作指令 (2条 )
⑴ PUSH为入栈指令例 PUSH 30H; ( 30H) =2BH,具体操作是:
① 先将堆栈指针 SP的内容( 0FH)加 1,指向堆栈顶的一个空单元,此时 SP=10H;
② 然后将指令指定的直接寻址单元 30H中的数据( 2BH)
送到该空单元中。
⑵ POP为出栈指令例 POP 40H ; (40H)=4CH,具体操作是:
① 先将 SP所指单元 0FH(栈顶地址)中的数据( 4CH)
弹出,送到指定的内 RAM单元 40H,( 40H) =4CH;
② 然后 SP-1→SP,SP=0EH,SP仍指向栈顶地址。
⒍ 交换指令 ( 5条)
① XCH A,Rn ; A←→Rn,n=0~ 7
② XCH A,@Ri ; A←→(Ri),i=0,1
③ XCH A,direct ; A←→(direct)
SWAP A ; A7~ 4←→A 3~ 0
⑴ 字节交换指令
⑵ 半字节交换指令
XCHD A,@Ri ; A3~ 0←→(Ri) 3~ 0
高 4位不变。 i=0,1
⑶ 累加器高低四位互换
① ADD A,Rn ;A+Rn→A(n=0 ~ 7)
有进位,Cy=1;无进位,Cy=0
② ADD A,@Ri ;A+(Ri)→A(i=0,1)
有进位,Cy=1;无进位,Cy=0
③ ADD A,direct ;A+(direct)→A
有进位,Cy=1;无进位,Cy=0
④ ADD A,#data ;A+data→A
有进位,Cy=1;无进位,Cy=0
3.2.2 算术运算类指令
⒈ 加法指令
⑴ 不带 Cy加法指令 ( 4条)
⑵ 带 Cy加法指令 ( 4条)
① ADDC A,Rn ;A+Rn+Cy→A(n=0 ~ 7)
有进位,Cy=1;无进位,Cy=0
② ADDC A,@Ri ;A+(Ri)+Cy→A(i=0,1)
有进位,Cy=1;无进位,Cy=0
③ ADDC A,direct ;A+(direct)+Cy→A
有进位,Cy=1;无进位,Cy=0
④ ADDC A,#data ;A+data+Cy→A
有进位,Cy=1;无进位,Cy=0
⒉ 减法指令 ( 4条)
① SUBB A,Rn ; A-Rn-Cy→A,(n=0~ 7),
有借位,Cy=1;无借位,Cy=0
② SUBB A,@Ri ; A-(Ri)-Cy→A,(n=0~ 1),
有借位,Cy=1;无借位,Cy=0
③ SUBB A,direct; A-direct-Cy→A,
有借位,Cy=1;无借位,Cy=0
④ SUBB A,#data ; A-data-Cy→A,
有借位,Cy=1;无借位,Cy=0
① INC A ;A+1→A
② INC Rn ;Rn+1→Rn,n= 0~ 7
③ INC @Ri ;(Ri)+1→(Ri),i=0,1
④ INC direct ;(direct)+1→(direct)
⑤ INC DPTR ;DPTR+1→DPTR
⒊ 加 1减 1指令
⑴ 加 1指令 ( 5条)
⑵ 减 1指令 ( 4条)
① DEC A ;A-1→A
② DEC Rn ;Rn-1→Rn,n=0~ 7
③ DEC @Ri ;(Ri)-1→(Ri),i=0,1
④ DEC direct ;(direct)-1→(direct)
加 1减 1指令涉及 A时,会影响 P,但不影响其他标志位。
⒋ BCD码调整指令
DA A
功能:对加法运算结果进行 BCD码调整。
十进制调整,( DA A —— 1条)
用于两个 BCD码之间的相加,这条指令只能跟在
ADD 或 ADDC 之后
BCD码是指,用二进制表达的十进制数,。
如,十进制数 20可以用二进制数
00010100B表示 ; 也可以用十六进制数 14H表示;
还可以用 BCD码 00100000B 或 20H 表示。
4个二进制位就可以表示一位 BCD码:
0000~ 1001 可表示十进制数 (BCD数 ) 0~ 9;
8个二进制位就可以表示两位压缩的 BCD码:
00000000~ 10011001 表示 00~ 99。
十进制调整,( DA A —— 1条)
用于两个 BCD码之间的相加,这条指令只能跟在
ADD 或 ADDC 之后若 (A)3~ 0?9或 (AC)=1则 (A)3~ 0?(A)3~ 0+ 6;
若 (A)7~ 4?9或 (CY)=1则 (A)7~ 4?(A)7~ 4+ 6;
例:两个十进制数,65”与,58”相加,根据常识,
显然其和应当为,123”。
MOV A,#65H
ADD A,#58H
DA A
结果,(A)= 23H
(CY)= 1
指令,DA A” 完成的操作,
6 5 0110 0101
5 8 0101 1000
+
1 3
18 19
2
6 6 0110 0110
若 (A)3~ 0?9或 (AC)=1则 (A)3~ 0?(A)3~ 0+ 6;
若 (A)7~ 4?9或 (CY)=1则 (A)7~ 4?(A)7~ 4+ 6;
又如:两个十进制数,39”与,58”相加,根据常识,显然其和应当为,97”。
MOV A,#39H
ADD A,#58H
DA A
结果,(A)= 97H
(CY)= 0
3 9 0011 1001
5 8 0101 1000
+
0 7
23
9
6 0110
指令,DA A” 完成的操作:
DIV AB ;(A÷ B)商 → A,余数 → B
Cy=0,OV=0
⒌ 乘除法指令
⑴ 乘法指令 ( 1条)
MUL AB ; A× B→BA
⑵ 除法指令 ( 1条)
三,逻辑运算及移位指令
① ANL A,Rn ;A∧Rn→A
② ANL A,@Ri ;A∧(Ri)→A
③ ANL A,#data ;A∧data→A
④ ANL A,direct ;A∧(direct)→A
⑤ ANL direct,A ;(direct)∧A→direct
⑥ ANL direct,#data;(direct)∧data→direct
⒈ 逻辑,与,运算指令 ( 6条)
⒉ 逻辑,或,运算指令 ( 6条)
① ORL A,Rn ;A∨ Rn→A
② ORL A,@Ri ;A∨ (Ri)→A
③ ORL A,#data ;A∨ data→A
④ ORL A,direct ;A∨ (direct)→A
⑤ ORL direct,A ;(direct)∨ A→direct
⑥ ORL direct,#data;(direct)∨ data→direct
⒊ 逻辑,异或,运算指令 ( 6条)
① XRL A,Rn ;A?Rn→A
② XRL A,@Ri ;A?(Ri)→A
③ XRL A,#data ;A?data→A
④ XRL A,direct ;A?(direct)→A
⑤ XRL direct,A ;(direct)?A→direct
⑥ XRL direct,#data;(direct)?data→direct
① CLR A ;0→A
② CPL A ;A→A
⒋ 清零和取反指令
⒌ 循环移位指令 ( 4条 )
① 循环左移,RL A
② 带 Cy循环左移,RLC A
③ 循环右移,RR A
④ 带 Cy循环右移,RRC A
① MOV C,bit ;(bit)→Cy
② MOV bit,C ;Cy→bit
四,位操作类指令
⒈ 位传送指令 ( 2条)
指令中 C即进位位 Cy的助记符,bit为内 RAM 20H~
2FH中的 128个可寻址位和特殊功能寄存器中的可寻址位存储单元。
【 例 3-36】 将位存储单元 24H.4中的内容传送到位存储单元 24H.0。
解,MOV C,24H.4 ; (24H.4) C
MOV 24H.0,C ; C (24H.0)
或写成:
MOV C,24H ; (24H) C,(24H=24H.4)
MOV 20H,C ; C (20H),(20H=24H.0)
⑵ 位取反指令,
① CPL C ;C→C
② CPL bit ;(bit)→bit
⒉ 位修正指令 ( 6条)
⑴ 位清 0指令,
① CLR C ;0→C
② CLR bit ;0→bit
⑶ 位置 1指令,
① SETB C ;1→C
② SETB bit ;1→bit
⑴ 位逻辑“与”运算指令,
① ANL C,bit ;C∧(bit)→C
② ANL C,/bit ;C∧(bit)→C
⑵ 位逻辑“或”运算指令,
① ORL C,bit ;C∨(bit)→C
② ORL C,/bit ;C∨( bit)→C
⒊ 位逻辑运算指令 ( 4条)
⑶ 相对转移指令
SJMP rel ;PC+2→PC,PC+rel→PC
五,控制转移类指令
⒈ 无条件转移指令 ( 3条)
⑴ 长转移指令
LJMP addr16 ; addr15~ 0→PC,
⑵ 短转移指令
AJMP addr11 ; PC+2→PC,
addr10~ 0→PC 10~ 0,
PC15~ 11不变
⑷ 间接转移指令 (散转指令)
JMP @A+DPTR ;A+DPTR→PC
LJMP,AJMP,SJMP三条无条件转移指令的 区别,
① 转移范围不一样。
LJMP转移范围是 64KB;
AJMP转移范围是与当前 PC值同一 2KB;
SJMP转移范围是当前 PC-128B~ +127B。
使用 AJMP和 SJMP指令应注意转移目标地址是否在转移范围内,若超出范围,程序将出错。
② 指令字节不一样。
LJMP是 3字节指令;
AJMP,SJMP是 2字节指 令。
⒉ 条件转移指令 ( 13条)
条件转移指令根据判断条件可分为:
⑴ 判 C 转移
⑵ 判 bit 转移
⑶ 判 A 转移
⑷ 减 1非 0转移
⑸ 比较不相等转移指令满足条件,则转移;
不满足条件,则程序顺序执行。
② C=0转移指令,
JNC rel ; PC+2→PC,
若 Cy=0,则 PC+rel→PC,转移若 Cy=1,则程序顺序执行。
⑴ 判 C转移指令 ( 2条 )
① C=1转移指令,
JC rel ; PC+2→PC,
若 Cy=1,则 PC+rel→PC,转移若 Cy=0,则程序顺序执行。
③ ( bit) =1转移并清 0指令,
JBC bit,rel ; PC+3→PC,;若 (bit)=1,则 PC+rel→PC,转移,且 0→(bit);若 (bit)=0,则程序顺序执行
⑵ 判 bit转移指令 ( 3条)
① ( bit) =1转移指令,
JB bit,rel ; PC+3→PC,
若 (bit)=1,则 PC+rel→PC,转移若 (bit)=0,则程序顺序执行
② ( bit) =0转移指令,
JNB bit,rel ; PC+3→PC,
若 (bit)=0,则 PC+rel→PC,转移若 (bit)=1,则程序顺序执行
① A=0转移指令,
JZ rel ; PC+2→PC,
若 A=0,则 PC+rel→PC,转移若 A?0,则程序顺序执行
⑶ 判 A转移指令 ( 2条)
② A?0转移指令,
JNZ rel ; PC+2→PC,
若 A?0,则 PC+rel→PC,转移若 A=0,则程序顺序执行
⑷ 减 1非 0转移指令 ( 2条)
② DJNZ direct,rel;PC+3→PC,(direct) -1→direct
若 (direct)=0,则程序顺序执行若 (direct)?0,则 PC+rel→PC,转移
① DJNZ Rn,rel ;PC+2→PC,Rn -1→Rn,
若 Rn=0,则程序顺序执行若 Rn?0,则 PC+rel→PC,转移
⑸ 比较转移指令 ( 4条)
① CJNE A,direct,rel;PC+3→PC,;若 A=(direct),则程序顺序执行;若 A≠ (direct),则 PC+rel→PC,转移;且若 A≥ (direct),Cy=0;若 A< (direct),Cy=1
② CJNE A,#data,rel ;PC+3→PC,;若 A=data,则程序顺序执行;若 A≠ data,则 PC+rel→PC,转移;且若 A≥ data,Cy=0;若 A< data,Cy=1
③ CJNE Rn,#data,rel;PC+3→PC,;若 Rn=data,则程序顺序执行;若 Rn≠ data,则 PC+rel→PC,转移;且若 Rn≥ data,Cy=0;若 Rn< data,Cy=1
④ CJNE @Ri,#data,rel;PC+3→PC,;若 (Ri)=data,则程序顺序执行;若 (Ri)≠ data,则 PC+rel→PC,转移;且若 (Ri)≥ data,Cy=0;若 (Ri)< data,Cy=1
① 产生当前 PC,PC+3→PC,
( PC+3是因为该指令为三字节指令 )
② 断口地址低 8位保存到堆栈中:
SP+1→SP,(PC)0~ 7→(SP)
③ 断口地址高 8位保存到堆栈中:
SP+1→SP,(PC)8~ 15→(SP)
④ 形成转移目标地址,addr16→PC
⒊ 调用和返回指令
LCALL addr16 ; PC+3→PC,SP+1→SP,(PC) 0~ 7→(SP); SP+1→SP,(PC) 8~ 15→(SP); addr16→PC
⑴ 长调用指令
LCALL指令执行步骤:
① 产生当前 PC,PC+2→PC,
( PC+2是因为该指令为双字节指令 )
② 断口地址低 8位保存到堆栈中:
SP+1→SP,(PC)0~ 7→(SP)
③ 断口地址高 8位保存到堆栈中:
SP+1→SP,(PC)8~ 15→(SP)
④ 形成转移目标地址,addr11→PC 0~ 10,PC11~ 15不变
⑵ 短调用指令
ACALL addr11; PC+2→PC,SP+1→SP,(PC) 0~ 7→(SP); SP+1→SP,(PC) 8~ 15→(SP); addr0~ 10→PC 0~ 10,PC11~ 15不变
ACALL指令执行步骤:
① (SP)→PC 8~ 15,SP-1→SP ;
② (SP)→PC 0~ 7,SP-1→SP 。
⑶ 返回指令,
返回指令有子程序返回和中断返回两种:
① RET ;子程序返回
② RETI ;中断返回返回指令执行步骤:
⒋ 空操作指令 ( 1条)
NOP为单机周指令,在时间上占用一个机器周期,常用于时间“微调”。
NOP ;PC+1→PC
小结,MCS-51指令集(五大类功能)
数据传送类指令 ( 29条)
算术运算类指令 ( 24条)
逻辑运算及移位类指令 ( 24条)
控制转移类指令 ( 17条)
位操作 (布尔操作 )类指令 ( 17条)
小结内部存储器间传送,( MOV—— 16条)
外部数据存储器 RAM与累加器间传送,
( MOVX—— 4条)
程序存储器 ROM向累加器传送:
( MOVC—— 2条)
数据交换:( XCH,XCHD,SWAP—— 5条)
堆栈操作,( PUSH,POP—— 2条)
(一 )数据传送类指令( 5种 /29条)
小结
(二 )算术运算类指令( 6种 /24条)
加法运算 (ADD—— 4条 )
带进位加法运算 (ADDC—— 4条 )
带借位减法运算 (SUBB—— 4条 )
加 1/减 1操作 (INC,DEC—— 9条 )
单字节乘 /除法运算 (MUL,DIV—— 2条 )
十进制调整 (DA A—— 1条 )
小结
(三 )逻辑运算及移位指令( 5种 /24条)
逻辑与运算,( ANL—— 6条)
逻辑或运算,( ORL—— 6条)
逻辑异或运算,( XRL—— 6条)
累加器清零 /取反,( CLR,CPL—— 2条)
累加器移位操作,( RL,RLC,RR,RRC— 4条)
小结
(四 )控制转移类指令( 4种 /17条)
无条件转移,
( LJMP,AJMP,SJMP,JMP—— 4条)
条件转移(判断跳转):
( JZ,JNZ,CJNE,DJNZ—— 8条)
子程序调用及返回:
( LCALL,ACALL,RET,RETI—— 4条)
空操作,( NOP—— 1条)
小结
(五 )位操作类指令( 4种 17条)
位传送,( MOV—— 2条)
位清零 /置位,( CLR,SETB—— 4条)
位逻辑与 /或 /非运算:
( ANL,ORL,CPL—— 6条)
位条件转移,
( JC,JNC,JB,JNB,JBC—— 5条)
小结
OVER !
80C51指令的基本格式
80C51指令功能分类
指令系统中的常用符号
80C51指令系统的七种寻址方式
数据传送类指令
算术运算类指令
逻辑运算及移位指令
位操作类指令
控制转移类指令
51系列单片机指令集含有 111条指令每条指令在执行时要花去一定的 时间,以机器周期为单位。按指令 执行时间 分类:
单周期 (64条 );双周期 (45条 );4周期 (2条 )
按指令的 功能 分类,可分为 5大类:
数据传送类( 29条);算术运算类( 24条)
逻辑运算及移位类( 24);控制转移类( 17条)
位操作类( 17条)
每条指令在程序存储器 ROM中占据一定的 空间,
以字节为单位。按指令 所占字节数 分类:
单字节 (49条 );双字节 (46条 );3字节 (16条 )
§ 3-1 指令系统基本概念标号:操作码 操作数;注释
3.1.1 指令基本格式
方括符 [ ]表示可选项
标号代表指令所在地址,1-8个字母 /数字,,,”结尾
[标号,]操作码 [目的操作数 ][,源操作数 ][;注释 ]
START:MOV A,#30H ;将立即数 30H传送至 A中
MOV DPTR,#5678H ;将立即数 5678H传送至 DPTR
⑴ 标号:指令的符号地址。
① 用于一段功能程序的识别标记或控制转移地址 。
② 指令前的标号代表该指令的地址,
是 用符号表示的地址 。
③ 一般用英文字母和数字组成。
④ 标号必须用冒号,:”与操作码分隔。
⑵ 操作码:表示指令的操作功能。
① 操作码用助记符表示,
它 代表了指令 的操作功能 。
② 操作码是指令的必需部分,
是指令的核心,不可缺少。
⑶ 操作数:参加操作的数据或数据地址。
⑤ 操作数与操作码之间用空格分隔,操作数与操作数之间用逗号,,,分隔 。
① 操作数可以是 数据,也可以是 数据的地址,
数据地址的地址 或 操作数的其他信息 。
② 操作数可分为目的操作数和源操作数。
③ 操作数可用二进制数、十进制数或十六进制数表示。
④ 操作数的个数可以是 0~ 3个。
⑷ 注释:指令功能说明。
① 注释属于非必需项,是为便于阅读,
对指令功能作的说明和注解 。
② 注释必须以,;,开始。
3.1.2 指令分类
⑶ 按指令功能分类,
可分为数据传送类,算术运算类,
逻辑运算类,位操作类和控制转移类 等 5大 类 指令 。
80C51共有 111条指令。
⑴ 按指令长度分类,
可分为 1字节,2字节和 3字 节指令。
⑵ 按指令执行时间分类,
可分为 1机周,2机周和 4机 周指令。
3.1.3 指令系统中的常用符号
⑹ bit,位地址 。 SETB ACC.7
代表片内 RAM中的可寻址位 00H~ 7FH及 SFR中的可寻址位 。
⑴ #,立即数符 。 MOV A,#30H
#data,8位立即数; #data16,16位立即数。
⑵ direct,8位直接地址 MOV A,3AH
代表内 RAM 00H~ 7FH或 SFR的 80H~ FFH 。
⑶ @,间接寻址符 。 MOV A,@R0
如 @Ri,@DPTR,@A+PC,@A+DPTR。
⑷ addr11,11位目的地址 。
addr16,16位目的地址 。
⑸ rel,带符号的 8位偏移地址 。 SJMP rel
用于转移指令,其范围是相对于下一条指令第 1字节地址的 -128~ +127个字节。
3.1.4 寻址方式寻址就是寻找操作数的地址。
七种寻址方式,一条指令可能含多种寻址方式
立即寻址
直接寻址
寄存器寻址
寄存器间接寻址
变址寻址 (基址寄存器 +变址寄存器间接寻址 )
相对寻址
位寻址
【 例 】
⒈ 立即寻址立即寻址是 直接给出操作数,操作数前有立即数符,#,。
MOV A,#30H ;将立即数 30H传送至 A中
MOV DPTR,#5678H ;将立即数 5678H传送至 DPTR
ADD A,#05H ; (A)←(A)+ 立即数 05H
注意:符号,#”表明其后跟的是立即数,
立即数 —— 就是数字量本身 。
⒉ 直接寻址
MOV A,3AH ; 将内 RAM 3AH单元中的数据传送至 A中
MOV A,P0 ; 将特殊功能寄存器 P0口中的数据传送至 A
中说明,3AH和 P0是以 direct形式出现的直接地址访问特殊功能寄存器 SFR只能采用直接寻址方式 。
直接寻址是 给出操作数的直接地址 。 直接寻址范围 为内 RAM 128B和特殊功能寄存器。
【 例 】
⒊ 寄存器寻址
MOV A,R0 ;将 R0中的数据传送至 A中
INC A
MUL AB
从寄存器中读取操作数或存放操作数进寄存器寄存器寻址的操作数在规定的寄存器中。
规定的寄存器有,① 工作寄存器 R0~ R7
② 累加器 A
③ 双字节 AB
④ 数据指针 DPTR
⑤ 位累加器 Cy
这些被寻址寄存器中的内容就是操作数
【 例 】
⒋ 寄存器间接寻址
MOV A,@R0 ;将以 R0中内容为地址的存储单元中的数据传送至 A中
MOVX A,@DPTR ;将外 RAM DPTR所指存储单元中的数据传送至 A中
PUSH PSW ;将 PSW中数据传送至堆栈指针 SP所指的存储单元中
MOV @R1,#0FH ;(30H)← 立即数 0FH
寄存器中的内容是一个地址,由该地址单元寻址到所需的操作数 。 间接寻址用间址符,@” 作为前缀 。
【 例 】
注意:
1),间接,表示某寄存器中的,内容,只是一个,单元地址,,这个地址单元中存放的数据才是要找的,操作数,。
2) 符号,@”表示,在 …,,其含义与读音皆同,at”。
⒌ 变址寻址
MOVC A,@A+DPTR
【 例 】
在变址寻址中,操作数 地址=基址+变址用于读 ROM数据操作。;将 A的内容与 DPTR内容相加,
得到一个新地址,从该地址
ROM中读取数据送入 A中。
以 16位的地址指针寄存器 DPTR或 16位的 PC寄存器为 基址寄存器,以累加器 A 为 变址寄存器,两者中的,内容,形成一个 16位的,地址,,该,地址,
所指的存储单元中的内容才是操作数。
MOVC A,@A+PC ; A ( A+PC)
当前 PC值加上指令中规定的偏移量 rel,构成实际的操作数地址例,SJMP rel
操作,跳转到的目的地址 = 当前 16位 PC值 + rel
⒍ 相对寻址注意:
1),当前 PC值,指程序中下一条指令所在的首地址,是一个 16位数;
2) 符号,rel”表示,偏移量,,是一个带符号的单字节数,范围是,-128— +127(80H— 7FH)
在实际编程中,,rel” 通常用标号代替在实际编程中,,rel”
通常用标号代替例,SJMP LOOP1
例,2000H,SJMP 08H ;
原 PC值为 2000H;执行这条指令后的当前 PC
值为 2002H,rel为 08H。 2002H+08H=200AH,转移目的地址为 200AH,程序就跳转至 200AH去执行了。
右图为 SJMP 08H相对寻址示意图。;将位地址 07H(字节地址 20H 中最高位 )中的数据传送至进位位 Cy。
⒎ 位寻址位寻址是对内 RAM和特殊功能寄存器中的可寻址位进行操作的寻址方式。
MOV C,07H
指令中直接给出了操作数所在的位地址。
例,CLR P1.0 ; (P1.0) ← 0
SETB ACC.7 ; (ACC.7)← 1
CPL C ; ( C )← NOT( C )
注意:
1) 位地址里的数据只可能是一个 0 或 1
2) 有的位地址十分明确,如 P1.0,ACC.7等,有的位地址则,不太明确,,如:
MOV A,17H ; (A)←( 17H),17H是 字节地址
MOV ACC.0,17H ;(ACC.0)←( 17H),这里
ACC.0 是 位地址 所以该指令中的 17H是 22H单元的第 7位
§ 3-2 指令系统功能分五类,共 111条指令数据传送类指令算术运算类指令逻辑运算及移位指令位操作类指令控制转移类指令
① MOV A,Rn ;Rn→A,n=0~ 7
② MOV A,@Ri ;(Ri)→A,i= 0,1
③ MOV A,direct ;(direct)→A
④ MOV A,#data ;data→A
3.2.1 数据传送类指令
⒈ 内 RAM数据传送指令
⑴ 以 累加器 A为目的字节的传送指令 (4条 )
【 例 3-1】 若 R0=40H,(30H)=60H,(40H)=50H
MOV A,R0 ;将工作寄存器 R0中的数据传送至 A中,A=40H
MOV A,@R0 ;将以 R0中内容为地址的存储单元中的数据送至 A
中 A=50H
MOV A,30H ;将直接地址 30H存储单元中的数据传送至 A中,
A=60H
MOV A,#30H ;将立即数 #30H送入 A中,A=30H
① MOV Rn,A ;A→Rn,n= 0~ 7
② MOV Rn,direct;(direct)→Rn,n= 0~ 7
③ MOV Rn,#data ;data→Rn,n= 0~ 7
⑵ 以 工作寄存器 Rn为目的字节的传送指令 (3条 )
⑶ 以 直接地址 为目的字节的传送指令 (5条 )
① MOV direct,A ;A→ ( direct)
② MOV direct,Rn ;Rn→ ( direct),n=0~ 7
③ MOV direct,@Ri ;(Ri)→ ( direct),i=0,1
④ MOV direct1,direct2;(direct2)→ ( direct1)
⑤ MOV direct,#data;data→ ( direct)
⑷ 以 寄存器间址 为目的字节的传送指令 (3条 )
① MOV @Ri,A ;A→(Ri),i= 0,1
② MOV @Ri,direct;(direct)→(Ri),i= 0,1
③ MOV @Ri,#data ;data→(Ri),i= 0,1
⒉ 16位数据传送指令
MOV DPTR,#data16 ;data16→DPTR
【 例 】
MOV DPTR,#1234H ;DPTR=1234H
该指令也可以用两条 8位数据传送指令实现:
MOV DPH,#12H ;DPH=12H
MOV DPL,#34H ;DPL=34H,DPTR=1234H
① MOVX A,@Ri ;(Ri)→A,i= 0,1
② MOVX A,@DPTR ;(DPTR)→A
③ MOVX @Ri,A ;A→(Ri),i= 0,1
④ MOVX @DATR,A ;A→(DATR)
⒊ 外 RAM传送指令 (4条 )
⒋ 读 ROM指令 (2条 )
内 RAM(包括特殊功能寄存器 ),用 MOV指令传送;
外 RAM,用 MOVX指令传送;
ROM,用 MOVC指令传送。
① MOVC A,@A+DPTR ;(A+DPTR)→A
② MOVC A,@A+PC ;PC+1→PC,(A+PC)→A
三个不同的存储空间用三种不同的指令传送:
【 例 3-9】 按下列要求传送数据:设 ROM(2000H)=ABH
(1)ROM 2000H单元数据送内 RAM 10H单元;
(2)R0M 2000H单元数据送外 RAM 80H单元;
(3)ROM 2000H单元数据送外 RAM 1000H单元;
解 (1),MOV DPTR,#2000H ;置基址 2000H,DPTR=2000H
MOV A,#00H ;置变址 0,A=00H
MOVC A,@A+DPTR ;读 ROM 2000H,A=ABH
MOV 10H,A ;存内 RAM 10H单元,(10H)=ABH
解 (2),MOV DPTR,#1FFFH ;置基址 1FFFH,DPTR=1FFFH
MOV A,#01H ;置变址 01H,A=01H
MOVC A,@A+DPTR ;读 ROM 2000H,A=ABH
NOV R0,#80H ;置外 RAN间址,R0=80H
MOVX @R0,A ;写外 RAM 80H,外 RAM(80H)=ABH
解 (3),MOV DPTR,#2000H ;置基址 2000H,DPTR=2000H
MOV A,#00H ;置变址 0,A=00H
MOVC A,@A+DPTR ;读 ROM 2000H,A=ABH
MOV DPH,1OH ;修改外 RAN地址,DPTR=1000H
MOVX @DPTR,A ;写外 RAM 1000H,外 RAM(1000H)=ABH
【 例 3,10】 已知 ROM中存有 0~9的平方表,首地址为 2000H,
试根据累加器 A中的数值查找对应的平方值,存入内 RAM 30H。
(设 A=3)
解,若用 DPTR作为基址寄存器,可编程如下:
1000H,MOV DPTR,#2000H ;置 ROM平方表首地址
MOVC A,@A+DPTR ; A+2000H=2003H(设 A=3),; A=(2003H)=09H
MOV 30H,A ;平方值存入内 RAM 30H中
…… ……
2000H,00H ;平方表,02=0
2001H,01H ; 12=1
2002H,04H ; 22=4
2003H,09H ; 32=9
2004H,10H ; 42=16,16=10H
…… ……
2009H,51H ; 92=81,81=51H
① PUSH direct ;SP+1→SP,(direct)→(SP)
② POP direct ;(SP)→(direct),SP-1→SP
⒌ 堆栈操作指令 (2条 )
⑴ PUSH为入栈指令例 PUSH 30H; ( 30H) =2BH,具体操作是:
① 先将堆栈指针 SP的内容( 0FH)加 1,指向堆栈顶的一个空单元,此时 SP=10H;
② 然后将指令指定的直接寻址单元 30H中的数据( 2BH)
送到该空单元中。
⑵ POP为出栈指令例 POP 40H ; (40H)=4CH,具体操作是:
① 先将 SP所指单元 0FH(栈顶地址)中的数据( 4CH)
弹出,送到指定的内 RAM单元 40H,( 40H) =4CH;
② 然后 SP-1→SP,SP=0EH,SP仍指向栈顶地址。
⒍ 交换指令 ( 5条)
① XCH A,Rn ; A←→Rn,n=0~ 7
② XCH A,@Ri ; A←→(Ri),i=0,1
③ XCH A,direct ; A←→(direct)
SWAP A ; A7~ 4←→A 3~ 0
⑴ 字节交换指令
⑵ 半字节交换指令
XCHD A,@Ri ; A3~ 0←→(Ri) 3~ 0
高 4位不变。 i=0,1
⑶ 累加器高低四位互换
① ADD A,Rn ;A+Rn→A(n=0 ~ 7)
有进位,Cy=1;无进位,Cy=0
② ADD A,@Ri ;A+(Ri)→A(i=0,1)
有进位,Cy=1;无进位,Cy=0
③ ADD A,direct ;A+(direct)→A
有进位,Cy=1;无进位,Cy=0
④ ADD A,#data ;A+data→A
有进位,Cy=1;无进位,Cy=0
3.2.2 算术运算类指令
⒈ 加法指令
⑴ 不带 Cy加法指令 ( 4条)
⑵ 带 Cy加法指令 ( 4条)
① ADDC A,Rn ;A+Rn+Cy→A(n=0 ~ 7)
有进位,Cy=1;无进位,Cy=0
② ADDC A,@Ri ;A+(Ri)+Cy→A(i=0,1)
有进位,Cy=1;无进位,Cy=0
③ ADDC A,direct ;A+(direct)+Cy→A
有进位,Cy=1;无进位,Cy=0
④ ADDC A,#data ;A+data+Cy→A
有进位,Cy=1;无进位,Cy=0
⒉ 减法指令 ( 4条)
① SUBB A,Rn ; A-Rn-Cy→A,(n=0~ 7),
有借位,Cy=1;无借位,Cy=0
② SUBB A,@Ri ; A-(Ri)-Cy→A,(n=0~ 1),
有借位,Cy=1;无借位,Cy=0
③ SUBB A,direct; A-direct-Cy→A,
有借位,Cy=1;无借位,Cy=0
④ SUBB A,#data ; A-data-Cy→A,
有借位,Cy=1;无借位,Cy=0
① INC A ;A+1→A
② INC Rn ;Rn+1→Rn,n= 0~ 7
③ INC @Ri ;(Ri)+1→(Ri),i=0,1
④ INC direct ;(direct)+1→(direct)
⑤ INC DPTR ;DPTR+1→DPTR
⒊ 加 1减 1指令
⑴ 加 1指令 ( 5条)
⑵ 减 1指令 ( 4条)
① DEC A ;A-1→A
② DEC Rn ;Rn-1→Rn,n=0~ 7
③ DEC @Ri ;(Ri)-1→(Ri),i=0,1
④ DEC direct ;(direct)-1→(direct)
加 1减 1指令涉及 A时,会影响 P,但不影响其他标志位。
⒋ BCD码调整指令
DA A
功能:对加法运算结果进行 BCD码调整。
十进制调整,( DA A —— 1条)
用于两个 BCD码之间的相加,这条指令只能跟在
ADD 或 ADDC 之后
BCD码是指,用二进制表达的十进制数,。
如,十进制数 20可以用二进制数
00010100B表示 ; 也可以用十六进制数 14H表示;
还可以用 BCD码 00100000B 或 20H 表示。
4个二进制位就可以表示一位 BCD码:
0000~ 1001 可表示十进制数 (BCD数 ) 0~ 9;
8个二进制位就可以表示两位压缩的 BCD码:
00000000~ 10011001 表示 00~ 99。
十进制调整,( DA A —— 1条)
用于两个 BCD码之间的相加,这条指令只能跟在
ADD 或 ADDC 之后若 (A)3~ 0?9或 (AC)=1则 (A)3~ 0?(A)3~ 0+ 6;
若 (A)7~ 4?9或 (CY)=1则 (A)7~ 4?(A)7~ 4+ 6;
例:两个十进制数,65”与,58”相加,根据常识,
显然其和应当为,123”。
MOV A,#65H
ADD A,#58H
DA A
结果,(A)= 23H
(CY)= 1
指令,DA A” 完成的操作,
6 5 0110 0101
5 8 0101 1000
+
1 3
18 19
2
6 6 0110 0110
若 (A)3~ 0?9或 (AC)=1则 (A)3~ 0?(A)3~ 0+ 6;
若 (A)7~ 4?9或 (CY)=1则 (A)7~ 4?(A)7~ 4+ 6;
又如:两个十进制数,39”与,58”相加,根据常识,显然其和应当为,97”。
MOV A,#39H
ADD A,#58H
DA A
结果,(A)= 97H
(CY)= 0
3 9 0011 1001
5 8 0101 1000
+
0 7
23
9
6 0110
指令,DA A” 完成的操作:
DIV AB ;(A÷ B)商 → A,余数 → B
Cy=0,OV=0
⒌ 乘除法指令
⑴ 乘法指令 ( 1条)
MUL AB ; A× B→BA
⑵ 除法指令 ( 1条)
三,逻辑运算及移位指令
① ANL A,Rn ;A∧Rn→A
② ANL A,@Ri ;A∧(Ri)→A
③ ANL A,#data ;A∧data→A
④ ANL A,direct ;A∧(direct)→A
⑤ ANL direct,A ;(direct)∧A→direct
⑥ ANL direct,#data;(direct)∧data→direct
⒈ 逻辑,与,运算指令 ( 6条)
⒉ 逻辑,或,运算指令 ( 6条)
① ORL A,Rn ;A∨ Rn→A
② ORL A,@Ri ;A∨ (Ri)→A
③ ORL A,#data ;A∨ data→A
④ ORL A,direct ;A∨ (direct)→A
⑤ ORL direct,A ;(direct)∨ A→direct
⑥ ORL direct,#data;(direct)∨ data→direct
⒊ 逻辑,异或,运算指令 ( 6条)
① XRL A,Rn ;A?Rn→A
② XRL A,@Ri ;A?(Ri)→A
③ XRL A,#data ;A?data→A
④ XRL A,direct ;A?(direct)→A
⑤ XRL direct,A ;(direct)?A→direct
⑥ XRL direct,#data;(direct)?data→direct
① CLR A ;0→A
② CPL A ;A→A
⒋ 清零和取反指令
⒌ 循环移位指令 ( 4条 )
① 循环左移,RL A
② 带 Cy循环左移,RLC A
③ 循环右移,RR A
④ 带 Cy循环右移,RRC A
① MOV C,bit ;(bit)→Cy
② MOV bit,C ;Cy→bit
四,位操作类指令
⒈ 位传送指令 ( 2条)
指令中 C即进位位 Cy的助记符,bit为内 RAM 20H~
2FH中的 128个可寻址位和特殊功能寄存器中的可寻址位存储单元。
【 例 3-36】 将位存储单元 24H.4中的内容传送到位存储单元 24H.0。
解,MOV C,24H.4 ; (24H.4) C
MOV 24H.0,C ; C (24H.0)
或写成:
MOV C,24H ; (24H) C,(24H=24H.4)
MOV 20H,C ; C (20H),(20H=24H.0)
⑵ 位取反指令,
① CPL C ;C→C
② CPL bit ;(bit)→bit
⒉ 位修正指令 ( 6条)
⑴ 位清 0指令,
① CLR C ;0→C
② CLR bit ;0→bit
⑶ 位置 1指令,
① SETB C ;1→C
② SETB bit ;1→bit
⑴ 位逻辑“与”运算指令,
① ANL C,bit ;C∧(bit)→C
② ANL C,/bit ;C∧(bit)→C
⑵ 位逻辑“或”运算指令,
① ORL C,bit ;C∨(bit)→C
② ORL C,/bit ;C∨( bit)→C
⒊ 位逻辑运算指令 ( 4条)
⑶ 相对转移指令
SJMP rel ;PC+2→PC,PC+rel→PC
五,控制转移类指令
⒈ 无条件转移指令 ( 3条)
⑴ 长转移指令
LJMP addr16 ; addr15~ 0→PC,
⑵ 短转移指令
AJMP addr11 ; PC+2→PC,
addr10~ 0→PC 10~ 0,
PC15~ 11不变
⑷ 间接转移指令 (散转指令)
JMP @A+DPTR ;A+DPTR→PC
LJMP,AJMP,SJMP三条无条件转移指令的 区别,
① 转移范围不一样。
LJMP转移范围是 64KB;
AJMP转移范围是与当前 PC值同一 2KB;
SJMP转移范围是当前 PC-128B~ +127B。
使用 AJMP和 SJMP指令应注意转移目标地址是否在转移范围内,若超出范围,程序将出错。
② 指令字节不一样。
LJMP是 3字节指令;
AJMP,SJMP是 2字节指 令。
⒉ 条件转移指令 ( 13条)
条件转移指令根据判断条件可分为:
⑴ 判 C 转移
⑵ 判 bit 转移
⑶ 判 A 转移
⑷ 减 1非 0转移
⑸ 比较不相等转移指令满足条件,则转移;
不满足条件,则程序顺序执行。
② C=0转移指令,
JNC rel ; PC+2→PC,
若 Cy=0,则 PC+rel→PC,转移若 Cy=1,则程序顺序执行。
⑴ 判 C转移指令 ( 2条 )
① C=1转移指令,
JC rel ; PC+2→PC,
若 Cy=1,则 PC+rel→PC,转移若 Cy=0,则程序顺序执行。
③ ( bit) =1转移并清 0指令,
JBC bit,rel ; PC+3→PC,;若 (bit)=1,则 PC+rel→PC,转移,且 0→(bit);若 (bit)=0,则程序顺序执行
⑵ 判 bit转移指令 ( 3条)
① ( bit) =1转移指令,
JB bit,rel ; PC+3→PC,
若 (bit)=1,则 PC+rel→PC,转移若 (bit)=0,则程序顺序执行
② ( bit) =0转移指令,
JNB bit,rel ; PC+3→PC,
若 (bit)=0,则 PC+rel→PC,转移若 (bit)=1,则程序顺序执行
① A=0转移指令,
JZ rel ; PC+2→PC,
若 A=0,则 PC+rel→PC,转移若 A?0,则程序顺序执行
⑶ 判 A转移指令 ( 2条)
② A?0转移指令,
JNZ rel ; PC+2→PC,
若 A?0,则 PC+rel→PC,转移若 A=0,则程序顺序执行
⑷ 减 1非 0转移指令 ( 2条)
② DJNZ direct,rel;PC+3→PC,(direct) -1→direct
若 (direct)=0,则程序顺序执行若 (direct)?0,则 PC+rel→PC,转移
① DJNZ Rn,rel ;PC+2→PC,Rn -1→Rn,
若 Rn=0,则程序顺序执行若 Rn?0,则 PC+rel→PC,转移
⑸ 比较转移指令 ( 4条)
① CJNE A,direct,rel;PC+3→PC,;若 A=(direct),则程序顺序执行;若 A≠ (direct),则 PC+rel→PC,转移;且若 A≥ (direct),Cy=0;若 A< (direct),Cy=1
② CJNE A,#data,rel ;PC+3→PC,;若 A=data,则程序顺序执行;若 A≠ data,则 PC+rel→PC,转移;且若 A≥ data,Cy=0;若 A< data,Cy=1
③ CJNE Rn,#data,rel;PC+3→PC,;若 Rn=data,则程序顺序执行;若 Rn≠ data,则 PC+rel→PC,转移;且若 Rn≥ data,Cy=0;若 Rn< data,Cy=1
④ CJNE @Ri,#data,rel;PC+3→PC,;若 (Ri)=data,则程序顺序执行;若 (Ri)≠ data,则 PC+rel→PC,转移;且若 (Ri)≥ data,Cy=0;若 (Ri)< data,Cy=1
① 产生当前 PC,PC+3→PC,
( PC+3是因为该指令为三字节指令 )
② 断口地址低 8位保存到堆栈中:
SP+1→SP,(PC)0~ 7→(SP)
③ 断口地址高 8位保存到堆栈中:
SP+1→SP,(PC)8~ 15→(SP)
④ 形成转移目标地址,addr16→PC
⒊ 调用和返回指令
LCALL addr16 ; PC+3→PC,SP+1→SP,(PC) 0~ 7→(SP); SP+1→SP,(PC) 8~ 15→(SP); addr16→PC
⑴ 长调用指令
LCALL指令执行步骤:
① 产生当前 PC,PC+2→PC,
( PC+2是因为该指令为双字节指令 )
② 断口地址低 8位保存到堆栈中:
SP+1→SP,(PC)0~ 7→(SP)
③ 断口地址高 8位保存到堆栈中:
SP+1→SP,(PC)8~ 15→(SP)
④ 形成转移目标地址,addr11→PC 0~ 10,PC11~ 15不变
⑵ 短调用指令
ACALL addr11; PC+2→PC,SP+1→SP,(PC) 0~ 7→(SP); SP+1→SP,(PC) 8~ 15→(SP); addr0~ 10→PC 0~ 10,PC11~ 15不变
ACALL指令执行步骤:
① (SP)→PC 8~ 15,SP-1→SP ;
② (SP)→PC 0~ 7,SP-1→SP 。
⑶ 返回指令,
返回指令有子程序返回和中断返回两种:
① RET ;子程序返回
② RETI ;中断返回返回指令执行步骤:
⒋ 空操作指令 ( 1条)
NOP为单机周指令,在时间上占用一个机器周期,常用于时间“微调”。
NOP ;PC+1→PC
小结,MCS-51指令集(五大类功能)
数据传送类指令 ( 29条)
算术运算类指令 ( 24条)
逻辑运算及移位类指令 ( 24条)
控制转移类指令 ( 17条)
位操作 (布尔操作 )类指令 ( 17条)
小结内部存储器间传送,( MOV—— 16条)
外部数据存储器 RAM与累加器间传送,
( MOVX—— 4条)
程序存储器 ROM向累加器传送:
( MOVC—— 2条)
数据交换:( XCH,XCHD,SWAP—— 5条)
堆栈操作,( PUSH,POP—— 2条)
(一 )数据传送类指令( 5种 /29条)
小结
(二 )算术运算类指令( 6种 /24条)
加法运算 (ADD—— 4条 )
带进位加法运算 (ADDC—— 4条 )
带借位减法运算 (SUBB—— 4条 )
加 1/减 1操作 (INC,DEC—— 9条 )
单字节乘 /除法运算 (MUL,DIV—— 2条 )
十进制调整 (DA A—— 1条 )
小结
(三 )逻辑运算及移位指令( 5种 /24条)
逻辑与运算,( ANL—— 6条)
逻辑或运算,( ORL—— 6条)
逻辑异或运算,( XRL—— 6条)
累加器清零 /取反,( CLR,CPL—— 2条)
累加器移位操作,( RL,RLC,RR,RRC— 4条)
小结
(四 )控制转移类指令( 4种 /17条)
无条件转移,
( LJMP,AJMP,SJMP,JMP—— 4条)
条件转移(判断跳转):
( JZ,JNZ,CJNE,DJNZ—— 8条)
子程序调用及返回:
( LCALL,ACALL,RET,RETI—— 4条)
空操作,( NOP—— 1条)
小结
(五 )位操作类指令( 4种 17条)
位传送,( MOV—— 2条)
位清零 /置位,( CLR,SETB—— 4条)
位逻辑与 /或 /非运算:
( ANL,ORL,CPL—— 6条)
位条件转移,
( JC,JNC,JB,JNB,JBC—— 5条)
小结
OVER !