第三章
MCS-51单片机的指令系统
MCS-51单片机的指令的寻址方式
MOV A,#35H; 35H→A
MOV DPTR,#1234; 1234→DPTR
将操作数的地址直接存放在指令中,直接寻址方式只能是片内 RAM的地址。
2.直接寻址
① 内部 RAM低 128单元,在指令中直接用单元地址的形式给出,地址范围是 00H~ 7FH
1.立即寻址
② 片内 RAM的高 128单元中的特殊功能寄存器
SFR( SFR中有 4个寄存器除外),可以用单元地址形式给出,也可用寄存器符号形式给出,直接寻址是 SFR唯一的寻址方式。
③ 211个位地址
MOV A,35H; (35H)→A
MOV ACC,PSW; (PSW) →ACC
注,a,寻址 SFR可以用直接地址和寄存器名 (易理解 ),都属于直接寻址。
b,适当选择累加器的表达式
A,ACC,E0H分属不同的寻址方式
c,地址区别
INC A
INC ACC
INC E0H
单字节双字节MOV A,30H;
MOV C,30H;
3.寄存器寻址操作数在某个寄存器中存放
MOV A,Rn ; (Rn) → A,n=0~7
MOV A,Rn ; (Rn) → 50H,n=0~7
4.寄存器间接寻址指令给出的寄存器中存放的不是操作数本身,
而是操作数的单元地址。寄存器前增加前缀符号 @,
用于间接寻址的寄存器只能是 R0,R1,DPTR
① 访问内部 RAM可通过 R0和 R1作为间接寄存器
MOV Ri,#50H ; 50H→Ri,i=0,1
MOV @Ri,A ; A→ ( Ri)
② 访问外部 ROM或外 RAM和 I/O端口,采用 DPTR
作为间址寄存器进行访问。若访问外部 RAM的低
256B时,也可采用 Ri作为间址。
MOVX A,@DPTR;(( DPTR)) → A
MOVX A,@Ri; (( Ri)) → A
③ 寄存器间接寻址方式不能用于对 SFR寻址
MOV R0,#0F0H;
MOV A,@R0;
寄存器 B的物理地址,只能直接寻址,不能间接寻址。
5.基址变址寄存器间接寻址
MCS-51单片机的变址寻址是以数据指针 DPTR或
PC 作为基址寄存器以累加器 A作为变址寄存器,以两者内容相加形式新的 16位地址作为操作数地址,再寻址该地址读出数据。
MOVC A,@ A+PC
① 变址寻址方式只能对 ROM寻址,只能读,不能存数(查表)
② 变址寻址指令 MOVC A,@ A+PC MOVC A,@ A+DPTR PC不变
JMP @ A+DPTR PC变
6.相对寻址相对寻址用于访问程序存储器,只出现在转移指令中,寻址”不是寻找操作数的地址,而是要得到程序跳转地址 PC值。
7.位寻址
① 位寻址范围
a.内部 RAM位寻址 16B( 20H~2FH) 128bit(00H~7FH)
直接位寻址或单元地址加位的表示方法
MOV C,2FH.2 MOV C,7AH
b.SFR 11个 83位
② 位地址位在指令中的 4种表达式
a,直接使用位地址
MOV C,0D6H
b,位名称表示法
MOV C,AC
c.单元地址加位的表示法
MOV C,0D0H.6
d.专用寄存器符号加位的表示法
MOV C,PSW.6
MCS-51单片机的指令系统
1,数据传送类指令数据传送数据交换栈操作
①,内部数据传送类指令( MOV)
MOV 目,源
a.立即数传送
MOV A,#data ; data→A
MOV Rn,#data ; data→Rn
MOV @Ri,#data ; data→(Ri) 双字节
MOV direct,#data ; data→direct
MOV DPTR,#data16 ; data16→DPTR;唯一的一条 16位数传送指令三字节例,已知( R0) =30H,问 8051执行如下指令后,累加器 A,R4,DPTR,30H和 31H单元中的内容是什么?
MOV A,#10
MOV R4,#36
MOV @R0,#7AH
MOV 31H,#01H
MOV DPTR,#1234H
b.直接寻址传送双字节
MOV A,direct ; (direct)→A
MOV direct,A ; (A) → direct
MOV Rn,direct; (direct)→Rn
MOV @Ri,direct; (direct)→(Ri)
MOV direct2,direct1; (direct1)→direct2
三字节例,已知 R0=20H,(20H)=11H,(30H)=22H,(40H)=
33H问 8051执行如下指令后,累加器 A,50H,R5、
20H和 60H单元中的内容是什么?
MOV A,20H
MOV 50H,A
MOV R5,30H
MOV @R0,40H
MOV 60H,50H
(A)=11H,(50H)=11H,(R5)=22H,
(20H)=33H,(60H)=11H
c.寄存器寻址型传送指令
MOV A,Rn; Rn→A
MOV direct,Rn; Rn→(direct)
MOV Rn,A; A→Rn
MOV direct,A; A→(direct)
d.寄存器间址型传送指令
MOV A,@Ri; ((Ri))→A
MOV @Ri,A ; A → (Ri)
MOV direct,@Ri; ((Ri))→direct
例,已知 R0=30H,R1=40H,(30H)=AAH,(40H)=BBH,
问 8051执行如下指令后,累加器 A,30H,40H和 50H单元中的内容是什么?
MOV A,@R0
MOV @R1,A
MOV 50H,@R1
(A)=AAH,(30H)=AAH,(40H)=AAH,(50H)=AAH
注意,a.指令不能创造
b.A影响 PSW
MOV Rn,@Ri
MOV #data,A
②,外 RAM(或 I/O)传送指令( MOVX)
实现外 RAM(或 I/O)与 A之间的数据传送
MOVX A,@Ri ; ((Ri))→A
MOVX @Ri,A ; A→(Ri)
MOVX A,@DPTR; ((DPTR))→A
MOVX @DPTR,A; A→(DPTR)
00H~0FFH
0000H~
0FFFFH
注意,a.建立指针
b.A参与例,将内部 50H单元中的数 X送到外部 RAM2500H单元中,将外部 RAM2501H单元内容送入内部 40H单元。
MOV A,50H
MOV DPTR,#2500H
MOVX @DPTR,A
MOV DPTR #2501H
MOVX A,@DPTR
MOV 40H,A
③,ROM的字节传送指令( MOVC)
变址寻址,查表指令
A变址,DPTR,PC作基址,两者相加的得 ROM某单元地址,将该地址中的数 → A
MOVC A,@A+DPTR
MOVC A,@A+PC
DPTR存放表首址,
可以是任意地址 A中存放偏移量
A+DPTR=新地址
PC为查表指令下一条指令地址,A+ A’+PC=新地址
A’为修正量=表首址- PC
例,已知累加器 A中有一个 0~ 9范围内的数,用以上查表指令编出能查出 0~ 9的平方值的程序。设平方表首地址为 2000H。
a.采用 DPTR作为基址寄存器,
程序为:
MOV DPTR,#2000H
MOVC A,@A+DPTR
若累加器处值为 3,得到一个新地址 2003H,从该地址中查表得 9并存入累加器 A中
b.若采用 PC作为基址寄存器,程序为:
ORG 1FF9H
1FF9H MOV A,#data
1FFBH ADD A,#02H
1FFDH MOVC A,@A+PC
1FFEH SJMP $
2000H DB 0
2001H DB 1
2002H DB 4
┇
2009H DB 81
END
④,数据交换指令
XCH A,Rn ; A?Rn
XCH A,@Ri ; A?(( Ri))
XCH A,direct ; A?(direct )
XCHD A,@Ri ; A?((Ri))3~ 0
注:必须经过 A
例,已知外部 RAM的 60H单元中有一个数 X,内部
RAM的 60H单元中有一个数 Y,试编出可以使它们互相交换的程序。
MOV R0,#60H ; 60H→R0
MOVX A,@R0 ; ((R0))→A
XCH A,@R0 ; ((R0))?A
MOVX @R0,A ; A→(R0)
例,利用数据交换指令,将 60H中的低四位 BCD码转换成 ASCⅡ 码,并将结果存到外部 2500H中。
MOV R0,#60H
MOV A,#30H
XCHD A,@R0
MOV DPTR,#2500H
MOVX @DPTR,A
⑤,堆栈操作指令
PUSH direct; SP+1→ SP,(direct )→ SP
POP direct; (direct )→ SP,SP-1→ SP
直接寻址单元的内容传送到 SP所指的单元中以及把 SP所指的单元内容送到直接寻址单元中。
例,设 (30H)=X,(40H)=Y,试利用堆栈区域实现
30H和 40H单元中的数据交换
MOV SP,#60H ;设栈底的地址为 60H
PUSH 40H ; Y →61H
PUSH 30H ; X →62H
POP 40H ; X →40H
POP 30H ; Y→30H
堆栈操作指令都用的是直接地址寻址方式,因此指令操作码后面应紧跟直接地址 。
PUSH A
PUSH ACC(或 E0H)
2,算术运算指令
① 加法指令
a,不带 CY位的加法指令(影响 PSW)
ADD A,#data ; (A)+data→A
ADD A,direct ; (A)+ (direct)→A
ADD A,Rn ; (A)+(Rn)→A
ADD A,@Ri ; (A)+((Ri))→A
注,8位二进制数,必须有 A参与,结果在 A中参加运算的两个二进制数可被“看作”无符号数
( 0~ 255),也可以被“看作”有符号数的补码( -
128~ +127),结果为补码形式,影响 PSW.
例:编程求 9AH+75H,并分析对 PSW的影响。
MOV A,#9AH
ADD A,#75H
无符号数,结果为 271
带符号数,(-102) +117=15
例:编程求 60H+75H,并分析对 PSW的影响。
MOV A,#60H
ADD A,#75H
无符号数,结果为 135
带符号数,溢出
b.带 CY位的加法指令(影响 PSW)
ADDC A,#data ; A+data+Cy→A
ADDC A,direct ; A+ (direct)+Cy→A
ADDC A,Rn ; A+ Rn+Cy→A
ADDC A,@Ri ; A+ ((Ri))+Cy→A
例,已知,A=85H,R0=30H,(30H)=11H,(31H)=
0FFH,CY=1,试问 8051执行如下指令后累加器 A和 CY
中的值是多少。
① ADDC A,R0 ② ADDC A,31H
③ ADDC A,@R0 ④ ADDC A,#85H
例,编程求 3875H+6549H,结果的高 8位放在内部
RAM的 31H单元,把结果的低八位放在内部 RAM的
30H单元。
ORG 0100H
MOV A,#75H ; #75H→A
ADD A,#49H ; A+#49H→A
MOV 30H,A ; A→30H
MOV A,#38H ; #38H→A
ADDC A,#65H ; A+#65H+ Cy→A
MOV 31H,A ; A→31H
SJMP $
END
c.加 1指令
INC A ; A+1→A
INC Rn ; Rn+1→Rn
INC direct ;( direct) +1→direct
INC @Ri ;(( Ri)) +1→ ( Ri)
INC DPTR ;( DPTR) +1→DPTR
注,只有第一条指令能对 PSW的 P标志位产生影响,
其余四条都不会对标志位产生影响,只要是对 A的操作都会影响 PSW.
例,A=59H,执行 INC A,A=5AH
A=5FH,执行 INC A,A=60H
在程序设计中,加 1指令通常是配合寄存器间址指令使用,用来修改地址和数据指针加 1。
② 减法指令
a.带 Cy位的减法指令
SUBB A,#data ; A-data-Cy→A
SUBB A,direct ; A-(direct)-Cy→A
SUBB A,Rn ; A-Rn-Cy→A
SUBB A,@Ri ; A-((Ri))-Cy→A
在 MCS-51指令中,没有不带借位位的减法指令,如果想不考虑借位位,就在该减法指令前加一条 Cy的清零指令。
CLR C ; 0→Cy
例:编程求 9875H-6354H,结果的高 8位放在内 RAM
21H单元中,低 8位放在内 RAM 20H单元中。
ORG 0100H
CLR C
MOV R0,#20H
MOV A,#75H
SUBB A,#54H
MOV @R0,A
MOV A,#98H
SUBB A,#63H
INC R0
MOV @R0,A
SJMP $
END
b.减 1指令
DEC A ;( A) -1→A
DEC Rn ;( Rn) - 1→Rn
DEC direct ;( direct) -1→direct
DEC @Ri ;(( Ri)) -1→ ( Ri)
注意,没有 DEC DPTR指令!
可用 DEC DPH和 DEC DPL指令实现。
③ 十进制调整指令紧跟在 ADD或 ADDC指令之后DA A
只能用于 BCD码加法运算中例,编写程序完成 78+53的加法程序,并对调整过程进行分析
MOV A,#78H ; 78H→A
ADD A,#53H ; 78H+53H=CBH→A
DA A
H
H
在 MCS-51中没有十进制减法调整指令,MCS-51
中的 BCD减法运算必须采用 BCD补码运算法则,然后对其和进行十进制加法调整来实现。
例,在 50H和 51H中分别存有被减数 84和减数 35,试编程求差,并把结果存入 52H中。
DA A
MOV 52H,A
CLR C
SJMP $
END
ORG 0100H
CLR C
MOV A,#9AH
SUBB A,51H
ADD A,50H
④ 乘法和除法指令
MUL AB ; A× B→A 和 B
DIV AB ; A÷ B→A 和 B
注意,在使用乘除法指令时,只对 8位无符号数进行乘除运算,被乘数或被除数只能来自累加器 A,乘数或除数必须来自累加器 B,对于乘法运算,结果的高八位存入 B中,低八位存入 A中,对于除法运算,商数存入 A中,余数存入 B中。
例,已知两个 8位无符号数分别放在 50H和 51H中,
编程求两数之积,并把积的低 8位存入 52H中,积的高 8位存入 53H中。
INC R1
MOV @R1,A
INC R1
MOV @R1,B
SJMP $
END
ORG 2000H
MOV R1,#50H
MOV A,@R1
INC R1
MOV B,@R1
MUL AB
3,逻辑运算指令
① 逻辑与操作指令
ANL A,direct ; A∧ (direct) →A
ANL A,#data ; A∧ data →A
ANL A,Rn ; A∧ (Rn) →A
ANL A,@Ri ; A∧ ((Ri)) →A
ANL direct,#data ; (direct)∧ data →direct
ANL direct,A ; (direct)∧ A →direct
某位与 0相与,该位结果为 0,因此 ANL常用于将某一单元中的若干位清零,称为屏蔽。
例,(A)=45H,(R5) =7BH
ANL A,R5 A=?41H
例,(30H)=35H(5的 ASCⅡ
码 ),试编程把它变为 BCD码。
MOV A,30H ;( 30H) → A
ANL A,#0FH ; A∧ 0FH →A
MOV 30H,A ; A→ ( 30H)
② 逻辑或操作指令
ORL A,direct ; (A)∨ (direct) →A
ORL A,#data ; (A) ∨ data →A
ORL A,Rn ; (A) ∨ (Rn) →A
ORL A,@Ri ; (A) ∨ ((Ri)) →A
ORL direct,#data ; (direct) ∨ data →direct
ORL direct,A ; (direct) ∨ (A) →direct
某位与 0“或”则该位保持不变,与 1“或”则该位置 1,因此,ORL常用于将某一单元中的若干位置 1,
称为置位例,已知 A=11H,P1=0FFH,编程把累加器 A高 4位送入
P1口中,保持 A和 P1口低 4位不变。
ORG 2000H
MOV R1,A
ANL A,#0F0H
ANL P1,#0FH
ORL P1,A
MOV A,R1
SJMP
END
③ 逻辑异或操作指令( 6条)
XRL A,direct
XRL A,#data
XRL A,Rn
XRL A,@Ri
XRL direct,#data
XRL direct,A
某位与 1“异或,则该位取反,与 0“异或,则该位保持不变。
例,已知片外 RAM2000H单元中有一个数 8FH,编程使它的高 4位取反,低 4位不变。
ORG 2000H
MOV DPTR,#2000H
MOVX A,@DPTR
XRL A,#0F0H
MOVX @DPTR,A
SJMP $
END
④ 累加器清零和取反指令
CLR A ; 0→A,累加器 A清零
CPL A ; A→A,累加器 A取反例,已知片内 50H单元中有一个负数 X,编程求 X补码的程序。 ORG 2000H
MOV A,50H
CPL A
INC A
MOV 30H,A
SJMP $
END
4,移位指令
RL A ;
RR A ;
RLC A ;
RRC A ;
SWAP A ;
例,A=02H 将 A扩大 10倍
ORG 0100H
MOV A,#02H
RL A
RL A
ADD A,#02H
SJMP $
END
例 已知有一个 16位无符号数,高 8位存放在累加器
A中,低 8位存放在寄存器 B中,编程使此数乘 2,
(设积小于 65536)。
ORG 2000H
CLR C
MOV R0,A
MOV A,B
RLC A
MOV B,A
MOV A,R0
RLC A
SJMP $
END
例 在内部 RAM50H和 51H有两个 BCD数,编程将它们紧缩为一个字节放入 50H.
ORG 1000H
MOV R1,#50H
MOV A,@R1
SWAP A
INC R1
ORL A,@R1
DEC R1
MOV @R1,A
SJMP $
END
5,控制转移和位操作指令
1) 控制转移指令改变程序计数器 PC内容为目标,以控制程序执行的流向。
① 无条件转移指令
a.长转移指令
LJMP addr16 ;PC← addr16
程序执行下一条时无条件转移到 addr16去执行,因此长转移指令可以访问的程序空间为 64KB。
例 已知某单片机程序的起始地址是 9FFFH,问用什么方法可使单片机开机后自动去执行此程序。
0000,LJMP 9FFFH ;
常采用符号地址b,短转移指令
AJMP addr11 ;PC+2→PC addr11 →PC 10~0
三字节双周期指令双字节双周期指令取指令,PC+2后高 5位和指令码中,给出 addr11合成新目标地址。
11位地址可以表示的存储空间为 2KB,因此短转移指令可以在 2KB范围内向前向后转移和 PC+ 2
在同一个 2KB范围内。
例 ROM中 2070H有短转移指令
2070H,AJMP 16AH
2070H+2=2072H
2072H=0011000001110010B
高 5位 低 11位
16AH= 0000000101101010H
低 位低 11位
0011000101101010H=216AH 目标地址
c,相对转移指令
SJMP rel ;PC+2+rel→PC
双字节双周期指令
rel (-128~+127)
rel = 目标地址 - (源地址+ 2)
例 根据以下的相对转移指令求目标地址。
① 0100H:SJMP 55H(正数)
② 0100H:SJMP 0F6H(负数)
目标地址= 0100H+2+55H=0157H
目标地址= 0100H+2+FFF6H=00F8H
SJMP $ 80FEH=[-2]补
PC+2-2=PC
d.变址寻址指令(散转指令)
JMP @A+DPTR ; A+( DPTR) → PC,
在 ROM(程序存储器)中设置一个表(散转表),表的首地址由 DPTR提供,表中连续存放着若干条转移指令,执行散转指令时,A+( DPTR) =
新地址,根据该新地址从表中查到某条转移指令,
并执行该指令。累加器 A中存放偏移地址,称为变址,DPTR存放散转表首址,称为基址,程序通过散转指令便可以实现程序的多分支转移。
例:已知累加器 A中放有待处理命令编号 0~ 3,
程序存储器中放有始址为 TAB的二字节短转移指令,
编程使机器按照累加器 A中的命令编号转去执行相应的命令程序。
ORG 1000H
RL A
MOV DPTR,#TAB
JMP @A+DPTR
TAB,AJMP KL0
AJMP KL1
AJMP KL2
AJMP KL3
┇
② 条件转移指令需要判断某种条件是否满足而决定程序流程,实现程序分支。
例:编程求 50H与 60H中数之差,结果放在 A中,
若 A=0,则( 40H) =00H,否则( 40H) =FFH。
a.累加器 A的判零转移指令
JZ rel ; 若 A=0,则( PC) + 2 + rel→PC
若 A≠0,则( PC) + 2→PC
JNZ rel ; 若 A≠0,则( PC) + 2 + rel→ ( PC)
若 A=0,则( PC) + 2→PC
ORG 1000H
CLR C
MOV A,50H
SUBB A,60H
JZ A1
MOV 40H,#0FFH
SJMP A2
A1,MOV 40H,#00H
A2,SJMP $
END
三字节指令减法操作,但不保存结果,影响 CY
若是无符号数,可根据 CY直接判断大小
b.比较转移指令
CJNE A,direct,rel ;
若( A) ≠( direct),则( PC) +3 + rel→ ( PC)
若( A) =( direct),则( PC) +3→ ( PC),形成 CY
CJNE A,#data,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
例,已知 50H与 60H均为无符号数,请比较两数大小,将较大的数送到 50H中,将较小的数送到
60H中。
ORG 1000H
MOV A,50H
CJNE A,60H,L1
L1,JNC STOP
XCH A,60H
MOV 50H,A
STOP:SJMP $
END
例:已知 M和 N是两个八位无符号数,若 M=N则
Y=00H,若 M>N则 Y=30 H,若 M<N则 Y= F0H,试编出相应的程序。
LP2,MOV Y,#00H
SJMP STOP
LP3,MOV Y,#30H
STOP,SJMP $
END
ORG 1000H
MOV A,#M
CJNE A,#N LP1
SJMP LP2
LP1,JNC LP3
MOV Y,#F0H
SJMP STOP
c,循环控制转移指令例:编程求片内 RAM中 50H为始址的连续 10个无符号数相加,并把结果送到片外的 2000H单元中(假设和不产生进位)。
DJNZ Rn,rel ;
若( Rn) -1≠0,则( PC) + 2 + rel→PC
若( Rn) -1=0,则( PC) + 2→PC
DJNZ direct,rel
ORG 1000H
MOV DPTR,#2000H
MOV R5,#0AH
MOV R0,#50H
CLR A
LOOP:ADD A,@R0
INC R0
DJNZ R5,LOOP
MOVX @DPTR,A
SJMP $
END
2) 位操作指令
① 位传送指令
MOV C,bit
MOV bit,C
例,将 20H位的内容传送到 5AH位
MOV C,20H
MOV 5AH,C
② 位置位和位清零指令
CLR C
CLR bit
SETB C
SETB bit
③ 位逻辑运算指令
ANL C,bit
ANL C,/bit
ORL C,bit
ORL C,/bit
CPL C
CPL bit
例,M,N和 W都代表位地址,编程求 Y
ORG 0100H
MOV C,N
ORL C,W
ANL C,M
CPL C
MOV Y,C
SJMP $
END
例,M,N和 Y都代表位地址,编程完成 M,N中内容的异或操作,结果存放在 Y中。
ORG 0100H
MOV C,N
ANL C,/M
MOV Y,C
MOV C,M
ANL C,/N
ORL C,Y
MOV Y,C
SJMP $
END
④ 位控制转移类指令
a.判 Cy转移指令
JC rel ; 若 (CY)=1,则( PC) +2+rel→PC
若 (CY)=0,则( PC) +2→PC
JNC rel ;若 (CY)=0,则( PC) +2+rel→PC
若 (CY)=1,则( PC) +2→PC
JB bit,rel ;
若( bit) =1,则( PC) +3+rel→PC
若 (bit)=0,则( PC) +3→P
JNB bit,rel ;
若( bit) =0,则( PC) +3+rel→PC
若 (bit)= 1,则( PC) +3→PC
JBC bit,rel ;
若( bit) =1,则( PC) +3+rel→PC 且
0→bit
若( bit) =0,则( PC) +3→PC
b.判直接寻址位转移指令
6.子程序调用指令和返回指令
1).调用指令
LCALL addr16 ;
( PC) + 3→PC,( SP) + 1→SP
( PC7-0) → SP,( SP) + 1→SP
( PC15-8) → SP,addr16→PC
ACALL addr11;
( PC) + 2→PC,( SP) + 1→SP
( PC7-0) → SP,( SP) + 1→SP
( PC15-8) → ( SP),addr11→(PC 10-0)
例:已知 SUBTRN=0123H,问单片机执行如下指令
MOV SP,#07H
SUBTRN:ACALL 0345H
问:堆栈中的数据如何变化,PC中的内容是什么?
SP=09H,(08H)=25H,(09H)=01H,PC=0345H。
1),子程序返回指令
RET ;( SP) → PC15-8,( SP) -1→SP
( SP) → PC7-0,( SP) -1→SP
RETI ; ( SP) → PC15-8,( SP) -1→SP
( SP) → PC7-0,( SP) - 1→SP
NOP ;( PC) + 1→PC
PC加 1,消耗一个机器周期外,没有执行任何操作。可用于程序的等待和短时间的延时。
ORG 1000H
LOOP,SETB P1.0; P1.0置 1输出高电平
LCALL DELAY
CLR P1.0; P1.0清零输出低电平
LCALL DELAY
SJMP LOOP
[例 ]:利用 NOP指令产生方波。
7,空操作指令
DELAY,NOP ;空操作
NOP
NOP
NOP
RET
END
MCS-51单片机的指令系统
MCS-51单片机的指令的寻址方式
MOV A,#35H; 35H→A
MOV DPTR,#1234; 1234→DPTR
将操作数的地址直接存放在指令中,直接寻址方式只能是片内 RAM的地址。
2.直接寻址
① 内部 RAM低 128单元,在指令中直接用单元地址的形式给出,地址范围是 00H~ 7FH
1.立即寻址
② 片内 RAM的高 128单元中的特殊功能寄存器
SFR( SFR中有 4个寄存器除外),可以用单元地址形式给出,也可用寄存器符号形式给出,直接寻址是 SFR唯一的寻址方式。
③ 211个位地址
MOV A,35H; (35H)→A
MOV ACC,PSW; (PSW) →ACC
注,a,寻址 SFR可以用直接地址和寄存器名 (易理解 ),都属于直接寻址。
b,适当选择累加器的表达式
A,ACC,E0H分属不同的寻址方式
c,地址区别
INC A
INC ACC
INC E0H
单字节双字节MOV A,30H;
MOV C,30H;
3.寄存器寻址操作数在某个寄存器中存放
MOV A,Rn ; (Rn) → A,n=0~7
MOV A,Rn ; (Rn) → 50H,n=0~7
4.寄存器间接寻址指令给出的寄存器中存放的不是操作数本身,
而是操作数的单元地址。寄存器前增加前缀符号 @,
用于间接寻址的寄存器只能是 R0,R1,DPTR
① 访问内部 RAM可通过 R0和 R1作为间接寄存器
MOV Ri,#50H ; 50H→Ri,i=0,1
MOV @Ri,A ; A→ ( Ri)
② 访问外部 ROM或外 RAM和 I/O端口,采用 DPTR
作为间址寄存器进行访问。若访问外部 RAM的低
256B时,也可采用 Ri作为间址。
MOVX A,@DPTR;(( DPTR)) → A
MOVX A,@Ri; (( Ri)) → A
③ 寄存器间接寻址方式不能用于对 SFR寻址
MOV R0,#0F0H;
MOV A,@R0;
寄存器 B的物理地址,只能直接寻址,不能间接寻址。
5.基址变址寄存器间接寻址
MCS-51单片机的变址寻址是以数据指针 DPTR或
PC 作为基址寄存器以累加器 A作为变址寄存器,以两者内容相加形式新的 16位地址作为操作数地址,再寻址该地址读出数据。
MOVC A,@ A+PC
① 变址寻址方式只能对 ROM寻址,只能读,不能存数(查表)
② 变址寻址指令 MOVC A,@ A+PC MOVC A,@ A+DPTR PC不变
JMP @ A+DPTR PC变
6.相对寻址相对寻址用于访问程序存储器,只出现在转移指令中,寻址”不是寻找操作数的地址,而是要得到程序跳转地址 PC值。
7.位寻址
① 位寻址范围
a.内部 RAM位寻址 16B( 20H~2FH) 128bit(00H~7FH)
直接位寻址或单元地址加位的表示方法
MOV C,2FH.2 MOV C,7AH
b.SFR 11个 83位
② 位地址位在指令中的 4种表达式
a,直接使用位地址
MOV C,0D6H
b,位名称表示法
MOV C,AC
c.单元地址加位的表示法
MOV C,0D0H.6
d.专用寄存器符号加位的表示法
MOV C,PSW.6
MCS-51单片机的指令系统
1,数据传送类指令数据传送数据交换栈操作
①,内部数据传送类指令( MOV)
MOV 目,源
a.立即数传送
MOV A,#data ; data→A
MOV Rn,#data ; data→Rn
MOV @Ri,#data ; data→(Ri) 双字节
MOV direct,#data ; data→direct
MOV DPTR,#data16 ; data16→DPTR;唯一的一条 16位数传送指令三字节例,已知( R0) =30H,问 8051执行如下指令后,累加器 A,R4,DPTR,30H和 31H单元中的内容是什么?
MOV A,#10
MOV R4,#36
MOV @R0,#7AH
MOV 31H,#01H
MOV DPTR,#1234H
b.直接寻址传送双字节
MOV A,direct ; (direct)→A
MOV direct,A ; (A) → direct
MOV Rn,direct; (direct)→Rn
MOV @Ri,direct; (direct)→(Ri)
MOV direct2,direct1; (direct1)→direct2
三字节例,已知 R0=20H,(20H)=11H,(30H)=22H,(40H)=
33H问 8051执行如下指令后,累加器 A,50H,R5、
20H和 60H单元中的内容是什么?
MOV A,20H
MOV 50H,A
MOV R5,30H
MOV @R0,40H
MOV 60H,50H
(A)=11H,(50H)=11H,(R5)=22H,
(20H)=33H,(60H)=11H
c.寄存器寻址型传送指令
MOV A,Rn; Rn→A
MOV direct,Rn; Rn→(direct)
MOV Rn,A; A→Rn
MOV direct,A; A→(direct)
d.寄存器间址型传送指令
MOV A,@Ri; ((Ri))→A
MOV @Ri,A ; A → (Ri)
MOV direct,@Ri; ((Ri))→direct
例,已知 R0=30H,R1=40H,(30H)=AAH,(40H)=BBH,
问 8051执行如下指令后,累加器 A,30H,40H和 50H单元中的内容是什么?
MOV A,@R0
MOV @R1,A
MOV 50H,@R1
(A)=AAH,(30H)=AAH,(40H)=AAH,(50H)=AAH
注意,a.指令不能创造
b.A影响 PSW
MOV Rn,@Ri
MOV #data,A
②,外 RAM(或 I/O)传送指令( MOVX)
实现外 RAM(或 I/O)与 A之间的数据传送
MOVX A,@Ri ; ((Ri))→A
MOVX @Ri,A ; A→(Ri)
MOVX A,@DPTR; ((DPTR))→A
MOVX @DPTR,A; A→(DPTR)
00H~0FFH
0000H~
0FFFFH
注意,a.建立指针
b.A参与例,将内部 50H单元中的数 X送到外部 RAM2500H单元中,将外部 RAM2501H单元内容送入内部 40H单元。
MOV A,50H
MOV DPTR,#2500H
MOVX @DPTR,A
MOV DPTR #2501H
MOVX A,@DPTR
MOV 40H,A
③,ROM的字节传送指令( MOVC)
变址寻址,查表指令
A变址,DPTR,PC作基址,两者相加的得 ROM某单元地址,将该地址中的数 → A
MOVC A,@A+DPTR
MOVC A,@A+PC
DPTR存放表首址,
可以是任意地址 A中存放偏移量
A+DPTR=新地址
PC为查表指令下一条指令地址,A+ A’+PC=新地址
A’为修正量=表首址- PC
例,已知累加器 A中有一个 0~ 9范围内的数,用以上查表指令编出能查出 0~ 9的平方值的程序。设平方表首地址为 2000H。
a.采用 DPTR作为基址寄存器,
程序为:
MOV DPTR,#2000H
MOVC A,@A+DPTR
若累加器处值为 3,得到一个新地址 2003H,从该地址中查表得 9并存入累加器 A中
b.若采用 PC作为基址寄存器,程序为:
ORG 1FF9H
1FF9H MOV A,#data
1FFBH ADD A,#02H
1FFDH MOVC A,@A+PC
1FFEH SJMP $
2000H DB 0
2001H DB 1
2002H DB 4
┇
2009H DB 81
END
④,数据交换指令
XCH A,Rn ; A?Rn
XCH A,@Ri ; A?(( Ri))
XCH A,direct ; A?(direct )
XCHD A,@Ri ; A?((Ri))3~ 0
注:必须经过 A
例,已知外部 RAM的 60H单元中有一个数 X,内部
RAM的 60H单元中有一个数 Y,试编出可以使它们互相交换的程序。
MOV R0,#60H ; 60H→R0
MOVX A,@R0 ; ((R0))→A
XCH A,@R0 ; ((R0))?A
MOVX @R0,A ; A→(R0)
例,利用数据交换指令,将 60H中的低四位 BCD码转换成 ASCⅡ 码,并将结果存到外部 2500H中。
MOV R0,#60H
MOV A,#30H
XCHD A,@R0
MOV DPTR,#2500H
MOVX @DPTR,A
⑤,堆栈操作指令
PUSH direct; SP+1→ SP,(direct )→ SP
POP direct; (direct )→ SP,SP-1→ SP
直接寻址单元的内容传送到 SP所指的单元中以及把 SP所指的单元内容送到直接寻址单元中。
例,设 (30H)=X,(40H)=Y,试利用堆栈区域实现
30H和 40H单元中的数据交换
MOV SP,#60H ;设栈底的地址为 60H
PUSH 40H ; Y →61H
PUSH 30H ; X →62H
POP 40H ; X →40H
POP 30H ; Y→30H
堆栈操作指令都用的是直接地址寻址方式,因此指令操作码后面应紧跟直接地址 。
PUSH A
PUSH ACC(或 E0H)
2,算术运算指令
① 加法指令
a,不带 CY位的加法指令(影响 PSW)
ADD A,#data ; (A)+data→A
ADD A,direct ; (A)+ (direct)→A
ADD A,Rn ; (A)+(Rn)→A
ADD A,@Ri ; (A)+((Ri))→A
注,8位二进制数,必须有 A参与,结果在 A中参加运算的两个二进制数可被“看作”无符号数
( 0~ 255),也可以被“看作”有符号数的补码( -
128~ +127),结果为补码形式,影响 PSW.
例:编程求 9AH+75H,并分析对 PSW的影响。
MOV A,#9AH
ADD A,#75H
无符号数,结果为 271
带符号数,(-102) +117=15
例:编程求 60H+75H,并分析对 PSW的影响。
MOV A,#60H
ADD A,#75H
无符号数,结果为 135
带符号数,溢出
b.带 CY位的加法指令(影响 PSW)
ADDC A,#data ; A+data+Cy→A
ADDC A,direct ; A+ (direct)+Cy→A
ADDC A,Rn ; A+ Rn+Cy→A
ADDC A,@Ri ; A+ ((Ri))+Cy→A
例,已知,A=85H,R0=30H,(30H)=11H,(31H)=
0FFH,CY=1,试问 8051执行如下指令后累加器 A和 CY
中的值是多少。
① ADDC A,R0 ② ADDC A,31H
③ ADDC A,@R0 ④ ADDC A,#85H
例,编程求 3875H+6549H,结果的高 8位放在内部
RAM的 31H单元,把结果的低八位放在内部 RAM的
30H单元。
ORG 0100H
MOV A,#75H ; #75H→A
ADD A,#49H ; A+#49H→A
MOV 30H,A ; A→30H
MOV A,#38H ; #38H→A
ADDC A,#65H ; A+#65H+ Cy→A
MOV 31H,A ; A→31H
SJMP $
END
c.加 1指令
INC A ; A+1→A
INC Rn ; Rn+1→Rn
INC direct ;( direct) +1→direct
INC @Ri ;(( Ri)) +1→ ( Ri)
INC DPTR ;( DPTR) +1→DPTR
注,只有第一条指令能对 PSW的 P标志位产生影响,
其余四条都不会对标志位产生影响,只要是对 A的操作都会影响 PSW.
例,A=59H,执行 INC A,A=5AH
A=5FH,执行 INC A,A=60H
在程序设计中,加 1指令通常是配合寄存器间址指令使用,用来修改地址和数据指针加 1。
② 减法指令
a.带 Cy位的减法指令
SUBB A,#data ; A-data-Cy→A
SUBB A,direct ; A-(direct)-Cy→A
SUBB A,Rn ; A-Rn-Cy→A
SUBB A,@Ri ; A-((Ri))-Cy→A
在 MCS-51指令中,没有不带借位位的减法指令,如果想不考虑借位位,就在该减法指令前加一条 Cy的清零指令。
CLR C ; 0→Cy
例:编程求 9875H-6354H,结果的高 8位放在内 RAM
21H单元中,低 8位放在内 RAM 20H单元中。
ORG 0100H
CLR C
MOV R0,#20H
MOV A,#75H
SUBB A,#54H
MOV @R0,A
MOV A,#98H
SUBB A,#63H
INC R0
MOV @R0,A
SJMP $
END
b.减 1指令
DEC A ;( A) -1→A
DEC Rn ;( Rn) - 1→Rn
DEC direct ;( direct) -1→direct
DEC @Ri ;(( Ri)) -1→ ( Ri)
注意,没有 DEC DPTR指令!
可用 DEC DPH和 DEC DPL指令实现。
③ 十进制调整指令紧跟在 ADD或 ADDC指令之后DA A
只能用于 BCD码加法运算中例,编写程序完成 78+53的加法程序,并对调整过程进行分析
MOV A,#78H ; 78H→A
ADD A,#53H ; 78H+53H=CBH→A
DA A
H
H
在 MCS-51中没有十进制减法调整指令,MCS-51
中的 BCD减法运算必须采用 BCD补码运算法则,然后对其和进行十进制加法调整来实现。
例,在 50H和 51H中分别存有被减数 84和减数 35,试编程求差,并把结果存入 52H中。
DA A
MOV 52H,A
CLR C
SJMP $
END
ORG 0100H
CLR C
MOV A,#9AH
SUBB A,51H
ADD A,50H
④ 乘法和除法指令
MUL AB ; A× B→A 和 B
DIV AB ; A÷ B→A 和 B
注意,在使用乘除法指令时,只对 8位无符号数进行乘除运算,被乘数或被除数只能来自累加器 A,乘数或除数必须来自累加器 B,对于乘法运算,结果的高八位存入 B中,低八位存入 A中,对于除法运算,商数存入 A中,余数存入 B中。
例,已知两个 8位无符号数分别放在 50H和 51H中,
编程求两数之积,并把积的低 8位存入 52H中,积的高 8位存入 53H中。
INC R1
MOV @R1,A
INC R1
MOV @R1,B
SJMP $
END
ORG 2000H
MOV R1,#50H
MOV A,@R1
INC R1
MOV B,@R1
MUL AB
3,逻辑运算指令
① 逻辑与操作指令
ANL A,direct ; A∧ (direct) →A
ANL A,#data ; A∧ data →A
ANL A,Rn ; A∧ (Rn) →A
ANL A,@Ri ; A∧ ((Ri)) →A
ANL direct,#data ; (direct)∧ data →direct
ANL direct,A ; (direct)∧ A →direct
某位与 0相与,该位结果为 0,因此 ANL常用于将某一单元中的若干位清零,称为屏蔽。
例,(A)=45H,(R5) =7BH
ANL A,R5 A=?41H
例,(30H)=35H(5的 ASCⅡ
码 ),试编程把它变为 BCD码。
MOV A,30H ;( 30H) → A
ANL A,#0FH ; A∧ 0FH →A
MOV 30H,A ; A→ ( 30H)
② 逻辑或操作指令
ORL A,direct ; (A)∨ (direct) →A
ORL A,#data ; (A) ∨ data →A
ORL A,Rn ; (A) ∨ (Rn) →A
ORL A,@Ri ; (A) ∨ ((Ri)) →A
ORL direct,#data ; (direct) ∨ data →direct
ORL direct,A ; (direct) ∨ (A) →direct
某位与 0“或”则该位保持不变,与 1“或”则该位置 1,因此,ORL常用于将某一单元中的若干位置 1,
称为置位例,已知 A=11H,P1=0FFH,编程把累加器 A高 4位送入
P1口中,保持 A和 P1口低 4位不变。
ORG 2000H
MOV R1,A
ANL A,#0F0H
ANL P1,#0FH
ORL P1,A
MOV A,R1
SJMP
END
③ 逻辑异或操作指令( 6条)
XRL A,direct
XRL A,#data
XRL A,Rn
XRL A,@Ri
XRL direct,#data
XRL direct,A
某位与 1“异或,则该位取反,与 0“异或,则该位保持不变。
例,已知片外 RAM2000H单元中有一个数 8FH,编程使它的高 4位取反,低 4位不变。
ORG 2000H
MOV DPTR,#2000H
MOVX A,@DPTR
XRL A,#0F0H
MOVX @DPTR,A
SJMP $
END
④ 累加器清零和取反指令
CLR A ; 0→A,累加器 A清零
CPL A ; A→A,累加器 A取反例,已知片内 50H单元中有一个负数 X,编程求 X补码的程序。 ORG 2000H
MOV A,50H
CPL A
INC A
MOV 30H,A
SJMP $
END
4,移位指令
RL A ;
RR A ;
RLC A ;
RRC A ;
SWAP A ;
例,A=02H 将 A扩大 10倍
ORG 0100H
MOV A,#02H
RL A
RL A
ADD A,#02H
SJMP $
END
例 已知有一个 16位无符号数,高 8位存放在累加器
A中,低 8位存放在寄存器 B中,编程使此数乘 2,
(设积小于 65536)。
ORG 2000H
CLR C
MOV R0,A
MOV A,B
RLC A
MOV B,A
MOV A,R0
RLC A
SJMP $
END
例 在内部 RAM50H和 51H有两个 BCD数,编程将它们紧缩为一个字节放入 50H.
ORG 1000H
MOV R1,#50H
MOV A,@R1
SWAP A
INC R1
ORL A,@R1
DEC R1
MOV @R1,A
SJMP $
END
5,控制转移和位操作指令
1) 控制转移指令改变程序计数器 PC内容为目标,以控制程序执行的流向。
① 无条件转移指令
a.长转移指令
LJMP addr16 ;PC← addr16
程序执行下一条时无条件转移到 addr16去执行,因此长转移指令可以访问的程序空间为 64KB。
例 已知某单片机程序的起始地址是 9FFFH,问用什么方法可使单片机开机后自动去执行此程序。
0000,LJMP 9FFFH ;
常采用符号地址b,短转移指令
AJMP addr11 ;PC+2→PC addr11 →PC 10~0
三字节双周期指令双字节双周期指令取指令,PC+2后高 5位和指令码中,给出 addr11合成新目标地址。
11位地址可以表示的存储空间为 2KB,因此短转移指令可以在 2KB范围内向前向后转移和 PC+ 2
在同一个 2KB范围内。
例 ROM中 2070H有短转移指令
2070H,AJMP 16AH
2070H+2=2072H
2072H=0011000001110010B
高 5位 低 11位
16AH= 0000000101101010H
低 位低 11位
0011000101101010H=216AH 目标地址
c,相对转移指令
SJMP rel ;PC+2+rel→PC
双字节双周期指令
rel (-128~+127)
rel = 目标地址 - (源地址+ 2)
例 根据以下的相对转移指令求目标地址。
① 0100H:SJMP 55H(正数)
② 0100H:SJMP 0F6H(负数)
目标地址= 0100H+2+55H=0157H
目标地址= 0100H+2+FFF6H=00F8H
SJMP $ 80FEH=[-2]补
PC+2-2=PC
d.变址寻址指令(散转指令)
JMP @A+DPTR ; A+( DPTR) → PC,
在 ROM(程序存储器)中设置一个表(散转表),表的首地址由 DPTR提供,表中连续存放着若干条转移指令,执行散转指令时,A+( DPTR) =
新地址,根据该新地址从表中查到某条转移指令,
并执行该指令。累加器 A中存放偏移地址,称为变址,DPTR存放散转表首址,称为基址,程序通过散转指令便可以实现程序的多分支转移。
例:已知累加器 A中放有待处理命令编号 0~ 3,
程序存储器中放有始址为 TAB的二字节短转移指令,
编程使机器按照累加器 A中的命令编号转去执行相应的命令程序。
ORG 1000H
RL A
MOV DPTR,#TAB
JMP @A+DPTR
TAB,AJMP KL0
AJMP KL1
AJMP KL2
AJMP KL3
┇
② 条件转移指令需要判断某种条件是否满足而决定程序流程,实现程序分支。
例:编程求 50H与 60H中数之差,结果放在 A中,
若 A=0,则( 40H) =00H,否则( 40H) =FFH。
a.累加器 A的判零转移指令
JZ rel ; 若 A=0,则( PC) + 2 + rel→PC
若 A≠0,则( PC) + 2→PC
JNZ rel ; 若 A≠0,则( PC) + 2 + rel→ ( PC)
若 A=0,则( PC) + 2→PC
ORG 1000H
CLR C
MOV A,50H
SUBB A,60H
JZ A1
MOV 40H,#0FFH
SJMP A2
A1,MOV 40H,#00H
A2,SJMP $
END
三字节指令减法操作,但不保存结果,影响 CY
若是无符号数,可根据 CY直接判断大小
b.比较转移指令
CJNE A,direct,rel ;
若( A) ≠( direct),则( PC) +3 + rel→ ( PC)
若( A) =( direct),则( PC) +3→ ( PC),形成 CY
CJNE A,#data,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
例,已知 50H与 60H均为无符号数,请比较两数大小,将较大的数送到 50H中,将较小的数送到
60H中。
ORG 1000H
MOV A,50H
CJNE A,60H,L1
L1,JNC STOP
XCH A,60H
MOV 50H,A
STOP:SJMP $
END
例:已知 M和 N是两个八位无符号数,若 M=N则
Y=00H,若 M>N则 Y=30 H,若 M<N则 Y= F0H,试编出相应的程序。
LP2,MOV Y,#00H
SJMP STOP
LP3,MOV Y,#30H
STOP,SJMP $
END
ORG 1000H
MOV A,#M
CJNE A,#N LP1
SJMP LP2
LP1,JNC LP3
MOV Y,#F0H
SJMP STOP
c,循环控制转移指令例:编程求片内 RAM中 50H为始址的连续 10个无符号数相加,并把结果送到片外的 2000H单元中(假设和不产生进位)。
DJNZ Rn,rel ;
若( Rn) -1≠0,则( PC) + 2 + rel→PC
若( Rn) -1=0,则( PC) + 2→PC
DJNZ direct,rel
ORG 1000H
MOV DPTR,#2000H
MOV R5,#0AH
MOV R0,#50H
CLR A
LOOP:ADD A,@R0
INC R0
DJNZ R5,LOOP
MOVX @DPTR,A
SJMP $
END
2) 位操作指令
① 位传送指令
MOV C,bit
MOV bit,C
例,将 20H位的内容传送到 5AH位
MOV C,20H
MOV 5AH,C
② 位置位和位清零指令
CLR C
CLR bit
SETB C
SETB bit
③ 位逻辑运算指令
ANL C,bit
ANL C,/bit
ORL C,bit
ORL C,/bit
CPL C
CPL bit
例,M,N和 W都代表位地址,编程求 Y
ORG 0100H
MOV C,N
ORL C,W
ANL C,M
CPL C
MOV Y,C
SJMP $
END
例,M,N和 Y都代表位地址,编程完成 M,N中内容的异或操作,结果存放在 Y中。
ORG 0100H
MOV C,N
ANL C,/M
MOV Y,C
MOV C,M
ANL C,/N
ORL C,Y
MOV Y,C
SJMP $
END
④ 位控制转移类指令
a.判 Cy转移指令
JC rel ; 若 (CY)=1,则( PC) +2+rel→PC
若 (CY)=0,则( PC) +2→PC
JNC rel ;若 (CY)=0,则( PC) +2+rel→PC
若 (CY)=1,则( PC) +2→PC
JB bit,rel ;
若( bit) =1,则( PC) +3+rel→PC
若 (bit)=0,则( PC) +3→P
JNB bit,rel ;
若( bit) =0,则( PC) +3+rel→PC
若 (bit)= 1,则( PC) +3→PC
JBC bit,rel ;
若( bit) =1,则( PC) +3+rel→PC 且
0→bit
若( bit) =0,则( PC) +3→PC
b.判直接寻址位转移指令
6.子程序调用指令和返回指令
1).调用指令
LCALL addr16 ;
( PC) + 3→PC,( SP) + 1→SP
( PC7-0) → SP,( SP) + 1→SP
( PC15-8) → SP,addr16→PC
ACALL addr11;
( PC) + 2→PC,( SP) + 1→SP
( PC7-0) → SP,( SP) + 1→SP
( PC15-8) → ( SP),addr11→(PC 10-0)
例:已知 SUBTRN=0123H,问单片机执行如下指令
MOV SP,#07H
SUBTRN:ACALL 0345H
问:堆栈中的数据如何变化,PC中的内容是什么?
SP=09H,(08H)=25H,(09H)=01H,PC=0345H。
1),子程序返回指令
RET ;( SP) → PC15-8,( SP) -1→SP
( SP) → PC7-0,( SP) -1→SP
RETI ; ( SP) → PC15-8,( SP) -1→SP
( SP) → PC7-0,( SP) - 1→SP
NOP ;( PC) + 1→PC
PC加 1,消耗一个机器周期外,没有执行任何操作。可用于程序的等待和短时间的延时。
ORG 1000H
LOOP,SETB P1.0; P1.0置 1输出高电平
LCALL DELAY
CLR P1.0; P1.0清零输出低电平
LCALL DELAY
SJMP LOOP
[例 ]:利用 NOP指令产生方波。
7,空操作指令
DELAY,NOP ;空操作
NOP
NOP
NOP
RET
END