第三章 MCS-51单片机指令系统
§ 3-1 指令格式及其操作寻址方式
§ 3-2 指令系统
§ 3-1 指令格式及其操作寻址方式
一, 基本概念
1,指令及其格式
什么是指令?
计算机认识什么样的指令?
指令能干什么?
机器指令:用 2进制数 0,1表示的命令代码 。 常以 16进制表示 。
机器语言:由机器指令描述的程序语言 。
助记符指令:用字母和 16进制数代替机器指令形成的符号指令 。
助记符语言:由助记符指令形成的程序语言, 又称汇编语言 。
MCS-51单片机汇编语言指令格式,
[标号,] 操作码 操作数 ( 目的操作数, 源操作数 ) [ ;注释 ]
其中,
标 号:称符号地址, 代表该指令第 1字节所在的地址 。
操作码:规定了指令将要干什么, 必不可少 。
操作数:表示参与运算作的 数 或 数的地址 。
注 释:可有可无, 必须以, ;, 开始 。
2,指令中的符号标识
Ri,Rn,#data,#data16,addr11,addr16,Direct,rel,bit
A:寄存器寻址的累加器;
ACC:直接寻址的累加器;
@,间接寻址符号
( X), X中的内容
(( X)), 由 X的内容作为地址的单元中的内容
←,箭头左边的内容被右边的内容代替
$, 本条指令的起始地址
/, 位操作数前缀, 表示取反 。
3,汇编语言的数据形式
二进制 ( B), 0,1
十进制 ( D), 0,1,~ 9
十六进制 ( H), 0,1,~ 9,A,B,C,D,E,F
二, 寻址方式
寻址方式:指令给出参与运算的数据的方式, 即 确定操作数
地址 的方法 。
MCS-51指令寻址方式主要有 5种,存器寻址, 直接寻址, 寄存
器间接寻址, 立即寻址 和 基址寄存器+变址寄存器间接寻址
1,寄存器寻址
由指令指出以某寄存器的内容为操作数 。 寄存器寻址方式使
用范围,
( 1) 内部 RAM中的 32个工作寄存器 R0~ R7;
( 2) A,B,C,DPTR;
例如,INC R3 ; ( R3) ←( R3) +1
↑操作码 ↑操作数
指令中的 R3即为寄存器寻址, 其执行过程如下图,
本例中,R3的, 门牌号, 高 3位为 0,决定了寻址内部 RAM中
00H~1FH空间 。
对于 Rn:具体寄存器由指令的低 3位指定 。
对于 A,B,C,DPTR:则为隐含在指令代码中 。
2,直接寻址
在指令中 含有操作数的直接地址, 该地址指出了
参与运算的数所在的字节单元地址或位地址 ( 位寻
址 ) 。 直接寻址的寻址范围,
( 1) 内部数据存储器的低 128字节, 00H~ 7FH;
( 2) 特殊功能寄存器, 注意除 A,B,DPTR外, 其他
SFR只能采用直接寻址方式 。
( 3) 位寻址:所有可寻址位;
例如,MOV A,70H ; ( A) ←( 70H)
MOV C,70H ; ( CY) ←( 70H)
注意:对累加器直接寻址和位寻址时, 要用符号
,ACC”或直接地址, E0H”,以区别于寄存器寻址 。
3,寄存器间接寻址
指令中指出某一个寄存器的内容为操作数的地
址, 以符号, @, 表示 。 其寻址范围,
( 1) 以 R0,R1为地址指针, 寻址内部 RAM 00~ 7FH
和外 RAM的低 256B;
( 2) 以堆栈 SP为地址指针, 寻址栈区单元;
( 3) 以 DPTR,或 R0,R1( 须用 P2指定高 8位地址 )
为地址指针, 寻址外部 RAM的 64KB空间和扩展
I/O口 。
例,MOV A,@R0 ; ( A) ←(( R0))
PUSH ACC ; (( SP)) ←( A)
MOVX A,@DPTR ; ( A) ←(( DPTR)
4,立即寻址
操作数以常数的形式出现, 直接跟在操作码后面,
以指令字节的形式存放在 ROM中 。
例如,MOV A,#40H
MOV DPTR,#TABLE ; TABLE为标号地址
MOV P1,#00000111B
MOV R3,#18
5,基址寄存器+变址寄存器间接寻址
( 1) 变址寻址
以基址寄存器 ( PC,DPTR) 和变址寄存器 ( A) 的内容
作为无符号数相加, 形成 16位地址, 访问程序存储器 ( 表格 ) 。
MOVC A,@A+PC ; ( A) ←(( A) +( PC))
MOVC A,@A+DPTR ; ( A) ←(( A) +( DPTR))
例如:设 ( A) =30H,( PC) =1000H,
执行 MOVC A,@A+PC的情况如下图所示 。
取数地址为,1001+30=1031H。
显然,当 ( A) =00H时, 新 ( PC) =1001H;
当 ( A) =FFH时, 新 ( PC) =1100H;
( 2) 相对寻址
指令中给定地址的 相对偏移量 rel,以 PC当前值为 基地址,
加上 rel所得结果为转移目标地址 。
rel:符号数, 单字节补码, -128~ +127。
例如,1000H,JC 80H ;判 C转移指令, 2字节
分析:当 CY=1时, 转移, 过程如下图所示,
§ 3-2 指令系统
3.2.1 程序状态字 PSW
即 标志寄存器, 字节地址为,D0H,可字节寻址, 位寻址 。
作用:存放指令执行时有关信息, 状态, 供程序查询和判别 。
PSW字格式,
D7 D6 D5 D4 D3 D2 D1 D0
CY AC F0 RS1 RS0 OV — P
PSW.7,CY,进位标志, 布尔处理器的累加器 C。
PSW.6,AC,半进位标志 。
PSW.5,F0,用户标志, 可置位和复位 。
PSW.4-PSW.3,RS1,RS0,指出当前工作寄存器区 Rn。
PSW.2,OV,溢出标志 。 CY⊕ CS=1时溢出, OV=1。
PSW.1:保留位, 可单独使用, 表示方法为 D1H,PSW.1。
PSW.0,P,奇偶标志, 指 A中, 1”的个数, 为奇时置 1。
3.2.2 指令系统
一, 数据传送指令
最基本, 最主要的指令, 共有 29条, 包括数据传送,
数据交换, 栈操作三类 。 目的单元为 A时影响 P标志 。
1,内部 RAM间的数据传送 ( 16条 )
( 1) 指令格式
指令格式,MOV [目的字节 ],[源字节 ]
功 能:把源字节指定的变量传送到目的字节指定
的存储单元中, 源字节内容不变 。
( 2) 操作数
操作数,A,Rn,direct,@Ri,DPTR,#data
传送关系如下图所示,
( 3) 指令描述举例,
以 A目的操作数
MOV A,Rn ; ( A) ←( Rn)
以 Rn为目的操作数
MOV Rn,direct ; ( Rn) ←( direct)
以 direct为目的操作数
MOV direct1,direct2 ; ( direct1) ←( direct2)
MOV direct,@Ri ; ( direct) ←(( Ri))
以 @Ri为目的操作数
MOV @Ri,A ; (( Ri)) ←( A)
MOV @Ri,#data ; (( Ri)) ← data
16位数据传送指令
MOV DPTR,#data16;高 8位送 DPH,低 8位送 DPL
例 3-1:设 ( 70H) = 60H,( 60H) =20H,P1为输入口,
状态为 0B7H,执行如下程序,
MOV R0,#70H ; (78H 70H)
MOV A,@R0 ; (E6H)
MOV R1,A ; (F9H)
MOV B,@R1 ; (87H F0H)
MOV @R0,P1 ; (A6 90H)
结果,( 70H) = 0B7H
( B) = 20H
( R1) = 60H
( R0) = 70H
要求:掌握指令功能, 查表求机器码, 寻址方式, 结果
例 3-2:给出下列指令的执行结果, 指出源操作数的寻址方式 。
MOV 20H,#25H
MOV 25H,#10H
MOV P1,#0CAH
MOV R0,#20H
MOV A,@R0
MOV R1,A
MOV B,@R1
MOV @R1,P1
MOV P3,R1
结果,
( 20H) =25H,( 25H) =10H,( P1) =0CAH,
( R0) =20H,( A) =25H,( R1) =25H,
( B) =10H,( 25H) =0CAH,( P3) =25H
2,ACC与外部数据存储器 ( 或扩展 I/O口 ) 传递数据 MOVX
MOVX A,@DPTR
MOVX A,@Ri ;均为单字节指令
MOVX @DPTR,A
MOVX @Ri,A
功能,A与外部 RAM或扩展 I/O口数据的相互传送 。
说明,
( 1) 用 Ri进行间接时只能寻址 256个单元 ( 0000H~00FF),
当访问超过 256个字节的外 RAM空间时, 需利用 P2口确定
高 8位地址 ( 也称页地址 ), 而用 DPTR进行间址可访问
整个 64KB空间 。
( 2) 在执行上述读, 写外 RAM指令时, P3.7( RD), P3.6
( WR) 会相应自动有效 。
( 3) 可用作为扩展 I/O口的输入 /输出指令
例 3-3:将外 RAM 2010H中内容送
外 RAM 2020单元中 。
分析:读 2010H中内容 →A→写数据
→2020H中
流程如右图,
程序如下,
MOV P2,#20H ;输出高 8位地址
MOV R0,#10H ;置 读 低 8位间接地址
MOVX A,@R0 ;读 2010H中数据
MOV R1,#20H ;置 写 低 8位间接地址
MOVX @R1,A ;将 A中数据写入 2020H中
3,查表指令 MOVC
表格:程序存储器除存放程序外, 还可存放一些常数, 这种数
据的结构称为 表格 。
访问,通过两条程序存储器取数指令, 即查表指令来访问,
完成从 ROM中读数, 并只能送累加器 A。
指令格式,
MOVC A,@A+DPTR ; ( A) ←(( A) +( DPTR))
MOVC A,@A+PC ; ( PC) ← ( PC) +1,( A) ← (( A) +( PC))
特点:单字节指令, 源操作数为变址寻址, 执行时, PSEN会
自动有效 。
功能:以 DPTR,PC为基地址, 与 A中的 8位无符号数 相加, 得
到一个新 16位地址, 将其内容送 A。
( 1) 用 DPTR作为基寄存器
例 3-4:设外部 ROM的 2000H单元开始的连续 10个字
节中已存放有 0~9的平方数, 要求根据 A中的
内容 ( 0~9) 来查找对应的平方值 。
START,MOV A,#3
MOV DPTR,#TABLE
MOVC A,@A+DPTR ;查表
…
ORG 2000H ↙ 2003单元内容
TABLE,DB 0,1,4,9,16,25,36,49,64,81
结果,A ←( 2003H), ( A) =09H
特点:可访问整个 ROM的 64KB空间, 表格可放在
ROM的任何位置, 与 MOVC指令无必然的关系 。
( 2) 用 PC作为基寄存器
例 3-5,ORG 1000H
1000H MOV A,#30H;
1002H MOVC A,@A+PC;
结果是,A ←( 1033H)
优点:不改变 PC的状态, 根据 A的内容取表格常数 。
缺点,
( 1) 表格只能存放在查表指令以下的 256个单元内 。
( 2) 当表格首地址与本指令间有其他指令时, 须用
调整偏移量, 调整量为下一条指令的起始地址
到 表格首址 之间的字节数 。
例 3-6:阅读下列程序, 给出运行结果, 设 ( A) =3。
1000H ADD A,#02H ;加调整量
1002H MOVC A,@A+PC ;查表
1003H NOP
1004H NOP
1005H TAB,DB 66,77,88H,99H,‘ W’,‘ 10’
结果,( A) =99H,显然, 2条 NOP指令没有时, 不需调整 。
4,堆栈操作
堆栈, 由特殊功能寄存器 SP( 81H) 管理, 始终指向其栈顶
位置, 栈底视需要设在内部 RAM低 128B内 。
( 1) 进栈操作,PUSH direct
功能:先 ( SP) ←( SP) + 1,再 (( SP)) ←( direct) ;
其中,direct为源操作数;目的操作数为 @SP,隐含 。
例 3-7:已知,( A) =30H,( B) =70H
执行,MOV SP,#60H ;设栈底
PUSH ACC ;
PUSH B
结果,( 61H) =30H,( 62H) =70H,( SP) =62H
( 2) 出栈操作,POP direct
功能:先 ( direct) ←(( SP)), 再 SP ←( SP) - 1
其中,direct为目的操作数, 源操作数为 @SP,隐含 。
例 3-8:已知,( SP) =62H,( 62H) =70H,( 61H) =30H
执行,POP DPH
POP DPL
结果,( DPTR) =7030H,( SP) =60H
5,与 A的数据交换指令
数据交换指令共 5条, 完成累加器和内部 RAM单
元之间的字节或半字节交换 。
( 1) 整字节交换,
XCH A,Rn ; ( A) ←→( Rn)
XCH A,direct ; ( A) ←→( direct)
XCH A,@Ri ; ( A) ←→(( Ri))
( 2) 半字节交换,
XCHD A,@Ri ; ( A) 0~3←→(( Ri)) 0~3
( 3) 累加器自身高低 4位交换
SWAP A ; ( A) 7~4←→( A) 3~0
例 3-9 设 ( A) =57H,( 20H) =68H,( R0) =30H,
( 30H) =39H,求下列指令的执行结果
( 1) XCH A,20H ;
结果,( A) =68H,( 20H) =57H
( 2) XCH A,@R0 ;
结果,( A) =39H,( 30H) =57H
( 3) XCH A,R0 ;
结果,( A) =30H,( R0) =57H
( 4) XCHD A,@R0 ;
结果,( A) =59H,( 30H) =37H)
( 5) SWAP A ;
结果,( A) =75H
例 3-10:设内部 RAM 40H,41H
单元中连续存放有 4个压缩的
BCD码数据, 试编程序将这 4
个 BCD码倒序排列 。
分析:流程如右图
程序如下,
MOV A,41H
SWAP A
XCH A,40H
SWAP A
MOV 41H,A
二, 算术运算指令
包括+, -, ×, ÷, 加 1,减 1,十进制调整指
令, 共有 24条, 一般影响 PSW中的 CY,AC,OV,P
标志位 。
1,加减法指令 ( 12条 )
( 1) 指令助记符,
ADD +
ADDC 带 C+
SUBB 带 C-
( 2) 操作数:如右图,
以 A为目的操作数
( 3) 指令描述举例,
不带进位加法 ADD 4条
ADD A,Rn ; ( A) ←( A) +( Rn)
带进位加法指令 ADDC 4条
ADDC A,direct ; ( A) ←( A) +( direct) +( CY)
带进位减法指令 SUBB 4条
SUBB A,@Ri ; ( A) ←( A) -(( Ri)) -( CY)
SUBB A,#data ; ( A) ←( A) - #data -( CY)
例 3-11:设 ( A) =D3H,( 30H) =E8H
执行,ADD A,30H
1101 0011 ( D3) ( — 45) 补 无符号数 211
+) 1110 1000 ( E8) ( — 24) 补 232
1 1011 1011
结果,CY=1,AC=0,P=0,OV=0,( A) =BBH ( 补码真值 -69,正确 )
例 3-12:设 ( A) =88H,( 30H) =99H,CY=1
执行,ADDC A,30H
1000 1000 ( 88H) ( -78) 补
1001 1001 ( 99H) ( -67) 补
+) 1
1 0010 0010
结果,CY=1,AC=1,P=0,OV=1,( A) =22H( 真值 34,不正确 )
例 3-13:设 ( A) =49H,CY=1,
执行,SUBB A,#54H
0100 1001 ( 49H)
0101 0100 ( 54H)
-) 1
1111 0100 ( 借位 1)
结果,CY=1,AC=0,P=0,OV=0,( A) =F4H( 真值 -12,正确 )
例 3-14:试编制 4位十六进制数加法程序, 假定和数超过双字节
( 21H20H) +( 31H30H) → 42H41H40H
分析,先低字节作不带进位求和,再作带进位高字节求和。
流程图(略),程序如下,
MAIN,MOV A,20H
ADD A,30H
MOV 40H,A
MOV A,21H
ADDC A,31H ;带低字节进位加法
MOV 41H,A
MOV A,#00H ;准备处理最高位
MOV ACC.0,C
MOV 42H,A
SJMP $
2,加 1减 1指令
助记符,INC,DEC
操作数,A,direct,@Ri,Rn,DPTR
指令描述,( 不影响 PSW,即使有进位或借位, CY也不变, 除 A影响 P标志 )
( 1) INC:加 1 5条
INC A ; ( A) ←( A) +1
INC Rn ; ( Rn) ←( Rn) +1
INC @Ri ; (( Ri)) ←(( Ri)) +1
INC direct ; ( direct) ←( direct) +1
INC DPTR ; ( DPTR) ←( DPTR) +1
( 2) DEC:减 1 4条
DEC A ; ( A) ←( A) — 1
DEC Rn ; ( Rn) ←( Rn) — 1
DEC @Ri ; (( Ri)) ←(( Ri)) — 1
DEC direct ; ( direct) ←( direct)
例 3-15:编制下列减法程序, 要求,
( 31H30H) — ( 41H40H) → 31H30H
分析,流程图 ( 略 ), 程序如下,
MAIN,CLR C ; CY清零
MOV R0,#30H
MOV R1,#40H
MOV A,@R0
SUBB A,@R1
MOV @R0,A ;存低字节
INC R0 ;指向 31H
INC R1 ;指向 41H
MOV A,@R0
SUBB A,@R1
MOV @R0,A ;存高字节
HERE,SJMP HERE
3,十进制调整指令
格式,DA A
指令用于两个 BCD码加法运算的加 6修正, 只影
响 CY位 。 指令的使用条件,
( 1) 只能紧跟在加法指令 ( ADD/ADDC) 后进行
( 2) 两个加数必须已经是 BCD码
( 3) 只能对累加器 A中结果进行调整
加 6修正的依据:由 CPU判 CY,AC是否 =1? A中
的高, 低 4位是否大于 9?
例如,( A) =56H,( R5) =67H,( BCD码 ) 执行,
ADD A,R5
DA A
结果,( A) =23H,( CY) =1
例 3-16:试编制十进制数加法程序 ( 单字节 BCD加法 ),
假定和数为单字节, 要求,
( 20H) +( 21H) → 22H
分析,流程如右图
程序如下,
MOV R0,#20H
MOV A,@R0
INC R0
ADD A,@R0
DA A
INC R0
MOV @R0,A
例 3-17:十进制减法程序 ( 单字节 BCD数减法 )
要求,( 20H) — ( 21H) → 22H
分析,主要要考虑到, DA A只能对加法调整, 故必须先化
BCD减法为加法做, 关键为求两位十进制减数的补码
( 9AH-减数 )
流程如右图, 程序如下,
CLR C
MOV R0,#20H
MOV R1,#21H
MOV A,#9AH
SUBB A,@R1 ;求补
ADD A,@R0 ;求差
DA A
INC R1
MOV @R1,A ;存结果
4,乘除法指令
唯一两条单字节 4机器周期的指令 。
( 1) 8位无符号数乘法指令
MUL AB ; ( B 15~8 ) ( A7~0) ←( A) × ( B)
PSW,1) 若乘积大于 256,OV=1;否则 OV=0;
2) CY总是清, 0”。
例如,( A) =50H,( B) =A0H,执行 MUL AB后
结果,( B) =32H,( A) =00H,( OV) =1
( 2) 8位无符号除法指令
DIV AB ; ( A) ←( A/B) 的 ( 商 ); ( B) ←( A/B) 的 ( 余数 )
PSW,1) CY,OV,清, 0”
2) 若 ( B) =0,OV=1。
例如,( A) =2AH,( B) =05H,执行 DIV AB后
结果,( A) =08H,( B) =02H,( OV) =0
例 3-18:双字节乘法程序, 要求,
( R0R1) × ( R2) →R3R4R5
分析,设 ( R0) =J,( R1) =K,( R2) =L,则,
MOV A,R1 J K
MOV B,R2 × ) L
MUL AB KL高 KL低
MOV R5,A +) JL高 JL低
MOV R4,B R3 R4 R5
MOV A,R0
MOV B,R2
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,#00H
MOV R3,A
例 3-19:编制将 A中的数转换成三位 BCD码程序, 百位放在
20H,十位, 个位放在 21H中 。
分析,( A) /100→商 ( 百位 ) →( 20H) ;
余数 /10 →商 ( 十位 ) →( 21H) 7~4;
余数 ( 个位 ) →( 21H) 3~0;
流程 如右图, 程序如下,
MOV B,#100
DIV AB
MOV 20H,A
MOV A,B
MOV B,#10
DIV AB
SWAP A
ADD A,B
MOV 21H,A
SJMP $
三, 逻辑运算指令
逻辑运算类指令共 24条, 涉及 A时, 影响 P标志 。
1,基本与, 或, 异或运算指令
( 1) 指令助记符,ANL,ORL,XRL
( 2) 操作数:如下图
( 3) 指令描述举例,
逻辑, 与, 指令 6条
ANL A,Rn ; ( A) ←( A) ∧ ( Rn)
ANL A,direct ; ( A) ←( A) ∧ ( direct)
逻辑, 或, 指令 6条
ORL A,@Ri ; ( A) ←( A) ∨ (( Ri))
ORL A,#data ; ( A) ←( A) ∨ data
逻辑, 异或, 指令 6条
XRL direct,A ; ( direct) ←( direct) ⊕ ( A)
XRL direct,#data ; ( direct) ←( direct) ⊕ data
当用于修改输出口 ( P0~ P3) 时, direct指口锁存器的内容
而不是端口引脚电平 。
2,对 A简单逻辑指令
1) 清零与取反
CLR A ;清 0
CPL A ;求反
2) 循环移位指令
RL A ;
RLC A ;
RR A ;
RRC A ;
例 3-20:按要求编程, 完成下列各题,
1) 选通工作寄存器组中 0区为工作区 。
2) 利用移位指令实现累加器 A的内容乘 6。
3) 将 ACC的低 4位送 P1口的低 4位, P1口的高 4位不变 。
例 3-20解,
1) ANL PSW,#11100111B ; PSW的 D4,D3位为 00
2) CLR C
RLC A ;左移一位, 相当于乘 2
MOV R0,A
CLR C
RLC A ;再乘 2,即乘 4
ADD A,R0 ;乘 2 + 乘 4 = 乘 6
3) ANL A,#0FH ;高 4位屏蔽 ( 清 0)
ANL P1,#F0H ; P1低 4位清 0
ORL P1,A ; ( P1.3~1.0) ←( A3~0)
例 3-21:设在外 RAM 2000H中放有两个 BCD数, 编程, 使这
两个 BCD码分别存到 2000H和 2001H的低 4位中 。
分析,流程如图
程序如下,
MOV DPTR,#2000H
MOVX A,@DPTR
MOV R0,A
ANL A,#0FH
MOVX @DPTR,A
MOV A,R0
ANL A,#0F0H
SWAP A
INC DPTR
MOVX @DPTR,A
四, 位操作指令
布尔处理器 C,可寻址内部 RAM中的可寻址位,
bit = 00~ FFH,和 SFR中的可寻址位 。
位地址的描述形式,
( 1) 直接位地址, 如 MOC C,70H
( 2) 字节地址 +位地址, 如 20H.1,ACC.4,PSW.4等
( 3) 位寄存器名称, 如 F0,C,RS1,RS0等
( 4) 伪指令定义过的位名称
注意,
CY----直接地址, 是位寻址;
C ----位寄存器, 为寄存器寻址 。
例如,CLR CY ;机器码 C2 D7H
CLR C ;机器码 C3H
1,位传送指令
MOV C,bit
MOV bit,C
例如,MOV C,06H
MOV P1.0,C
2,位变量修改指令
CLR C ; ( C) ←0
CLR bit ; ( bit) ←0
CPL C ; ( C) ←( )
CPL bit ; ( bit) ←( )
SETB C ; ( C) ←1
SETB bit ; ( bit) ←1
例如,SETB P1.0
bit
C
3,位变量逻缉, 与, 指令
ANL C,bit ; ( C) ←( C) ∧ ( bit)
ANL C,/ bit ; ( C) ←( C) ∧ ( )
例如:设 P1为输入口, P3为输出口, 执行程序
MOV C,P1.0
ANL C,P1.1
ANL C,/P1.2
MOV P3.0,C
结果,P3.0 = P1.0 ∧ P1.1 ∧ /P1.2。
4,位变量逻缉, 或, 指令
ORL C,bit ; ( C) ←( C) ∨ ( bit)
ORL C,/ bit ; ( C) ←( C) ∨ ( )
bit
bit
例如:设 P1为输出口, 执行下列程序, 指出功能,
( 1) MOV C,00H
ORL C,01H
MOV P1.7,C
( 2) MOV P1,#00H
LOOP,SETB P1.0
LCALL DELAY
CLR P1.0
LCALL DELAY
AJMP LOOP
( 3)
LOOP,SETB C
RLC A
MOV P1,A
LCALL DELAY
JNB ACC.7,LOOP
例 3-22 将位地址 40H,41H中的内容进行异或, 结果
存入 42H中 。
分析,运算公式,Y= A⊕ B=
程序如下,
MOV C,41H
ANL C,/40H
MOV 42H,C
MOV C,40H
ANL C,/41H
ORL C,42H
MOV 42H,C
BABA ?
五, 控制转移指令 ( 22条 )
1,无条件转移指令
无条件转移应用举例,
1) 1030H,AJMP 100H ;机器码为 2100H
目的地址,PC=1032H的高 5位 + 100H的低 11位
= 00010 + 001 0000 0000 = 1100H
2) 0000H,AJMP 40H ;程序转移到 0040H
3) 1100H,SJMP 21H ;目标地址为 1123H
4) 1000H,SJMP NEXT;目的地址 NEXT=1020H
则:相对地址 rel =1EH( 补码数 )
5) 0060H,SJMP FEH ;踏步指令
目的地址,PC =( PC) + 2 + FEH
= 0060H +2 +FFFEH = 0060H
6) 0000H,LJMP 0030H ;
例 3-23:执行下面的散转程序, 程序将根据 A中的内容 ( 命令编
号 0~ 9) 转相应的命令处理程序 。
ORG 1000H
START,MOV R1,A
RL A ;乘 2
ADD A,R1 ;完成偏移量 A =( A) × 3
MOV DPTR,#TABLE ;设定表格首地址
JMP @A+DPRT
TABLE,LJMP COMD0
┇
LJMP COMD9
COMD0,
┇
COMD9,
END
由于 LJMP占 3个字节, 因此, 变址寄存器必须乘 3
2,条件转移指令
根据某种条件判断转移的指令, 执行时,
, 条件满足时, 转移执行;
, 条件不满足时, 顺序执行;
, 目的地址, ( PC) =( PC) + 指令字节数 2或 3 + rel
包括判 A,判 Bit,判 C三种, 共有 7条,
1) 判 A转移, 2字节
JZ rel ;条件,( A) = 0
JNZ rel ;条件,( A) ≠0
2) 判 Bit转移, 3字节
JB bit,rel ;条件,( bit) = 1
JNB bit,rel ;条件,( bit) = 0
JBC bit,rel ;条件,( bit) = 1转移, 并清 bit位
3) 判 C转移, 2字节
JC rel ;条件,( C) = 1
JNC rel ;条件,( C) = 0
例 3-24 利用 P1.0,P1.1作为外接发光二极管的启停按
钮, P1.2作为外接发光二极管端, 试编制控制程序 。
程序如下,
START,MOV P1,#03H ; 作 P1口输入时先置 1
WT1,JB P1.0,WT1
SETB P1.2
WT2,JB P1.1,WT2
CLR P1.2
SJMP WT1
3,比较不相等转移指令
CJNE A,direct,rel;
CJNE A,#data,rel;
CJNE Rn,#data,rel;
CJNE @Ri,#data,rel;
执行时,
1) 两操作数相等, 顺序执行, 且 CY=0。
2) 两操作数不相等, 转移执行, 且对于无符号
数若,
第一操作数<第二操作数,CY=1,否则 CY清,0”。
目的地址,( PC) =( PC) + 指令字节数 3 + rel
例如:右图所示的比较
判断, 可利用 CJNE和
JC指令来完成 。
例 3-24:内部 RAM 30H开头的 20个
连续单元中, 存放有 20个数, 统计
等于 8的单元个数, 结果放在 R2中 。
分析,取一个数与 8比较, 相等 R2
加 1,不相等跳过 。 并作 20次重复
即可 。
流程如右图, 程序如下,
ORG 1000H
START,MOV R0,#30H
MOV R7,#20
MOV R2,#0
LOOP,CJNE @ R0,#08H,NEXT
INC R2
NEXT,INC R0
DJNZ R7,LOOP
SJMP $
4,减, 1”不为 0转移指令
又称循环转移指令, 主要用来构成循环结构, 有 2条,
DJNZ Rn,rel ; 2字节指令, 2周期指令
DJNZ direct,rel ; 3字节指令, 2周期指令
目的地址,( PC) =( PC) + 指令字节数 2或 3 + rel
例 3-25:利用 DJNZ指令设计循环延时程序, 已知 fosc=12MHz
1) 单循环延时
DELAY,MOV R7,#10
DJNZ R7,$
△ t=2us× 10+1=21us
2) 双重循环延时
DELAY,MOV R7,#0AH
DL,MOV R6,#64H
DJNZ R6,$
DJNZ R7,DL
△ t=( 2us× 100+2+1) × 10+1=2031us
3) 三重循环延时
DELAY,MOV R7,#10
DL2,MOV R6,#200
DL1,MOV R5,#250
DJNZ R5,$
DJNZ R6,DL1
DJNZ R7,DL2
△ t=(( 2us× 250+2+1)
× 200) +2+1)
× 10+1
= 1006031us ≈ 1 秒
例 3-26 P1口控制发光二极管, 延时节日灯组合 。
LOOP,MOV P1,# 0AAH ;灯光 1
ACALL DELAY
MOV P1,# 055H ;灯光 2
ACALL DELAY
SJMP LOOP
DELAY,MOV R7,# 0FFH
DL1,MOV R6,# 0FFH
DL2,NOP ;空操作
DJNZ R6,DL2
DJNZ R7,DL1
RET
5,调用指令与返回指令
1) 主程序和子程序结构
2) 调用和返回
子程序是独立于主程序的具有特定功能的程序段,
单独编写, 能被主程序调用, 又能返回主程序 。 按
两者的关系有两种调用情况, 多次调用和子程序嵌
套, 如图所示 。
3) 堆栈和 PC值的保留
调用子程序时, CPU自动 将当前 PC值保留在堆栈中, 其
中高位放在 PCH,子程序返回时, 自动弹出, 送入 PC。
4) 现场保护和恢复现场
现场保护 是指将需要保护的单元内容, 在子程序的开始使用压
栈指令存放在堆栈中的过程 。
恢复现场 是指在子程序返回前, 通过出栈指令, 将被保护内容
送回原来的寄存器 。
5) 调用与返回指令
( 1) 短调用指令
ACALL addr11
执行时,
1) ( PC) + 2 → PC,并压入堆栈, 先 PCL,后 PCH;
2) PC15~ 11 a10~ 0 → PC,获得子程序入口地址;
3) 转移范围同 AJMP。
( 2) 长调用指令
LCALL addr16
执行时,
1) ( PC) + 3 → PC,并压入堆栈, 先 PCL,后 PCH;
2) addr16 → PC,获得子程序起始地址;
3) 可调用 64K地址范围内的任意子程序 。
例如:已知 ( SP) =60H,执行下列指令后的结果,
① 1000H,ACALL 100H
② 1000H,LCALL 0800H
结果,
①, ( SP) =62H,( 61H) =02H,( 62H) =10H,
( PC) =1100H
②, ( SP) =62H,( 61H) =03H,( 62H) =10H,
( PC) =0800H
( 3) 子程序返回指令 RET, 中断返回指令 RETI
RET:从堆栈中退出 PC的高位和低位字节, 栈指针减 2,即,
1) ( PCH) ←(( SP)), ( SP) ←( SP) - 1;
2) ( PCL) ←(( SP)), ( SP) ←( SP) - 1;
RETI:从堆栈中退出 PC的高位和低位字节, 栈指针减 2,同
时清除中断优先, 开放低级中断 。
6,空操作指令
NOP ; ( PC) ←( PC) +1
空操作指令是一条单字节单周期指令, 控制 CPU不做任何操
作, 只作时间上的消耗, 因此常用于程序的等待或时间的延迟 。
例 2-27 设计节日灯, 通过 P1.0~ P1.7控制 8个发光二极管,
先亮 1灯, 隔 1秒闪烁 10次, 然后左移 1位闪 10次, 如此循环 。
分析:流程图, 程序如下,
MAIN,MOV A,#01H
LOOP1,MOV R2,#10
LOOP2,MOV P1,A
ACALL DELAY
MOV P1,#00H
ACALL DELAY
DJNZ R2,LOOP2
RL A
AJMP LOOP1
DELAY,1秒延时子程序 ( 略 )
RET
本章小结
1,基本概念, 寄存器寻址, 寄存器间接寻址,
直接寻址, 位寻址, 基寄存器加变址寄存器间
接寻址 。
2,数据传送指令, 算术运算指令, 逻缉运算指
令, 位操作指令, 控制转移指令
重点:寻址方式和指令系统, 简单程序阅读
难点:寻址方式, 控制转移指令中相对地址计算,
堆栈操作, 以及简单汇编程序阅读