教学目的
指令和指令系统的概念与分类。
掌握指令的格式和寻址方式。
掌握数据传送、算术运算、逻辑运算、
控制转移和位操作指令的功能和应用。
学习重点和难点
指令的寻址方式。
控制转移指令和位操作指令。
第三章 指令系统
3.1 汇编语言一,概述指令系统,一台计算机所能识别、执行的指令的集合就是它的指令系统。
机器语言,指令系统是一套控制计算机执行操作的二进制编码,称为机器语言。机器语言指令是计算机唯一能识别和执行的指令。
汇编语言,指令系统是利用指令助记符来描述的,称为汇编语言。
计算机的指令系统一般都是利用汇编语言描述的,每一条指令都是由计算机硬件设计所决定的。指令系统没有通用性。
单片机一般是空机,未含任何系统软件。因此在第一次使用前,必须对其进行编程,
位( bit),位是计算机所能表示的最小的、最基本的数据单位,位通常是指一个二进制位。
字节( Byte),一个连续的 8位二进制数码称为一个字节,即 1Byte=8bit。
字( Word),通常由 16位二进制数码组成,即
1Word=2Byte。
字长,字长是指计算机一次处理二进制数码位的多少。 MCS-51型单片机是 8位机,所以说它的字长为 8位。
MCS-51系列单片机都是以 Intel公司最早的典型产品 8051为核心,增加了一定的功能部件后构成的。本章以 89C51为主介绍 MCS-51系列单片机 。
二、常用单位与术语指令格式是指令码的结构形式。表达形式为:
1 指令格式标号 又称为指令地址符号,一般由以英文字母开始的 1-8个字母或数字组成,以冒号,,”结尾如,START,LOOP,NEXT,MAIN
[标号 ],操作码 [操作数 ] ;[注释 ]
三,MCS-51系统单片机指令格式
[ ]项 是可选项。
操作码 用 MCS-51单片机所 规定的助记符 来表示,
它命令 CPU作何种操作,是一条指令中不可缺少的内容 。 如,MOV,ADD,ORL等 。
[标号 ],操作码 [操作数 ] ; [注释 ]
注释 是对该指令作用或功能的说明,以便于阅读,
不参与编译 (可有可无,不是必备的 )。 注释部分前一定要用分号,;,隔开。
操作数 分为目的操作数和源操作数,常用符号
(如寄存器,标号 ),常量 (如立即数,地址值等 )
来表示 。 操作码和操作数之间用若干空格分隔,
而目的操作数和源操作数之间用逗号,,,分隔 。
[标号 ],操作码 [操作数 ] ; [注释 ]
目的操作数,源操作数寄存器,如,A,B,DPTR,Rn,P0等。
标号,如,START,LOOP,MAIN等。
如果累加器 A中已有一个加数 10,那么能够完成 10+ 20并把结果送入累加器 A的加法指令的,
助记符指令格式 为:
SUM,ADD A,# 14H ;A ←A+14H
例如编译后的机器语言,0030H 24H
0031H 14H
2 指令的字节数
MCS-51单片机通常可以分为 单字节,双字节和三字节 指令三种 。
(1)单字节指令( 49条)
单字节指令只有一个字节。通常又可分为两类:
1)指令码中隐含着对某一个寄存器的操作这类指令的指令码只有操作码字段,操作数是隐含在操作码中的 。 如,INC DPTR
1 0 1 0 0 0 1 1二进制码:
这类指令的指令码有操作码字段和专门用来指示操作数所在寄存器号的字段组成 。
例如:八位数传送指令
MOV A,Rn
其中,n的取值范围为 0- 7。
2) 由指令码中的 rrr三位的不同编码指定某一个寄存器
1 1 1 1 1 r r r二进制码:
如 n= 2,则 rrr=010
1 1 1 1 1 0 1 0则二进制码:
双字节指令含有两个字节,操作码字节在前,
操作数字节在后。
例如:八位数传送指令
MOV A,# data8 ;A←data
这条指令的含义是指令码第二字节 data取出来存放到累加器 A中
2)双字节指令( 45条)
二进制码,0 1 1 1 0 1 0 0
# data
这类指令的指令码的第一字节为操作码,第二、三字节为操作数或操作数地址。
3)三字节指令( 17条)
操作码操作数 1
操作数 2
例如:指令 MOV DPTR,# data16
10010000
Data15-8
Data7-0
一、寻址方式中常用符号的说明
(1)Rn:表示当前工作寄存器组中 8个工作寄存器,(n=0-7) 中的一个 。
(2) @ Ri,表 示 寄 存器 间 接寻 址,Ri只能是 R0或 R1。
(3)#data8:8位立即数(常数),实际使用时
data应是 00H-0FFH中的一个。
(4)#data16,表 示 包 含 在 指 令 中 的 16 位立即数 。 范围,0000H-0FFFFH
3.2 寻址方式
(5)direct:表示 8位片内数据存储器( RAM)
单元的直接地址。
(6)addr16:表示 16位的目的地址 。
(7)addr11:表示 11位的目的地址 。
(8)rel:表示 8位带符号的偏移量 。
(9)DPTR:为数据指针,用作 16位的地址寄存器。
(10)Bit:表示内部 RAM或专用寄存器中的直接寻址位地址 。
(11)A:累加器 ACC。
(12)B,专 用 寄 存 器,用于 MUL 和 DIV 指令中 。
(13)@,为间址寄存器或基址寄存器的前缀 。 如@ Ri,@ A+PC,@ A+DPTR。
(14)/,位 操 数 的 前 缀,表 示 对 该 位 操 作数取反 。 如 /bit.
(15)$:正在执行的指令的地址 。
(16)(× ),× 中的内容 。
(17)((× )),由 × 指出的地址单元中的内容 。
指令字节数判断操作码 目的操作数,源操作数
1,操作数都在 Rn( n=0-7),A,B,DPTR,Cy,@Ri、
@A+DPTR,@A+PC范围中,是单字节指令。
2、两操作数中有一个在此范围,指令字节数需根据另一操作数来判断,如是 8位的地址或立即数则是双字节指令;如是 16位的地址或立即数则是三字节指令。
3、操作数都不在此范围,则肯定是三字节指令
1 寄存器寻址
2 直接寻址
3 立即寻址
4 寄存器间接寻址
5 变址寻址
6 相对寻址
7 位寻址二、寻址方式
MCS-51的指令系统共用了七种寻址方式。
声明,寻址包括目的操作数寻址和源操作数寻址,
如无特别说明,指的是源操作数寻址!!
1 寄存器寻址以 寄存器的内容 为 操作数 的寻址方式可进行寄存器寻址的寄存器有:工作寄存器 R0~R7,A,B,DPTR和进位 CY。
11100rrr
…
…
ROM
操作码PC→
PSW RS0RS1
10
11100101
11111111
…
…
片内 RAM
00Hrrr=010B(R2)
0AH
MOV A,R0 ;A R0
例如,
R0(35H) A 结果 A=35H
35H
FF
E0(A)
80
用户 RAM区位寻址区工作寄存器区
7F
30
20
00
此条指令属单字节指令吗?
此时 PSW寄存器中 RS1,RS0位的值是多少?
直接寻址指令的指令码中所给出的操作数是:
片内 RAM单元的地址,地址中放着被操作的数 。
2 直接寻址例,MOV A,40H ; A ( 40H)
机器码,E5 40
11100101
01000000
…
…
ROM
操作码直接地址
PC→
PC+ 1→
11100101
11111111
…
…
片内 RAM
40H
11111111 A
直接寻址可访问片内 128B的 RAM单元和特殊功能寄存器 SFR。
对于 特殊功能寄存器 (除开 A,B,DPTR)
既可以使用它们的地址,也可使用它们的名称。
如,MOV A,P2; P2←A
MOV A,0A0H; P2的地址为 0A0H
注意,Rn,A,B,DPTR一般不会用作直接寻址!
说明指令码中直接含有所需的操作数,操作数之前加,#”符号为前缀。以区别直接地址。使用时一定要注意!
3 立即寻址特点
源操作数为立即数(即操作数本身)
注,51系列单片机有 8 位立即数和 16 位地址立即数,立即数不能作目的操作数。
寻址范围:程序寄存器注:操作码下一单元。
例,MOV A,#20H
MOV DPTR,#2000H
01110100
00100000
…
…
ROM
操作码立即数
PC→
PC+ 1→
10010000
00100000
…
…
ROM
操作码立即数高 8位
PC→
PC+ 1→
00000000PC+ 2→ 立即数低 8位功能,( 1) 将片内 RAM中 44H单元的内容送累加器 A,属于直接寻址;
( 2) 则是把 44H这个数本身送到累加器 A,属于立即寻址。
( 1) MOV A,44H ;A (44H)
( 2) MOV A,#44H ;A 44H
例
4 寄存器间接寻址指令指定寄存器中的内容为操作数的地址。
工作寄存器 R0,R1和专用寄存器 DPTR可用于间接寻址,在寄存器前加,@”符号作前缀。
工作寄存器 R2-R7不能用于间接寻址!
① MOV A,R0 ;A←(R 0)
② MOV A,@ R0;A←((R 0))
例如:
(R0)= 65H,(65H)= 26H
如图 3.2所示,
执行 ① 结果 A= 65H,
执行 ② 结果 A= 26H。
注意:,@,是它区别寄存器寻址的标志 。
A
R0 65H
①
②
例
65H26H
65H 26H
片内
RAM
( 1) @R0,@R1可寻址内部 RAM 00H - 7FH
共 128B单元内容,不能寻址特殊功能寄存器。
MOV A,@R0
MOV A,@R1
说明
( 2) @ R0,@ R1可寻址外部 RAM 00 ~ FFH
共 256B单元内容。
MOVX A,@R0
MOVX A,@R1
( 3) @ DPTR寻址外部数据存储器的 64KB空间
MOVX A,@DPTR ; A?(DPTR)
MOVX @DPTR,A ; (DPTR)?A
5 变址寻址以 DPTR和 PC基址寄存器 和累加器 A变址寄存器的 内容和 为 地址,寻址该地址单元,读取数据
A
06H
A L U
(1)MOVC A,@ A+ DPTR ; A← ( A+ DPTR)
20 00H
DPTR 程序存储器
34H
× ×
…….
…….
2006H
2006H
(2)MOVC A,@ A+ PC ; A ← ( A+ PC)
执行第二条指令时先取指,将 该指令取完后的 PC值 和 累加器 A中的偏移量 相加,作为操作数地址,从该地址中取出操作数送入 A中 。
第二条过程与第一条指令类似,
A
06H
←PC+1=2006H
A L U
20 06H
PC
200CH
←PC=2005H
程序存储器
34H
…….
…….
83H
…….
200CH
34H
说明
寻址范围,64KB程序存储器
变址 + 基址形成的 ROM地址中的值为操作数
基址寄存器 DPTR —— 16 位数据指针
PC —— 16 位程序指针
变址寄存器 A —— 8 位累加器
(1)MOVC A,@ A+ DPTR ; A← ( A+ DPTR)
(2)MOVC A,@ A+ PC ; A ← ( A+ PC)
6 相对寻址相对寻址只出现在 相对转移指令 中 。 相对转移指令执行时,以 PC当前值 加上 偏移量 rel得 转移地址目的地址=源地址+ 2+ rel
源地址,转移指令操作码所在的地址目的地址,转移后的地址
2:相对转移指令字节数
PC当前值,执行完相对转移指令后的 PC值
PC当前值
A
26H
PC
02H20H
A L U
程序存储器
0000H
2000H
2001H
80H
26H
× ×
× ×2028H
2002H ┆
SJMP rel ; PC← PC+2+rel
2000,80 26H
例
2028H
目的地址由 CPU把目的地址送入 PC
寻址空间:程序存储器
偏移量 rel的范围是,–128 ~ +127
转移公式:
PC目的地址 = PC当前地址 + rel
说明在实际程序编译时,经常需要根据已知的源地址和目的地址计算偏移量 rel!!
rel=(目的地址-(源地址+ 2)) 补
= FFH- (源地址+ 2-目的地址 )+ 1
= 100H- (源地址+ 2-目的地址 )
= FEH- |目的地址-源地址 |
= FEH - |地址差 |
是负数时
7 位寻址进行位操作时,位累加器 C即为进位标志 CY,
位操作的操作数的地址就称为位地址,对位地址寻址简称位寻址 。
MOV C,30H ; 30H是位寻址位地址
MOV A,30H ; 30H是直接寻址的字节地址
JB 30H,rel ;如果 30H位是 1,则相对偏移 rel
由上面指令可知,位寻址的位地址与直接寻址的字节地址形式完全一样,由操作指令区分,使用时需应该特别注意 。
说明位寻址仅对片内 RAM的部分区域有效
片内低 128BRAM区字节地址为 20H ~ 2FH,16 Byte单元共有 128 bit 位
片内专用 RAM区(特殊功能寄存器)
字节地址能被 8 整除的特殊功能寄存器单元说明位地址表示,
直接使用位地址。对于 20H~2FH的 16个单元共
128位的位地址分布是 00H~7FH。
对于特殊功能寄存器
1) 用位地址 MOV C D0H
2)用 SFR.n的形式 MOV C PSW.0
3)用位名称 MOV C P
序号 寻址方式 寻址空间
1 寄存器寻址 寄存器 R0~ R7,A,B,DPTR,C
2 直接寻址 内部 RAM低 128B,SFR
3 寄存器间接寻址内部 RAM低 128B、外部 RAM
寄存器只能是 @R0,@R1,@DPTR
4 立即寻址 程序存储 ROM
5 变址寻址 程序存储器 ( @A+DPTR,@A+PC)
6 相对寻址 程序存储器 ROM( PC+rel(- 128~
127) )
7 位寻址 内部 RAM的 20H~ 2FH单元和部分 SFR
寻址方式小节
MOV 30H,R7
MOV A,55H
MOV A,# 55H
JMP @A+DPTR
MOV 30H,C
MOV A,@R0
MOVX A,@R0
练习一答案:寄存器寻址方式直接寻址方式立即寻址方式变址寻址方式位寻址方式间接寻址方式间接寻址方式说明下列指令中源操作数采用的寻址方式。
MCS-51单片机的指令可以分为五类:
1.指令分类
2)算术运算指令
4)控制程序转移指令
3)逻辑运算指令
1)数据传送指令
5)位操作指令
3.3 89C51单片机的指令系统数据传送指令是计算机中最基本、应用最广泛的指令类型。 MCS-51单片机有 四类 29 条 数据传送指令。
内部数据传送指令( 15条)
外部数据传送指令( 7条)
数据交换指令( 5条)
堆栈操作指令( 2条)
1 数据传送指令指令格式,MOV <dest>,<src>
注,<src>为源操作数,<dest>为目的操作数指令功能:将源操作数送到目的操作数单元,且源操作数单元中的源操作数不变。
内部数据传送指令累加器 A 寻址
@Ri 间接寻址direct 直接寻址
Rn 工作寄存器寻址 #data 立即数寻址
MOV A,Rn
MOV A,direct
MOV A,@Ri
MOV A,#data
MOV Rn,A
MOV Rn,direct
MOV Rn,#data
MOV direct,A
MOV direct,Rn
MOV direct1,direct2
MOV direct,@Ri
MOV direct,#data
MOV @Ri,A
MOV @Ri,direct
MOV @Ri,#data
在以上的传送指令中:
两操作数中有一个是累加器 A的肯定是单机器周期指令两操作数中无累加器 A但有立即数的,如目的操作数为直接寻址方式是双机器周期指令;其它的为单机器周期指令两操作数中无累加器 A,也无立即数的,肯定是双机器周期指令指令的机器周期数已知,R1=30H,R2=31H,(56H)=23H,
试问执行以下指令后,结果各是什么?
MOV A,R1
MOV R2,A
MOV 56H,R1
结果为,A= R2= (56H)=
例
30H 30H 30H
已知,(30H)=12H,(31H)=13H,R0=30H、
R1=31H,试问执行以下指令后 A,30H、
31H和 32H各是什么?
MOV A,@R0 ;
MOV @R1,A ;
MOV @R0,#34H ;
MOV 32H,@R1 ;
例
A←((R0)) =12H
((R1)) ←A=12H,(31H)=12H
((R0))←34H,(30H)=34H
(32H) ←((R1))=12H
结果为,A=12H,(30H)=34H,
(31H)=12H,(32H)=12H
MOV R0,R1
MOV @R1,R7
MOV @R0,@R1
MOV A,R1
MOV R0,A
MOV A,R7
MOV @R1,A
MOV R6,@R0 MOV A,@R0MOV R6,A
MOV A,@R1
MOV @R0,A
练习 判断下列指令的正误,将错误的更正,
更正更正更正更正应用举例 1
MOV P1,#0FEH ; 11111110B
可以使 P1.0上的发光二极管点亮
MOV P1,#0F0H ; 11110000B
可以使 P1口上的上面 4个发光二极管点亮
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
5v
8段数码管显示
MOV P1,#00H ;
MOV P1,#0F8H ;
MOV P1,#88H ;
P1.0 a
P1.1 b
P1.2 c
P1.3 d
P1.4 e
P1.5 f
P1.6 g
P1.7
dp
5v
显示 8.
显示 7
显示 A
MOV DPTR,#data16; DPTR ← ROM,外部 RAM的
16 位地址值
16位数据传送指令( 1 条)
例,MOV DPTR,#2030H
ROM
90
20
30
片内 RAM
00H
7FH
80H81H
82H(DPH)83H(DPL)
双机器周期指令
访问 ROM 存储器的指令(查表)( 2 条)
MOVC A,@A + DPTR; A ← ( A+DPTR) 数据指针
MOVC A,@A + PC; PC ← PC + 1,A ← ( A+PC) 程序指针注,PC 不能随便改变,称为近程查表
DPTR 可随时赋值,称远程查表故 @A+DPTR 比 @A+PC 更常用为两机器周期指令例,CLR A
MOV DPTR,#2030H
MOVC A,@A + DPTR
2030H
00H
7FH
80H
81H
82H(DPH)
83H(DPL)
片内 RAM
E0H(A)
……
20
30
AA
ROM
30
20
AA
90PC→
93 PC+3→
00H
7FH
80H
81H
82H
83H
片内 RAM
E0H(A)
ROM
2000H 74
2001H 05
2002H 83
2003H
2008H AAAA
例,MOV A,#05H
MOVC A,@A + PC
05
AA
已知,1000H,MOV A,#10H ; A = 10H
1002H,MOVC A,@A+PC
ROM表项
1010H,02H
1011H,04H
1012H,06H
1013H,08H
A ← ( A+PC),A = 08H
结果取指后 PC = 1003H,A + PC = 1013H
注,能够查表的地址范围为:
1003H ∽ 1003H + FFH
例已知,片外 ROM的 2008H单元中有一数 34H,
试用两条外部 ROM数据传送指令各编写一个程序,
把数送到片内 RAM的 7FH单元 。
解,① 采用 DPTR作为基址寄存器,基址可定为
2000H,地址偏移量则为 08H,程序如下:
MOV DPTR,# 2000H ; DPTR← 2000H
MOV A,# 08H ; A← 08H
MOVC A,@ A+ DPTR ; A← 34H
MOV 7FH,A ; ( 7FH) ← A
例
#2007H
#01
② 采用 PC作为基址寄存器,程序如下:
ORG 2000H
START,MOV A,# 05H ; A← 05H
MOVC A,@ A+ PC ; A← 34H
MOV 7FH,A ; ( 7FH) ← A
2008H 34
2000H 74
2001H
2002H 83
2003H
05
ROM
ACC
0534 05是怎么确定的?
8段数码管显示
0,C0H 1,F9H P1.0 a
P1.1 b
P1.2 c
P1.3 d
P1.4 e
P1.5 f
P1.6 g
P1.7
dp
5v
2,ABH 3,B0H
4,99H 5,92H
6,82H 7,F8H
8,80H 9,90H
2000H,
C0H F9H ABH B0H 99H
92H 82H F8H 80H 90H
MOV DPTR,#2000H
MOV A,# 05H
MOVC A,@ A+ DPTR
MOV P1,A
c
a
g
e
外部 RAM 传送指令( 4 条)(双机器周期)
MOVX A,@Ri ;外部 RAM的 00H ~ FFH单元读
MOVX @Ri,A ;外部 RAM的 00H ~ FFH单元写
MOVX A,@DPTR ;外部 RAM的 64K单元读
MOVX @DPTR,A ;外部 RAM的 64K单元写注,MOVC 指令仅 读 操作,MOVX 指令可 读写 操作访问外部存储器仅用间址,不用直接地址累加器 A
寄存器间接寻址
@R1,@R0
(片外 0- 255B)
寄存器间接寻址
@DPTR
(片外 0- 64KB)
已知外部 RAM的 60H单元中有一个数为 30H,
试编程把 30H送到片外 RAM的 2000H单元中。
例解,MOV R1,#60H ;R1=60H
MOVX A,@R1 ;A=30H
MOV DPTR,#2000H ;DPTR=2000H
MOVX @DPTR,A ;2000H←30H
分析:上面虽都是片外 RAM的地址单元,但不能直接传送,必须经过累加器 A的转送,才能实现。
MOVX A,2000H
MOVX A,20H
错误
MOV DPTR,#2000H
MOVX A,@DPTR
错误
MOV R0,#20H
MOVX A,@R0
练习 判断下列指令的正误,将错误的更正,
访问外部 RAM指令
字节 数据交换指令 —— XCH
XCH A,Rn ; A? (Rn)
XCH A,direct ; A? ( direct)
XCH A,@Ri ; A?((Ri))
数据交换指令(单机器周期)
低 4 位数据交换指令 —— XCHD
累加器 A 中高低 4 位 交换 指令 —— SWAP
XCHD A,@Ri ; A0~3? ( Ri) 0~3
SWAP A ; A0~3? A 4~7
注:交换指令均与累加器 A 有关 !!!
已知,片内 20H单元有一个数为 30H,片外 20H单元有一个数为 03H,编程把二个数相互交换。
例解,MOV R0,#20H ; R0←20H
MOVX A,@R0 ; A←03H
XCH A,20H; A←30H,20H←03H
MOVX @R0,A ; 30H→20H (外部 RAM)
分析:片内、片外没有直接的交换指令,必须经过累加器 A的中转,才能实现。
@R0
堆栈操作的规则,先进后出,后进先出。
PUSH direct; SP ← SP + 1,( SP) ← ( direct)
POP direct;( direct ) ← ( SP),SP ← SP – 1
堆栈操作指令( 2机器周期)
例 已知,(20H)=M1、( 50H) =M2、编写程序用堆栈指令把 20H和 50H单元中的内容相交换。
解:由堆栈所具备的原则,程序为:
MOV SP,#60H ;设置栈底首址为 60H
PUSH 20H ; SP←SP+1,61 ←M1
PUSH 50H ; SP←SP+1,62 ←M2
POP 20H ; (20H)←M2,SP ← SP -1= 61H
POP 50H ; (50H)←M1,SP ← SP -1= 60H
加法指令( 13条):
减法指令( 8条):
十进制调整指令( 1条):
乘法和除法指令( 2条):
ADD,ADDC,INC
SUBB,DEC
DA
MUL,DIV
2 算术运算指令注意指令对 PSW中标志位的影响!!
不带 Cy加法指令( 4条):
ADD A,Rn ; A ← A + Rn
ADD A,direct ; A ← A + ( direct)
ADD A,@Ri ; A ← A + ( Ri)
ADD A,#data ; A ← A + data
注:指令的目的操作数为累加器 A 执行指令后将影响标志位
Cy,AC,OV及 P。
(都属单字节指令)
试分析执行如下指令后,累加器 A和 PSW
中各标志位的变化情况如何?
MOV A,#5AH
ADD A,#6BH
解:第一条指令先向累加器 A传送一个数
5AH,第二条为加法指令,在此 机器执行加法指令时按带符号数运算 。
例竖式表示如下图:
执行结果,A=5A+6B=C5H,PSW=44H
0 1 0 0 0 1 0 0
Cy AC F0 RS1 RS0 OV - P
5A+6B
=?
A= 0 1 0 1 1 0 1 0 B
data= 0 1 1 0 1 0 1 1 B107
1 1 1 0 0 0 1 0 1 B
90
+ )
197
1
AC
0
0
CPC7
1
C6
例 MOV A,#5AHADD A,#6BH
执行结果,A=78+9A=12H,PSW=C0H
1 1 0 0 0 0 0 0
Cy AC F0 RS1 RS0 OV - P
78+9A
=?
A= 0 1 1 1 1 0 0 0 B
data= 1 0 0 1 1 0 1 0 B154
1 0 0 0 1 0 0 1 0 B
120
+ )
274
1
AC
1
CPC7
1
C6
例 MOV A,#78HADD A,#9AH(无符号数相加)
带 Cy加法指令( 4条):
ADDC A,Rn ; A ← A + (Rn) + Cy
ADDC A,#data ; A ← A + data + Cy
ADDC A,direct ; A ← A +(direct) + Cy
ADDC A,@Ri ; A ← A +((Ri)) + Cy
注:若 Cy = 0,
则 ADD 相当于
ADDC
注:指令的目的操作数为累加器 A 执行指令后将影响标志位
Cy,AC,OV及 P。
(都属单字节指令)
练习已知,A= 7DH,R0= 30H,(30H)= 35H、
(31H)= 0DCH和 Cy= 1,试问 CPU执行以下的每条指令后累加器 A和 Cy中的值是多少。
a.ADDC A,R0 b.ADDC A,31H
解:操作结果应为:
a,A=7D+30+1=0AEH,Cy=0
b.A=7D+DC+1=5AH,Cy=1
练习编写程序,进行两个 16位数的加法:
6F5DH+13B4H,结果从低位到高位依次存入内部 RAM的 30H,31H和 32H单元。
MOV A,#5DH
ADD A,#0B4H ;Cy= 1
MOV 30H,A
MOV A,#6FH
ADDC A,#13H ;Cy=0
MOV 31H,A
MOV 32H,#00H
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
加 1指令( 5条):
加 1指令中,只有,INC A” 这一条影响奇偶标志位,其余均不影响任何标志位。
,INC DPTR” 对 DPTR中内容加 1,是唯一的一条 16位算术运算指令。也是加 1指令中唯一的一条 2机器周期指令。
注意例已知,A= 34H,R0= 42H、( 43H)= 23H、
DPTR= 3020H,试问 CPU依次执行如下程序后 A、
R4,43H,R0,DPTR及 PSW中的内容各是什么?
INC A
INC R0
INC 43H
INC @R0
INC DPTR
解:由加 1指令的规则,上述指令执行后的结果为:
A= 35H,R0= 43H,43H= 25H,DPTR= 3021H。
由于,加 1指令在程序中频繁地出现,常用来修改地址和数据指针加 1处理 。
练习编写程序,进行两个 16位数的加法:
6F5DH+13B4H,结果从低位到高位依次存入内部 RAM的 30H,31H和 32H单元,要求用寄存器间接寻址的方式存入。
MOV A,#5DH
ADD A,#0B4H ;Cy= 1
MOV R0,#30H
MOV @R0,A
MOV A,#6FH
ADDC A,#13H ;Cy=0
INC R0
MOV @R0,A
INC R0
MOV @R0,#00H
带借位 Cy减法指令( 4条):
SUBB A,Rn ; A ← A – Rn- Cy
SUBB A,#data ; A ← A - data - Cy
SUBB A,direct ; A ← A -(direct) - Cy
SUBB A,@Ri ; A ← A – ((Ri)) - Cy
注意:
1、指令的目的操作数为累加器 A
执行指令后将影响标志位 Cy,AC,OV及 P。
2,MCS-51仅有带借位的减法指令,
若要使用不带借位的减法指令,则令 Cy = 0。
(都属单字节指令)
0000011
Cy AC F0 RS1 RS0 OV ━
1
P
例
0111 1111
试分析执行下列指令后,累加器 A和 PSW中各标志位状态?
CLR C
MOV A,#35H
SUBB A,#0B6H
解,A = 0011 0101
-) 1011 0110
结果为,A=35-B6=7FH,Cy =1,PSW为:
DEC A ;A←A -1
DEC Rn ;Rn←(Rn) -1
DEC direct ;direct←(direct) -1
DEC @Ri ;(Ri)←((Ri)) -1
减 1指令( 4条):
注减 1指令与加 1指令相似,只有以 A为操作数的指令才影响 PSW的 P位。
(都属单字节指令)
已知,A= 10H,R1= 3BH,R7= 34H、
(60H)= 00H,(3BH)= 0FFH,试分析,执行如下每条指令后累加器 A和 PSW中各标志位状态?
① DEC A ② DEC @R1
③ DEC 60H ④ DEC R7
解:根据减 1指令功能,结果为:
① A= 0FH,P=0
② (3B)= 0FEH,PSW不变
③ (60H)= 0FFH,PSW不变
④ R7=33H,PSW不变列十进制调整指令( 1条)
1,BCD加法 DA A
对 A中 两个压缩 BCD数相加之 和 调整为 2位 BCD码数
1)对压缩 BCD码数进行 ADD或 ADDC操作后使用
2)影响标志位,Cy,AC,P;不影响 OV。; A ← A +
06H
60H
66H
试编程实现 44H+ 86H的 BCD加法程序,
并对其工作原理分析。
程序 CLR C
MOV A,# 44H ;A←44H
ADD A,# 86H ;A←44 + 86= 0CAH
DA A ;A←30H,Cy = 1,AC= 1
A= 0 1 0 0 0 1 0 0 B44
data=1 0 0 0 0 1 1 0 B86+ )
0 1 1 0 1 0 0 0 0 B
0 1 1 0
1 0 0 1 1 0 0 0 0 B
0 1 1 0 0 1 0 1 0 B130
0 1 1 0 B
低 4位> 9,
加 6调整高 4位> 9,
加 6调整
BCD加法过程
1 1 - - - - - 0
Cy AC F0 RS1 RS0 OV - P
BCD减法
MCS- 51单片机中没有十进制减法调整指令,因此,这里的 BCD减法运算必须采用 BCD
补码运算法则。
例已知,30H和 31H中分别存有被减数 80和减数
25,试编程求差,并把结果存入 32H单元中。
解:根据 BCD减法的实施步骤,程序如下:
思路:
因为没有 BCD码的减法调整指令,
将减法运算转化为加法运算。
80-25=55
80+(-25)补码 =80+( 100-25) =80+75=155
执行加法运算
80H+75H=F5H
运行 BCD码调整指令
F5+60=155
其中 1进至 Cy,A=55
ORG 0100H
CLR C ;清 Cy
MOV A,# 9AH ;A←BCD 模 100
SUBB A,31H ;A←BCD 减数的补数
ADD A,30H ;A← 被减数+减数的补数
DA A ;对 A进行加法调整
MOV 32H,A ;存入 M3 M3←BCD 差
CLR C ;清 Cy
SJMP $ ;停止
80-25=?
BCD被减数
1 1 1 1 0 1 0 1 B
1 0 1 0 1 0 1 0 1 B
0 1 1 1 0 1 0 1 B 减数的补数两位 BCD数的模 100
BCD减数
BCD减法过程
1 0 0 1 1 0 1 0 B100
0 0 1 0 0 1 0 1 B25
+ 1 0 0 0 0 0 0 0 B80
加 60调整 BCD差0 1 1 0+ 60
55
指令格式,MUL AB ; A× B =B高 8A低 8
指令功能,寄存器 A,B中两个 8 位数相乘,
结果为 16 位数据,其中高 8 位放在寄存器 B中,
低 8 位放寄存器 A中。
专用寄存器,寄存器 B 和累加器 A
乘法指令
标志位 Cy,OV,P 讨论:
执行乘法指令后 Cy = 0
若积为 8 位(即 B = 0),则 OV = 0
若积为 16 位(即 B ≠ 0),则 OV = 1
根据累加器 A 确定奇偶标志 P
已知:有两个 8位无符号乘数分别放在 20H
和 21H单元中,试编写程序把乘积的低 8位放入 22H单元中,积的高 8位放入 23H单元中 。
例分析:这是一个乘法问题,可用 MUL AB指令。
其操作数分布在相邻四个单元,采用间址寻址方式较为方便。
ORG 1000H
MOV R1,#20H ; R1← 第一个乘数地址
MOV A,@R1 ; A← 第一个乘数
INC R1 ; 修改乘数地址
MOV B,@R1 ; B← 第二个乘数地址
MUL AB ; A*B=BA
INC R1 ; 修改目标单元地址
MOV @R1,A ; 22H← 积的低 8位
INC R1 ; 修改目标单元地址
MOV @R1,B ; 23H← 积的高 8位
指令格式,DIV AB ; A÷ B =A整数商 B余数
指令功能:两无符号数相除,被除数 A 除以除数 B,整商存 A中,余数存 B 中。
专用寄存器,寄存器 B 和累加器 A
除法指令
标志位 Cy,OV,P 讨论:
执行除法指令后 Cy = 0
若除数 B = 0,则 OV = 1
若除数 B ≠ 0,则 OV = 0
根据累加器 A 确定奇偶标志 P
逻辑与运算指令( 6条):
逻辑或运算指令( 6条):
逻辑异或指令( 6条):
累加器清零和取反指令( 2条):
ANL
ORL
XRL
CLR,CPL
逻辑操作指令累加器 A
ANL,ORL,XRL
直接地址单元
ANL
ORL
XRL
R0- R7寄存器寄存器间接寻址 @R1,@R0
立即数
(# DATA)
有 A参与的逻辑操作都是单机器周期,其余为双机器周期
ANL A,Rn
ANL A,@Ri
ANL A,direct
ANL A,#data
ANL direct,A
ANL direct,#data;A A ∩ Rn;A A ∩ (Ri);A A ∩ direct;A A ∩ #data;direct direct ∩ A;direct direct ∩ #data
逻辑 与 指令将两个指定的操作数按位进行“与”,
“与” 运算:有 0出 0,全 1为 1。
例
② A=0FH,
( 20H) =0AEH
A = 0000 1111
∧ ) ( 20H) = 1010 1110
0000 1110
已知,R0=20H、( 20H) =0AEH,试问分别执行如下指令后,累加器 A和 20H单元中内容各是什么?
① MOV A,#20H ② MOV A,#0FH
ANL A,R0 ANL A,20H
解:根据逻辑乘指令功能,上述指令执行后的结果为:
① A=20H,
( R0) =20H
A = 0010 0000
∧ ) R0 = 0010 0000
0010 0000
A=20H A=0EH
已知,M1,M2皆为 8位的二进制数,若 M1?M2=M1,则 M2=?请思考 0FFH或 M1
ORL A,Rn ;A←A ∪ Rn
ORL A,direct ;A←A ∪ direct
ORL A,@Ri ;A←A ∪ (Ri)
ORL A,#data ;A←A ∪ data
ORL direct,A ;direct←(direct) ∪ A
ORL direct,#data ;direct←(direct) ∪ data
逻辑 或 指令将两个指定的操作数按位进行“或”,
“或” 运算:有 1出 1,全 0为 0。
已知,M1,M2皆为 8位的二进制数,若 M1+ M2=M1,则 M2=?请思考例
② A=0FH,
( 20H) =0AEH
A = 0000 1111
∪ ) ( 20H) = 1010 1110
1010 1111
已知,R0=20H、( 20H) =0AEH,试问分别执行如下指令后,累加器 A和 20H单元中内容各是什么?
① MOV A,#20H ② MOV A,#0FH
ORL A,R0 ORL A,20H
解:根据或逻辑指令功能,上述指令执行后的结果为:
① A=20H,
( R0) =20H
A = 0010 0000
∪ ) R0 = 0010 0000
0010 0000
A=20H A=0AFH
00H或 M1
已知,A= 0AAH和 P2= 0FFH,编程把累加器
A中低 4位送入 P2口低 4位,P2口高 4位不变 。
解:程序思路为:根据逻辑与,逻辑或两类指令的特性来实现
ORG 0030H
ANL A,# 0FH ;屏蔽 A中的高 4位,低 4位不变
ANL P2,# 0F0H ;屏蔽 P2中的低 4位,高 4位不变
ORL P2,A ;装配数据,结果送 P2
例
XRL A,Rn ;A←A ⊕ Rn
XRL A,direct ;A←A ⊕ (direct)
XRL A,@Ri ;A←A ⊕ (Ri)
XRL A,#data ;A←A ⊕ data
XRL direct,A ;direct←(direct) ⊕ A
XRL direct,#data ;direct(direct)⊕ data
逻辑 异或 指令将两个指定的操作数按位进行“异或”,
“异或” 运算:相异为 1,相同为 0。
例
② A=0FH,
( 20H) =0AEH
A = 0000 1111
⊕ ) ( 20H) = 1010 1110
1010 0001
已知,R0=20H、( 20H) =0AEH,试问分别执行如下指令后,累加器 A和 20H单元中内容各是什么?
① MOV A,#20H ② MOV A,#0FH
XRL A,R0 XRL A,20H
解:根据异或逻辑指令功能,上述指令执行后的结果为:
① A=20H,
( R0) =20H
A = 0010 0000
⊕ ) R0 = 0010 0000
0000 0000
已知,M1,M2皆为 8位的二进制数,若 M1+ M2=M1,则 M2=?请思考 00H
A=00H A=0F1H
已知:外部 RAM0040H中有一数 BBH,假定高 4位不变和低 4位取反,试编出它的相应程序 。
解:利用 MOVX A,@DPTR类指令
ORG 0300H
MOV DPTR,#0040H ;地址送指针 DPTR
MOVX A,@DPTR ; A←BBH
XRL A,#0FH ; A←BBH ⊕ 0FH=B4H
MOVX @DPTR,A ;结果送回 30H单元例
位清 0 —— 逻辑与
位置 1 —— 逻辑或
位取反及恢复 —— 逻辑异或
ANL A,#0F0H ; A 中低 4 位清 0,高 4 位不 变
ORL A,#0F0H ; A 中高 4 位置 1,低 4 位不变
XRL A,#0FFH ; A 中各位取反
XRL A,#0FFH ; A 中各位恢 复应用小结
累加器清零指令( 1 条 )
CLR A ; A ← 0
取反指令( 1 条 )
CPL A ; A←/A
清零取反指令
+ 5V
89C51
P1.3
K1
P1.2
P1.1
P1.0 K2
K3
K4
MOV P1,#0FFH
MOV A,P1
ANL A,#0FH
针对以下的独立式键盘电路原理图试编写一段程序确定是否有键按下
CP
ANL A,#0FH
用指令实现逻辑电路
逻辑式编程
电路逻辑式 F = ( X·Y) +( Y⊕ Z)
注,X,Y,Z,F 为直接地址
MOV A,X ;符号地址 X 中的数送 A
ANL A,Y ;符号地址 X,Y 中的数与后送 A
MOV R0,A ; R0 中暂存 X· Y 的结果
MOV A,Y
XRL A,Z ; A 中存 Y⊕Z 的结果
CPL A ; A中存 /(Y⊕Z) 的结果
ORL A,R0 ; A中存 (X·Y) +/(Y⊕Z) 的结果
MOV F,A ;结果存入符号地址 F 中例
RL A ;
RR A ;
Cy A7 A0
A
Cy A7 A0
A
RLC A ;
RRC A ;
移位指令
A
A7 A0
A
A7 A0
已知,A=9AH,且 Cy=1,求运行下列指令后,A=?
(1)RL A (2)RR A
(3)RLC A (4)RRC A
解,A=10011010
(1)A= 0011010 1
(2)A= 0 1001101
(3)A= 0011010 1 Cy=1
(4)A=1 1001101 Cy=0
例已知,M和 M+ 1单元中有一个 16位二进制数
( M为低 8位),编程将其扩大到二倍。
解:一个 16位二进制数扩大到二倍就等于是把它进行一次算术左移。由于 MCS- 51单片机的移位指令都是二进制 8位的移位指令,因此 16位数的移位指令必须用程序来实现。
算法为:
MM+1
0
例程序为:
ORG 0030H
CLR C ;清进位标志位
MOV R0,# M ;操作数低 8位地址送 R0
MOV A,@ R0 ;A← 操作数低 8位
RLC A ;低 8位操作数左移低位补 0
MOV @ R0,A ;结果送回 M单元,Cy中为最高位
INC R0 ;R0指向 M+ 1单元
MOV A,@ R0 ;A← 操作数高 8位
RLC A ;高 8位操作数左移并加上低位 Cy
MOV @R0,A ;结果送回 M+ 1单元
INC R0
MOV @R0,#00H/#01H ;进位位存入 M+ 2单元
1)长转移指令
LJMP addr16 ;PC←addr16
2)短转移指令
AJMP addr11 ;PC←PC+2,PC10 —0←addr11
3)相对转移指令
SJMP rel ;PC←PC+2,PC←PC+rel
4)间接转移指令
JMP @A+DPTR ;PC←A+DPTR
1,无条件转移指令 (4条 )
3 控制程序转移指令一页,256个地址单元一区,8页,共 2KB地址单元;地址高 5位决定区。
64K,32区,256页。
地址的前 8位相同地址的前 5位相同几个概念“
F800H~FFFFHF000H~F7FFHE800H~EFFFHE000H~E7FFH
D800H~DFFFHD000H~D7FFHC800H~CFFFHC000H~C7FFH
B800H~BFFFHB000H~B7FFHA800H~AFFFHA000H~A7FFH
9800H~9FFFH9000H~97FFH8800H~8FFFH8000H~87FFH
7800H~7FFFH7000H~77FFH6800H~6FFFH6000H~67FFH
5800H~5FFFH5000H~57FFH4800H~4FFFH4000H~47FFH
3800H~3FFFH3000H~37FFH2800H~2FFFH2000H~27FFH
1800H~1FFFH1000H~17FFH0800H~0FFFH0000H~07FFH
程序存储器 64K地址空间
64K地址空间分为 32个区,256个页
① 长转移指令三字节指令,不影响标志位,可在 64KB地址范围内无条件转移。
LJMP addr16 ; PC addr16
例
0000H,LJMP 2000H
0000H 02 20 00
PC0000 02
0001 20
0002 00
0003
2000 02
2001 00
2002 00
2003
程序存储器
FFFF
……..
64KB
寻址范围
② 短转移指令二字节指令,可在 2KB
地址范围内转移。
AJMP addr11 ; PC PC+2
PC15-11不变
PC10-0 addr11
PC
2KB
寻址范围寻址范围在 PC+ 2
所在的区内
2031H,AJMP addr11
例程序存储器
FFFF
……..
……..0000
a10 a9 a8 0 0 0 0 1
a0- a7
……..
……..
2031
2000
27FF
特征码
PC15 PC14 PC12PC13 PC11 a10 a8a9 a7 a6 a4a5 a3 a2 a0a1
转移地址:
a10 a9 0a8 0 0 10 a7 a6 a4a5 a3 a2 a0a1
机器码:
若 PC的当前地址为 2802H
addr11=16AH
转移地址,296AH
0 0 01 1 0 10 0 1 01 1 0 01
机器码,216AH
0 0 01 0 0 10 0 1 01 1 0 01
练习
(00101000 0000 0010B)
(001 0110 1010B)
讨论 AJMP指令的转移范围:
PC15 PC14 PC12PC13 PC11 0 00 0 0 00 0 0 00
最小地址:
PC15 PC14 PC12PC13 PC11 1 11 1 1 11 1 1 11
最大地址:
AJMP指令可在 2KB地址范围转移思考若 PC+2=3FFF,则执行 AJMP的转移范围为:
3800H ∽ 3FFFH
③ 相对转移指令机器码,80H
rel
本指令是一条双字节双周期指令,在 PC内容加 2所指地址上,以 rel,-128∽+127 为偏移量,在一页地址 (-128∽+127) 范围内实现短转移。
SJMP rel ; PC PC+2+rel
rel是一个带符号数,00H- 7FH对应 0~ 127;
80H- FFH对应- 128~- 1
在实际使用时,rel用一个转移目标地址标号来表示。
在编译时计算 rel的实际偏移值
ORG 1000H
1000H 74 01H START,MOV A,#01H;字位码初值送 A
1002H F8H MOV R0,A ;暂存于 R0
1003H 90 CF 01H LOOP,MOV DPTR,#0CF01H ;端口地址; CF01送 DPTR
┋
1017H 80rel SJMP START ;转入 START
┋
SJMP $ ;停止例 下列程序中,请计算 SJMP START指令码中的 rel,并分析目标地址的转移范围 。
地址偏移量 rel的计算:
PC目的地址 = PC当前地址 + rel
rel=PC目的地址 - PC当前地址
= 1000H-( 1017H+2)=- 19H
rel应采用补码表示,为此
rel=[-19H]补 = [1001 1001]补 =E7H
解,SJMP指令中地址偏移量是采用 START符号表示的,指明指令执行后转入本程序开头重新执行 。
PC
0FFF
1000 74H
1001 01H
1002 F8H
1017 80H
1018 rel
1019
1017H,SJMP START;
START=1000H; rel=E7
E7H
跳转范围:
0F99H- 1098H
练习 已知,SZ,SJMP LOOP
其中 SZ=126FH,LOOP=1200H
请计算偏移量 rel=?
解,PC目的地址 =1200H
PC当前地址 =126FH+2=1271H
rel=[1200-1271]补 =[-71H]补
=[11110001B]补 =10001110+1
=10001111B=9FH
注意:当 rel=- 2,用补码表示为 FE时,
PC目的 = PC源 + 2- 2= PC源例,SZ,SJMP SZ 及 SZ,SJMP $
④ 变址寻址转移指令 (间接转移指令 )
JMP @A+DPTR; PC A+DPTR
机器码,73H
该类指令是一条单字节双周期无条件转移指令。 在 64KB地址范围内无条件转移。
+ 5V
89C51
P1.3
K0
P1.2
P1.1
P1.0 K1
K2
K3
…………
STAR:MOV A,R1
CLR C
RLC A ;A←A* 2
MOV DPTR,#MAIN ;转移指令表始址送 DPTR
JMP @ A+ DPTR
MAIN:AJMP PM0 ;转入 0#命令程序
AJMP PM1 ;转入 1#命令程序
AJMP PM2 ;转入 2#命令程序
AJMP PM3 ;转入 3#命令程序
PM0,CLR C MOV A,40H
ADD A,41H MOV 42H,A ……
PM1,CLR C MOV A,40H
SUBB A,41H MOV 42H,A ……
PM2,…………………,
JZ rel; A=0 PC PC+2+rel
A≠ 0 PC PC+2
JNZ rel; A≠0 PC PC+2+rel
A=0 PC PC+2
2,条件转移指令
① 累加器 A判零转移 (2条 )
rel是一个带符号数,00H- 7FH对应 0~ 127;
80H- FFH对应- 128~- 1
在实际使用时,rel用一个转移目标地址标号来表示。
在编译时计算 rel的实际偏移值已知:外部 RAM中以 2000H为起始地址的数据块,以零为结束标志,试编程将该数据块送到以 60H为起始地址的内部 RAM单元中 。
例
0000
0001
0002
0003
2000 AA
2001 BB
2002 CC
2003 00
外部 RAM
AA
00
01
02
03
60
61
62
63
内部 RAM
结束标志分析:
外部 RAM 内部 RAM
A
关键指令,MOVX A,@DPTR
MOV @R0,A
步骤,①设置 DPTR=#2000H
② 设置目的地首地址 R0=#30H
③ 取外部数据至 A
⑤ A≠0,送数,修改地址转至 ③
⑤ A=0,转至结束处④ 判断转移解:程序为:
ORG 1000H
① MOV DPTR,#2000H ;外部 RAM数据块始地址
② MOV R0,#60H ;内部 RAM数据块始址送 R0
③ MOVX A,@DPTR ;取外部 RAM数据送 A
④ JZ QUIT ;若 A=0,则跳转到 QUIT处,;否则往下执行
⑤ MOV @R0,A ;A中的数据送给内部 RAM单元中
INC R0 ;修改外部 RAM地址的指针
INC DPTR ;修改内部 RAM地址的指针
SJMP ;循环执行
⑤ QUIT,SJMP $ ;停止
MAIN:
MAIN
CJNE A,#data,rel ;不相等转移; A=#data,PC ← PC+3,Cy ← 0; A>#data,PC ← PC+3+rel,Cy ← 0; A<#data,PC ← PC+3+rel,Cy ← 1
CJNE A,direct,rel ;不相等转移;若 A=(direct),则 PC← PC+3,Cy← 0;若 A>(direct),则 PC← PC+3+rel,Cy← 0;若 A<(direct),则 PC← PC+3+rel,Cy← 1
② 不相等转移(影响标志位)
CJNE Rn,#data,rel ;不相等转移;若 (Rn)=data,则 PC← PC+3,Cy← 0;若 (Rn)>data,则 PC← PC+3+rel,Cy← 0;若 (Rn)<data,则 PC← PC+3+rel,Cy← 1
CJNE @Ri,#data,rel ;不相等转移;若 ((Ri))=data,则 PC← PC+3,Cy← 0;若 ((Ri))>data,则 PC← PC+3+rel,; Cy← 0;若 ((Ri))<data,则 PC← PC+3+rel,;Cy← 1
DJNZ direct,rel ;direct← (direct)-1;若 (direct)≠ 0,则 PC← PC+3+rel;若 (direct)=0,则 PC← PC+3
DJNZ Rn,rel ;Rn ← (Rn)- 1;若 (Rn)=0 则 PC ← PC+2;若 (Rn)≠0 则 PC ← PC+2+rel
③ 减一不为零转移(循环转移指令)
例,从 P2.0输出 20个方波。
解:程序为:
ORG 1000H
MOV R2,#40D ;预置波形数= 2× 方波数
BACK,CPL P2.0 ;P2.0取反
DJNZ R2,BACK ;R2- 1不等于 0继续循环
SJMP $ ;停止思考,1、在此程序中标号的地址范围可以是??
2、用此程序产生的方波周期是多少??
子程序
ADD1
RET
A
C
B断点
D断点
3,子程序调用和返回指令子程序:具有一定功能的共用程序段子程序的最后一条指令必须是 RET
A:调用子程序指令地址
B:PC当前值,
入栈保护入口地址
(一般用标号来表示 )
ADD1:
① 调用指令 (2条 )
ACALL addr11 ;PC ← PC+2;SP ← SP+1;(SP) ← PC7~0;SP ← SP+1;(SP) ← PC15~8;PC10~0 ← addr11
a)短调用是一条双字节指令,格式为,
双字节指令,不影响标志位,在 2KB地址范围内寻址,以调用子程序。
保护返回地址目标地址机器码,a10 a9 a8 1 0 0 0 1
a7 a6 a5 a4 a3 a2 a1 a0
特征码例 已知,SZ,ACALL 3F2H; SZ=1800H
试确定:操作码及目的地址(子程序入口地址)
解,3F2H= 011 1111 0010B
机器码,011 10001 1111 0010B=71F2H
PC当前值 = SZ+ 2=1802H=0001 1000 0000 0010B
目的地址,0001 1011 1111 0010B=1BF2H
3F2
注意,所调用的子程序首地址必须在 PC当前值所在的同一区里
b) 长调用指令
LCALL addr16 ;PC ← PC+3;SP ← SP+1,(SP) ← PC7~0;SP ← SP+ 1,(SP) ← PC15~8;PC ← addr16(子程序入口地址)
三字节指令,在
64KB地址范围内调用子程序。
例已知,MAIN= 0200H,试问执行如下指令后,堆栈中数据如何变化? PC中内容是什么?
MOV SP,# 65H
MAIN,LCALL 2000H
解:执行上述指令后,SP= 67H、
( 66H) = 03H,( 67H) = 02H,PC= 2000H。
② 返回指令 (2条 )
RET PC15~8 ← (SP),SP ← SP-1
PC7~0 ← (SP),SP ← SP-1
② 子程序返回指令调用子程序后必须返回主程序,因此,每种子程序的最后一条指令必须是返回指令
RET。返回时完成将调用子程序时压入堆栈的断点地址送回 PC以恢复断点功能。堆栈遵循
“后进先出”原则。
b)中断返回指令
RETI
中断服务程序的最后一条指令后是中断返主指令。其恢复断点的操作与返回指令 RET相同。
此条指令前必须将相应的优先级状态触发器清 0。
NOP
PC15~8 ← (SP),SP← SP-1
PC7~0 ← (SP),SP← SP-1
③ 空操作用来产生一个机器周期的延时!
试利用子程序指令编写出以
20H- 23H单元中的数分别拆字送以
50H为首的地址单元中 。
例解:程序为:
ORG 0030H
MOV SP,#60H
CZCX:MOV R0,#50H ;目标首地址
MOV A,20H ;拆第一个字
LCALL PTDS ;调用拆字子程序
MOV A,21H ;拆第二个字
LCALL PTDS ;调用拆字子程序
MOV A,22H ;拆第三个字
LCALL PTDS ;调用拆字子程序
MOVA,23H ;拆第四个字
LCALL PTDS ;调用拆字子程序
SJMP $ ;停止
PTDS,MOV B,A ;把要拆的字送 B保存
ACALL PTDS1 ;调拆字子程序
MOV A,B ;调 B中的内容
SWAP A ;交换高低位
PTDS1:ANLA,#0FH ;屏蔽高位,保留低位
MOV @R0,A ;送目标地址
INC R0 ;目标地址加 1
RET ;返回内部 RAM中 20H~2FH单元是位寻址区和
11个可以位寻址的寄存器 P0,P1,P2,P3、
TCON,SCON,IE,IP,PSW,A,B。
5、位操作(布尔处理)类指令 (17条 )
① 传送指 令
MOV C,bit ; C ← bit
MOV bit,C ; bit ← C
bit可以是位直接地址、位名称、
点操作的形式( psw.2)
若 C=1,P1=1100 0101B,P3=0011 0101B,
顺次执行下列指令后结果表如何:
MOV P1.3,C;
MOV C,P3.3;
MOV P1.2,C;
例解:结果为,C=0,P1=1100 1001,P3不变
1→ P1.3则 P1=1100 1101
P3.3=0 →C
0 → P1.2则 P1=1100 1001
试编程把 00H位中内容和 3FH位中内容相交换 。
解:程序为:
MOV C,00H ; Cy← ( 00H)
MOV 01H,C ;暂存于 01H位中
MOV C,3FH ; Cy← ( 3FH)
MOV 00H,C ;存入目标 00H位中
MOV C,01H ; 00H位的原内容送 C
MOV 3FH,C ;存入目标 3FH位中
SJMP $ ;停止例
② 位置位和位清零指令 (4条 )
CLR C ; Cy ← 0
CLR bit ;bit ← 0
SETB C ;Cy ← 1
SETB bit ;bit ← 1
③ 位运算指令 (6条 )
ANL C,bit ;Cy ← Cy ∧ (bit)
ANL C,/bit ;Cy ← Cy ∧ /(bit)
ORL C,bit ;Cy ← Cy ∨ (bit)
ORL C,/bit ;Cy ← Cy ∨ /(bit)
CPL C ;Cy ← /Cy
CPL bit ;bit ← /bit
④ 位控制转移指令 (5条 )
若条件满足则 PC值改变,实现程序的转移。
JC rel ;若 Cy= 1 则 PC ←PC+2+rel
JNC rel ;若 Cy≠1 则 PC ←PC+2+rel
JB bit,rel ;若 bit=1 则 PC ←PC+2+rel
JNB bit,rel ;若 bit ≠1则 PC ←PC+2+rel
JBC bit,rel ;若 bit= 1 则 bit=0且 PC ←PC+3+rel
应用举例 2
一个引脚的高低电平,可以通过,光电耦合器” 控制继电器,从而以“弱电”控制“强电”。
第三章 作 业
5,7,8,9,19,32
33,36,37
26,27,29
21,23,24,25
自学内容 3.3.3及 3.3.4
指令和指令系统的概念与分类。
掌握指令的格式和寻址方式。
掌握数据传送、算术运算、逻辑运算、
控制转移和位操作指令的功能和应用。
学习重点和难点
指令的寻址方式。
控制转移指令和位操作指令。
第三章 指令系统
3.1 汇编语言一,概述指令系统,一台计算机所能识别、执行的指令的集合就是它的指令系统。
机器语言,指令系统是一套控制计算机执行操作的二进制编码,称为机器语言。机器语言指令是计算机唯一能识别和执行的指令。
汇编语言,指令系统是利用指令助记符来描述的,称为汇编语言。
计算机的指令系统一般都是利用汇编语言描述的,每一条指令都是由计算机硬件设计所决定的。指令系统没有通用性。
单片机一般是空机,未含任何系统软件。因此在第一次使用前,必须对其进行编程,
位( bit),位是计算机所能表示的最小的、最基本的数据单位,位通常是指一个二进制位。
字节( Byte),一个连续的 8位二进制数码称为一个字节,即 1Byte=8bit。
字( Word),通常由 16位二进制数码组成,即
1Word=2Byte。
字长,字长是指计算机一次处理二进制数码位的多少。 MCS-51型单片机是 8位机,所以说它的字长为 8位。
MCS-51系列单片机都是以 Intel公司最早的典型产品 8051为核心,增加了一定的功能部件后构成的。本章以 89C51为主介绍 MCS-51系列单片机 。
二、常用单位与术语指令格式是指令码的结构形式。表达形式为:
1 指令格式标号 又称为指令地址符号,一般由以英文字母开始的 1-8个字母或数字组成,以冒号,,”结尾如,START,LOOP,NEXT,MAIN
[标号 ],操作码 [操作数 ] ;[注释 ]
三,MCS-51系统单片机指令格式
[ ]项 是可选项。
操作码 用 MCS-51单片机所 规定的助记符 来表示,
它命令 CPU作何种操作,是一条指令中不可缺少的内容 。 如,MOV,ADD,ORL等 。
[标号 ],操作码 [操作数 ] ; [注释 ]
注释 是对该指令作用或功能的说明,以便于阅读,
不参与编译 (可有可无,不是必备的 )。 注释部分前一定要用分号,;,隔开。
操作数 分为目的操作数和源操作数,常用符号
(如寄存器,标号 ),常量 (如立即数,地址值等 )
来表示 。 操作码和操作数之间用若干空格分隔,
而目的操作数和源操作数之间用逗号,,,分隔 。
[标号 ],操作码 [操作数 ] ; [注释 ]
目的操作数,源操作数寄存器,如,A,B,DPTR,Rn,P0等。
标号,如,START,LOOP,MAIN等。
如果累加器 A中已有一个加数 10,那么能够完成 10+ 20并把结果送入累加器 A的加法指令的,
助记符指令格式 为:
SUM,ADD A,# 14H ;A ←A+14H
例如编译后的机器语言,0030H 24H
0031H 14H
2 指令的字节数
MCS-51单片机通常可以分为 单字节,双字节和三字节 指令三种 。
(1)单字节指令( 49条)
单字节指令只有一个字节。通常又可分为两类:
1)指令码中隐含着对某一个寄存器的操作这类指令的指令码只有操作码字段,操作数是隐含在操作码中的 。 如,INC DPTR
1 0 1 0 0 0 1 1二进制码:
这类指令的指令码有操作码字段和专门用来指示操作数所在寄存器号的字段组成 。
例如:八位数传送指令
MOV A,Rn
其中,n的取值范围为 0- 7。
2) 由指令码中的 rrr三位的不同编码指定某一个寄存器
1 1 1 1 1 r r r二进制码:
如 n= 2,则 rrr=010
1 1 1 1 1 0 1 0则二进制码:
双字节指令含有两个字节,操作码字节在前,
操作数字节在后。
例如:八位数传送指令
MOV A,# data8 ;A←data
这条指令的含义是指令码第二字节 data取出来存放到累加器 A中
2)双字节指令( 45条)
二进制码,0 1 1 1 0 1 0 0
# data
这类指令的指令码的第一字节为操作码,第二、三字节为操作数或操作数地址。
3)三字节指令( 17条)
操作码操作数 1
操作数 2
例如:指令 MOV DPTR,# data16
10010000
Data15-8
Data7-0
一、寻址方式中常用符号的说明
(1)Rn:表示当前工作寄存器组中 8个工作寄存器,(n=0-7) 中的一个 。
(2) @ Ri,表 示 寄 存器 间 接寻 址,Ri只能是 R0或 R1。
(3)#data8:8位立即数(常数),实际使用时
data应是 00H-0FFH中的一个。
(4)#data16,表 示 包 含 在 指 令 中 的 16 位立即数 。 范围,0000H-0FFFFH
3.2 寻址方式
(5)direct:表示 8位片内数据存储器( RAM)
单元的直接地址。
(6)addr16:表示 16位的目的地址 。
(7)addr11:表示 11位的目的地址 。
(8)rel:表示 8位带符号的偏移量 。
(9)DPTR:为数据指针,用作 16位的地址寄存器。
(10)Bit:表示内部 RAM或专用寄存器中的直接寻址位地址 。
(11)A:累加器 ACC。
(12)B,专 用 寄 存 器,用于 MUL 和 DIV 指令中 。
(13)@,为间址寄存器或基址寄存器的前缀 。 如@ Ri,@ A+PC,@ A+DPTR。
(14)/,位 操 数 的 前 缀,表 示 对 该 位 操 作数取反 。 如 /bit.
(15)$:正在执行的指令的地址 。
(16)(× ),× 中的内容 。
(17)((× )),由 × 指出的地址单元中的内容 。
指令字节数判断操作码 目的操作数,源操作数
1,操作数都在 Rn( n=0-7),A,B,DPTR,Cy,@Ri、
@A+DPTR,@A+PC范围中,是单字节指令。
2、两操作数中有一个在此范围,指令字节数需根据另一操作数来判断,如是 8位的地址或立即数则是双字节指令;如是 16位的地址或立即数则是三字节指令。
3、操作数都不在此范围,则肯定是三字节指令
1 寄存器寻址
2 直接寻址
3 立即寻址
4 寄存器间接寻址
5 变址寻址
6 相对寻址
7 位寻址二、寻址方式
MCS-51的指令系统共用了七种寻址方式。
声明,寻址包括目的操作数寻址和源操作数寻址,
如无特别说明,指的是源操作数寻址!!
1 寄存器寻址以 寄存器的内容 为 操作数 的寻址方式可进行寄存器寻址的寄存器有:工作寄存器 R0~R7,A,B,DPTR和进位 CY。
11100rrr
…
…
ROM
操作码PC→
PSW RS0RS1
10
11100101
11111111
…
…
片内 RAM
00Hrrr=010B(R2)
0AH
MOV A,R0 ;A R0
例如,
R0(35H) A 结果 A=35H
35H
FF
E0(A)
80
用户 RAM区位寻址区工作寄存器区
7F
30
20
00
此条指令属单字节指令吗?
此时 PSW寄存器中 RS1,RS0位的值是多少?
直接寻址指令的指令码中所给出的操作数是:
片内 RAM单元的地址,地址中放着被操作的数 。
2 直接寻址例,MOV A,40H ; A ( 40H)
机器码,E5 40
11100101
01000000
…
…
ROM
操作码直接地址
PC→
PC+ 1→
11100101
11111111
…
…
片内 RAM
40H
11111111 A
直接寻址可访问片内 128B的 RAM单元和特殊功能寄存器 SFR。
对于 特殊功能寄存器 (除开 A,B,DPTR)
既可以使用它们的地址,也可使用它们的名称。
如,MOV A,P2; P2←A
MOV A,0A0H; P2的地址为 0A0H
注意,Rn,A,B,DPTR一般不会用作直接寻址!
说明指令码中直接含有所需的操作数,操作数之前加,#”符号为前缀。以区别直接地址。使用时一定要注意!
3 立即寻址特点
源操作数为立即数(即操作数本身)
注,51系列单片机有 8 位立即数和 16 位地址立即数,立即数不能作目的操作数。
寻址范围:程序寄存器注:操作码下一单元。
例,MOV A,#20H
MOV DPTR,#2000H
01110100
00100000
…
…
ROM
操作码立即数
PC→
PC+ 1→
10010000
00100000
…
…
ROM
操作码立即数高 8位
PC→
PC+ 1→
00000000PC+ 2→ 立即数低 8位功能,( 1) 将片内 RAM中 44H单元的内容送累加器 A,属于直接寻址;
( 2) 则是把 44H这个数本身送到累加器 A,属于立即寻址。
( 1) MOV A,44H ;A (44H)
( 2) MOV A,#44H ;A 44H
例
4 寄存器间接寻址指令指定寄存器中的内容为操作数的地址。
工作寄存器 R0,R1和专用寄存器 DPTR可用于间接寻址,在寄存器前加,@”符号作前缀。
工作寄存器 R2-R7不能用于间接寻址!
① MOV A,R0 ;A←(R 0)
② MOV A,@ R0;A←((R 0))
例如:
(R0)= 65H,(65H)= 26H
如图 3.2所示,
执行 ① 结果 A= 65H,
执行 ② 结果 A= 26H。
注意:,@,是它区别寄存器寻址的标志 。
A
R0 65H
①
②
例
65H26H
65H 26H
片内
RAM
( 1) @R0,@R1可寻址内部 RAM 00H - 7FH
共 128B单元内容,不能寻址特殊功能寄存器。
MOV A,@R0
MOV A,@R1
说明
( 2) @ R0,@ R1可寻址外部 RAM 00 ~ FFH
共 256B单元内容。
MOVX A,@R0
MOVX A,@R1
( 3) @ DPTR寻址外部数据存储器的 64KB空间
MOVX A,@DPTR ; A?(DPTR)
MOVX @DPTR,A ; (DPTR)?A
5 变址寻址以 DPTR和 PC基址寄存器 和累加器 A变址寄存器的 内容和 为 地址,寻址该地址单元,读取数据
A
06H
A L U
(1)MOVC A,@ A+ DPTR ; A← ( A+ DPTR)
20 00H
DPTR 程序存储器
34H
× ×
…….
…….
2006H
2006H
(2)MOVC A,@ A+ PC ; A ← ( A+ PC)
执行第二条指令时先取指,将 该指令取完后的 PC值 和 累加器 A中的偏移量 相加,作为操作数地址,从该地址中取出操作数送入 A中 。
第二条过程与第一条指令类似,
A
06H
←PC+1=2006H
A L U
20 06H
PC
200CH
←PC=2005H
程序存储器
34H
…….
…….
83H
…….
200CH
34H
说明
寻址范围,64KB程序存储器
变址 + 基址形成的 ROM地址中的值为操作数
基址寄存器 DPTR —— 16 位数据指针
PC —— 16 位程序指针
变址寄存器 A —— 8 位累加器
(1)MOVC A,@ A+ DPTR ; A← ( A+ DPTR)
(2)MOVC A,@ A+ PC ; A ← ( A+ PC)
6 相对寻址相对寻址只出现在 相对转移指令 中 。 相对转移指令执行时,以 PC当前值 加上 偏移量 rel得 转移地址目的地址=源地址+ 2+ rel
源地址,转移指令操作码所在的地址目的地址,转移后的地址
2:相对转移指令字节数
PC当前值,执行完相对转移指令后的 PC值
PC当前值
A
26H
PC
02H20H
A L U
程序存储器
0000H
2000H
2001H
80H
26H
× ×
× ×2028H
2002H ┆
SJMP rel ; PC← PC+2+rel
2000,80 26H
例
2028H
目的地址由 CPU把目的地址送入 PC
寻址空间:程序存储器
偏移量 rel的范围是,–128 ~ +127
转移公式:
PC目的地址 = PC当前地址 + rel
说明在实际程序编译时,经常需要根据已知的源地址和目的地址计算偏移量 rel!!
rel=(目的地址-(源地址+ 2)) 补
= FFH- (源地址+ 2-目的地址 )+ 1
= 100H- (源地址+ 2-目的地址 )
= FEH- |目的地址-源地址 |
= FEH - |地址差 |
是负数时
7 位寻址进行位操作时,位累加器 C即为进位标志 CY,
位操作的操作数的地址就称为位地址,对位地址寻址简称位寻址 。
MOV C,30H ; 30H是位寻址位地址
MOV A,30H ; 30H是直接寻址的字节地址
JB 30H,rel ;如果 30H位是 1,则相对偏移 rel
由上面指令可知,位寻址的位地址与直接寻址的字节地址形式完全一样,由操作指令区分,使用时需应该特别注意 。
说明位寻址仅对片内 RAM的部分区域有效
片内低 128BRAM区字节地址为 20H ~ 2FH,16 Byte单元共有 128 bit 位
片内专用 RAM区(特殊功能寄存器)
字节地址能被 8 整除的特殊功能寄存器单元说明位地址表示,
直接使用位地址。对于 20H~2FH的 16个单元共
128位的位地址分布是 00H~7FH。
对于特殊功能寄存器
1) 用位地址 MOV C D0H
2)用 SFR.n的形式 MOV C PSW.0
3)用位名称 MOV C P
序号 寻址方式 寻址空间
1 寄存器寻址 寄存器 R0~ R7,A,B,DPTR,C
2 直接寻址 内部 RAM低 128B,SFR
3 寄存器间接寻址内部 RAM低 128B、外部 RAM
寄存器只能是 @R0,@R1,@DPTR
4 立即寻址 程序存储 ROM
5 变址寻址 程序存储器 ( @A+DPTR,@A+PC)
6 相对寻址 程序存储器 ROM( PC+rel(- 128~
127) )
7 位寻址 内部 RAM的 20H~ 2FH单元和部分 SFR
寻址方式小节
MOV 30H,R7
MOV A,55H
MOV A,# 55H
JMP @A+DPTR
MOV 30H,C
MOV A,@R0
MOVX A,@R0
练习一答案:寄存器寻址方式直接寻址方式立即寻址方式变址寻址方式位寻址方式间接寻址方式间接寻址方式说明下列指令中源操作数采用的寻址方式。
MCS-51单片机的指令可以分为五类:
1.指令分类
2)算术运算指令
4)控制程序转移指令
3)逻辑运算指令
1)数据传送指令
5)位操作指令
3.3 89C51单片机的指令系统数据传送指令是计算机中最基本、应用最广泛的指令类型。 MCS-51单片机有 四类 29 条 数据传送指令。
内部数据传送指令( 15条)
外部数据传送指令( 7条)
数据交换指令( 5条)
堆栈操作指令( 2条)
1 数据传送指令指令格式,MOV <dest>,<src>
注,<src>为源操作数,<dest>为目的操作数指令功能:将源操作数送到目的操作数单元,且源操作数单元中的源操作数不变。
内部数据传送指令累加器 A 寻址
@Ri 间接寻址direct 直接寻址
Rn 工作寄存器寻址 #data 立即数寻址
MOV A,Rn
MOV A,direct
MOV A,@Ri
MOV A,#data
MOV Rn,A
MOV Rn,direct
MOV Rn,#data
MOV direct,A
MOV direct,Rn
MOV direct1,direct2
MOV direct,@Ri
MOV direct,#data
MOV @Ri,A
MOV @Ri,direct
MOV @Ri,#data
在以上的传送指令中:
两操作数中有一个是累加器 A的肯定是单机器周期指令两操作数中无累加器 A但有立即数的,如目的操作数为直接寻址方式是双机器周期指令;其它的为单机器周期指令两操作数中无累加器 A,也无立即数的,肯定是双机器周期指令指令的机器周期数已知,R1=30H,R2=31H,(56H)=23H,
试问执行以下指令后,结果各是什么?
MOV A,R1
MOV R2,A
MOV 56H,R1
结果为,A= R2= (56H)=
例
30H 30H 30H
已知,(30H)=12H,(31H)=13H,R0=30H、
R1=31H,试问执行以下指令后 A,30H、
31H和 32H各是什么?
MOV A,@R0 ;
MOV @R1,A ;
MOV @R0,#34H ;
MOV 32H,@R1 ;
例
A←((R0)) =12H
((R1)) ←A=12H,(31H)=12H
((R0))←34H,(30H)=34H
(32H) ←((R1))=12H
结果为,A=12H,(30H)=34H,
(31H)=12H,(32H)=12H
MOV R0,R1
MOV @R1,R7
MOV @R0,@R1
MOV A,R1
MOV R0,A
MOV A,R7
MOV @R1,A
MOV R6,@R0 MOV A,@R0MOV R6,A
MOV A,@R1
MOV @R0,A
练习 判断下列指令的正误,将错误的更正,
更正更正更正更正应用举例 1
MOV P1,#0FEH ; 11111110B
可以使 P1.0上的发光二极管点亮
MOV P1,#0F0H ; 11110000B
可以使 P1口上的上面 4个发光二极管点亮
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
5v
8段数码管显示
MOV P1,#00H ;
MOV P1,#0F8H ;
MOV P1,#88H ;
P1.0 a
P1.1 b
P1.2 c
P1.3 d
P1.4 e
P1.5 f
P1.6 g
P1.7
dp
5v
显示 8.
显示 7
显示 A
MOV DPTR,#data16; DPTR ← ROM,外部 RAM的
16 位地址值
16位数据传送指令( 1 条)
例,MOV DPTR,#2030H
ROM
90
20
30
片内 RAM
00H
7FH
80H81H
82H(DPH)83H(DPL)
双机器周期指令
访问 ROM 存储器的指令(查表)( 2 条)
MOVC A,@A + DPTR; A ← ( A+DPTR) 数据指针
MOVC A,@A + PC; PC ← PC + 1,A ← ( A+PC) 程序指针注,PC 不能随便改变,称为近程查表
DPTR 可随时赋值,称远程查表故 @A+DPTR 比 @A+PC 更常用为两机器周期指令例,CLR A
MOV DPTR,#2030H
MOVC A,@A + DPTR
2030H
00H
7FH
80H
81H
82H(DPH)
83H(DPL)
片内 RAM
E0H(A)
……
20
30
AA
ROM
30
20
AA
90PC→
93 PC+3→
00H
7FH
80H
81H
82H
83H
片内 RAM
E0H(A)
ROM
2000H 74
2001H 05
2002H 83
2003H
2008H AAAA
例,MOV A,#05H
MOVC A,@A + PC
05
AA
已知,1000H,MOV A,#10H ; A = 10H
1002H,MOVC A,@A+PC
ROM表项
1010H,02H
1011H,04H
1012H,06H
1013H,08H
A ← ( A+PC),A = 08H
结果取指后 PC = 1003H,A + PC = 1013H
注,能够查表的地址范围为:
1003H ∽ 1003H + FFH
例已知,片外 ROM的 2008H单元中有一数 34H,
试用两条外部 ROM数据传送指令各编写一个程序,
把数送到片内 RAM的 7FH单元 。
解,① 采用 DPTR作为基址寄存器,基址可定为
2000H,地址偏移量则为 08H,程序如下:
MOV DPTR,# 2000H ; DPTR← 2000H
MOV A,# 08H ; A← 08H
MOVC A,@ A+ DPTR ; A← 34H
MOV 7FH,A ; ( 7FH) ← A
例
#2007H
#01
② 采用 PC作为基址寄存器,程序如下:
ORG 2000H
START,MOV A,# 05H ; A← 05H
MOVC A,@ A+ PC ; A← 34H
MOV 7FH,A ; ( 7FH) ← A
2008H 34
2000H 74
2001H
2002H 83
2003H
05
ROM
ACC
0534 05是怎么确定的?
8段数码管显示
0,C0H 1,F9H P1.0 a
P1.1 b
P1.2 c
P1.3 d
P1.4 e
P1.5 f
P1.6 g
P1.7
dp
5v
2,ABH 3,B0H
4,99H 5,92H
6,82H 7,F8H
8,80H 9,90H
2000H,
C0H F9H ABH B0H 99H
92H 82H F8H 80H 90H
MOV DPTR,#2000H
MOV A,# 05H
MOVC A,@ A+ DPTR
MOV P1,A
c
a
g
e
外部 RAM 传送指令( 4 条)(双机器周期)
MOVX A,@Ri ;外部 RAM的 00H ~ FFH单元读
MOVX @Ri,A ;外部 RAM的 00H ~ FFH单元写
MOVX A,@DPTR ;外部 RAM的 64K单元读
MOVX @DPTR,A ;外部 RAM的 64K单元写注,MOVC 指令仅 读 操作,MOVX 指令可 读写 操作访问外部存储器仅用间址,不用直接地址累加器 A
寄存器间接寻址
@R1,@R0
(片外 0- 255B)
寄存器间接寻址
@DPTR
(片外 0- 64KB)
已知外部 RAM的 60H单元中有一个数为 30H,
试编程把 30H送到片外 RAM的 2000H单元中。
例解,MOV R1,#60H ;R1=60H
MOVX A,@R1 ;A=30H
MOV DPTR,#2000H ;DPTR=2000H
MOVX @DPTR,A ;2000H←30H
分析:上面虽都是片外 RAM的地址单元,但不能直接传送,必须经过累加器 A的转送,才能实现。
MOVX A,2000H
MOVX A,20H
错误
MOV DPTR,#2000H
MOVX A,@DPTR
错误
MOV R0,#20H
MOVX A,@R0
练习 判断下列指令的正误,将错误的更正,
访问外部 RAM指令
字节 数据交换指令 —— XCH
XCH A,Rn ; A? (Rn)
XCH A,direct ; A? ( direct)
XCH A,@Ri ; A?((Ri))
数据交换指令(单机器周期)
低 4 位数据交换指令 —— XCHD
累加器 A 中高低 4 位 交换 指令 —— SWAP
XCHD A,@Ri ; A0~3? ( Ri) 0~3
SWAP A ; A0~3? A 4~7
注:交换指令均与累加器 A 有关 !!!
已知,片内 20H单元有一个数为 30H,片外 20H单元有一个数为 03H,编程把二个数相互交换。
例解,MOV R0,#20H ; R0←20H
MOVX A,@R0 ; A←03H
XCH A,20H; A←30H,20H←03H
MOVX @R0,A ; 30H→20H (外部 RAM)
分析:片内、片外没有直接的交换指令,必须经过累加器 A的中转,才能实现。
@R0
堆栈操作的规则,先进后出,后进先出。
PUSH direct; SP ← SP + 1,( SP) ← ( direct)
POP direct;( direct ) ← ( SP),SP ← SP – 1
堆栈操作指令( 2机器周期)
例 已知,(20H)=M1、( 50H) =M2、编写程序用堆栈指令把 20H和 50H单元中的内容相交换。
解:由堆栈所具备的原则,程序为:
MOV SP,#60H ;设置栈底首址为 60H
PUSH 20H ; SP←SP+1,61 ←M1
PUSH 50H ; SP←SP+1,62 ←M2
POP 20H ; (20H)←M2,SP ← SP -1= 61H
POP 50H ; (50H)←M1,SP ← SP -1= 60H
加法指令( 13条):
减法指令( 8条):
十进制调整指令( 1条):
乘法和除法指令( 2条):
ADD,ADDC,INC
SUBB,DEC
DA
MUL,DIV
2 算术运算指令注意指令对 PSW中标志位的影响!!
不带 Cy加法指令( 4条):
ADD A,Rn ; A ← A + Rn
ADD A,direct ; A ← A + ( direct)
ADD A,@Ri ; A ← A + ( Ri)
ADD A,#data ; A ← A + data
注:指令的目的操作数为累加器 A 执行指令后将影响标志位
Cy,AC,OV及 P。
(都属单字节指令)
试分析执行如下指令后,累加器 A和 PSW
中各标志位的变化情况如何?
MOV A,#5AH
ADD A,#6BH
解:第一条指令先向累加器 A传送一个数
5AH,第二条为加法指令,在此 机器执行加法指令时按带符号数运算 。
例竖式表示如下图:
执行结果,A=5A+6B=C5H,PSW=44H
0 1 0 0 0 1 0 0
Cy AC F0 RS1 RS0 OV - P
5A+6B
=?
A= 0 1 0 1 1 0 1 0 B
data= 0 1 1 0 1 0 1 1 B107
1 1 1 0 0 0 1 0 1 B
90
+ )
197
1
AC
0
0
CPC7
1
C6
例 MOV A,#5AHADD A,#6BH
执行结果,A=78+9A=12H,PSW=C0H
1 1 0 0 0 0 0 0
Cy AC F0 RS1 RS0 OV - P
78+9A
=?
A= 0 1 1 1 1 0 0 0 B
data= 1 0 0 1 1 0 1 0 B154
1 0 0 0 1 0 0 1 0 B
120
+ )
274
1
AC
1
CPC7
1
C6
例 MOV A,#78HADD A,#9AH(无符号数相加)
带 Cy加法指令( 4条):
ADDC A,Rn ; A ← A + (Rn) + Cy
ADDC A,#data ; A ← A + data + Cy
ADDC A,direct ; A ← A +(direct) + Cy
ADDC A,@Ri ; A ← A +((Ri)) + Cy
注:若 Cy = 0,
则 ADD 相当于
ADDC
注:指令的目的操作数为累加器 A 执行指令后将影响标志位
Cy,AC,OV及 P。
(都属单字节指令)
练习已知,A= 7DH,R0= 30H,(30H)= 35H、
(31H)= 0DCH和 Cy= 1,试问 CPU执行以下的每条指令后累加器 A和 Cy中的值是多少。
a.ADDC A,R0 b.ADDC A,31H
解:操作结果应为:
a,A=7D+30+1=0AEH,Cy=0
b.A=7D+DC+1=5AH,Cy=1
练习编写程序,进行两个 16位数的加法:
6F5DH+13B4H,结果从低位到高位依次存入内部 RAM的 30H,31H和 32H单元。
MOV A,#5DH
ADD A,#0B4H ;Cy= 1
MOV 30H,A
MOV A,#6FH
ADDC A,#13H ;Cy=0
MOV 31H,A
MOV 32H,#00H
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
加 1指令( 5条):
加 1指令中,只有,INC A” 这一条影响奇偶标志位,其余均不影响任何标志位。
,INC DPTR” 对 DPTR中内容加 1,是唯一的一条 16位算术运算指令。也是加 1指令中唯一的一条 2机器周期指令。
注意例已知,A= 34H,R0= 42H、( 43H)= 23H、
DPTR= 3020H,试问 CPU依次执行如下程序后 A、
R4,43H,R0,DPTR及 PSW中的内容各是什么?
INC A
INC R0
INC 43H
INC @R0
INC DPTR
解:由加 1指令的规则,上述指令执行后的结果为:
A= 35H,R0= 43H,43H= 25H,DPTR= 3021H。
由于,加 1指令在程序中频繁地出现,常用来修改地址和数据指针加 1处理 。
练习编写程序,进行两个 16位数的加法:
6F5DH+13B4H,结果从低位到高位依次存入内部 RAM的 30H,31H和 32H单元,要求用寄存器间接寻址的方式存入。
MOV A,#5DH
ADD A,#0B4H ;Cy= 1
MOV R0,#30H
MOV @R0,A
MOV A,#6FH
ADDC A,#13H ;Cy=0
INC R0
MOV @R0,A
INC R0
MOV @R0,#00H
带借位 Cy减法指令( 4条):
SUBB A,Rn ; A ← A – Rn- Cy
SUBB A,#data ; A ← A - data - Cy
SUBB A,direct ; A ← A -(direct) - Cy
SUBB A,@Ri ; A ← A – ((Ri)) - Cy
注意:
1、指令的目的操作数为累加器 A
执行指令后将影响标志位 Cy,AC,OV及 P。
2,MCS-51仅有带借位的减法指令,
若要使用不带借位的减法指令,则令 Cy = 0。
(都属单字节指令)
0000011
Cy AC F0 RS1 RS0 OV ━
1
P
例
0111 1111
试分析执行下列指令后,累加器 A和 PSW中各标志位状态?
CLR C
MOV A,#35H
SUBB A,#0B6H
解,A = 0011 0101
-) 1011 0110
结果为,A=35-B6=7FH,Cy =1,PSW为:
DEC A ;A←A -1
DEC Rn ;Rn←(Rn) -1
DEC direct ;direct←(direct) -1
DEC @Ri ;(Ri)←((Ri)) -1
减 1指令( 4条):
注减 1指令与加 1指令相似,只有以 A为操作数的指令才影响 PSW的 P位。
(都属单字节指令)
已知,A= 10H,R1= 3BH,R7= 34H、
(60H)= 00H,(3BH)= 0FFH,试分析,执行如下每条指令后累加器 A和 PSW中各标志位状态?
① DEC A ② DEC @R1
③ DEC 60H ④ DEC R7
解:根据减 1指令功能,结果为:
① A= 0FH,P=0
② (3B)= 0FEH,PSW不变
③ (60H)= 0FFH,PSW不变
④ R7=33H,PSW不变列十进制调整指令( 1条)
1,BCD加法 DA A
对 A中 两个压缩 BCD数相加之 和 调整为 2位 BCD码数
1)对压缩 BCD码数进行 ADD或 ADDC操作后使用
2)影响标志位,Cy,AC,P;不影响 OV。; A ← A +
06H
60H
66H
试编程实现 44H+ 86H的 BCD加法程序,
并对其工作原理分析。
程序 CLR C
MOV A,# 44H ;A←44H
ADD A,# 86H ;A←44 + 86= 0CAH
DA A ;A←30H,Cy = 1,AC= 1
A= 0 1 0 0 0 1 0 0 B44
data=1 0 0 0 0 1 1 0 B86+ )
0 1 1 0 1 0 0 0 0 B
0 1 1 0
1 0 0 1 1 0 0 0 0 B
0 1 1 0 0 1 0 1 0 B130
0 1 1 0 B
低 4位> 9,
加 6调整高 4位> 9,
加 6调整
BCD加法过程
1 1 - - - - - 0
Cy AC F0 RS1 RS0 OV - P
BCD减法
MCS- 51单片机中没有十进制减法调整指令,因此,这里的 BCD减法运算必须采用 BCD
补码运算法则。
例已知,30H和 31H中分别存有被减数 80和减数
25,试编程求差,并把结果存入 32H单元中。
解:根据 BCD减法的实施步骤,程序如下:
思路:
因为没有 BCD码的减法调整指令,
将减法运算转化为加法运算。
80-25=55
80+(-25)补码 =80+( 100-25) =80+75=155
执行加法运算
80H+75H=F5H
运行 BCD码调整指令
F5+60=155
其中 1进至 Cy,A=55
ORG 0100H
CLR C ;清 Cy
MOV A,# 9AH ;A←BCD 模 100
SUBB A,31H ;A←BCD 减数的补数
ADD A,30H ;A← 被减数+减数的补数
DA A ;对 A进行加法调整
MOV 32H,A ;存入 M3 M3←BCD 差
CLR C ;清 Cy
SJMP $ ;停止
80-25=?
BCD被减数
1 1 1 1 0 1 0 1 B
1 0 1 0 1 0 1 0 1 B
0 1 1 1 0 1 0 1 B 减数的补数两位 BCD数的模 100
BCD减数
BCD减法过程
1 0 0 1 1 0 1 0 B100
0 0 1 0 0 1 0 1 B25
+ 1 0 0 0 0 0 0 0 B80
加 60调整 BCD差0 1 1 0+ 60
55
指令格式,MUL AB ; A× B =B高 8A低 8
指令功能,寄存器 A,B中两个 8 位数相乘,
结果为 16 位数据,其中高 8 位放在寄存器 B中,
低 8 位放寄存器 A中。
专用寄存器,寄存器 B 和累加器 A
乘法指令
标志位 Cy,OV,P 讨论:
执行乘法指令后 Cy = 0
若积为 8 位(即 B = 0),则 OV = 0
若积为 16 位(即 B ≠ 0),则 OV = 1
根据累加器 A 确定奇偶标志 P
已知:有两个 8位无符号乘数分别放在 20H
和 21H单元中,试编写程序把乘积的低 8位放入 22H单元中,积的高 8位放入 23H单元中 。
例分析:这是一个乘法问题,可用 MUL AB指令。
其操作数分布在相邻四个单元,采用间址寻址方式较为方便。
ORG 1000H
MOV R1,#20H ; R1← 第一个乘数地址
MOV A,@R1 ; A← 第一个乘数
INC R1 ; 修改乘数地址
MOV B,@R1 ; B← 第二个乘数地址
MUL AB ; A*B=BA
INC R1 ; 修改目标单元地址
MOV @R1,A ; 22H← 积的低 8位
INC R1 ; 修改目标单元地址
MOV @R1,B ; 23H← 积的高 8位
指令格式,DIV AB ; A÷ B =A整数商 B余数
指令功能:两无符号数相除,被除数 A 除以除数 B,整商存 A中,余数存 B 中。
专用寄存器,寄存器 B 和累加器 A
除法指令
标志位 Cy,OV,P 讨论:
执行除法指令后 Cy = 0
若除数 B = 0,则 OV = 1
若除数 B ≠ 0,则 OV = 0
根据累加器 A 确定奇偶标志 P
逻辑与运算指令( 6条):
逻辑或运算指令( 6条):
逻辑异或指令( 6条):
累加器清零和取反指令( 2条):
ANL
ORL
XRL
CLR,CPL
逻辑操作指令累加器 A
ANL,ORL,XRL
直接地址单元
ANL
ORL
XRL
R0- R7寄存器寄存器间接寻址 @R1,@R0
立即数
(# DATA)
有 A参与的逻辑操作都是单机器周期,其余为双机器周期
ANL A,Rn
ANL A,@Ri
ANL A,direct
ANL A,#data
ANL direct,A
ANL direct,#data;A A ∩ Rn;A A ∩ (Ri);A A ∩ direct;A A ∩ #data;direct direct ∩ A;direct direct ∩ #data
逻辑 与 指令将两个指定的操作数按位进行“与”,
“与” 运算:有 0出 0,全 1为 1。
例
② A=0FH,
( 20H) =0AEH
A = 0000 1111
∧ ) ( 20H) = 1010 1110
0000 1110
已知,R0=20H、( 20H) =0AEH,试问分别执行如下指令后,累加器 A和 20H单元中内容各是什么?
① MOV A,#20H ② MOV A,#0FH
ANL A,R0 ANL A,20H
解:根据逻辑乘指令功能,上述指令执行后的结果为:
① A=20H,
( R0) =20H
A = 0010 0000
∧ ) R0 = 0010 0000
0010 0000
A=20H A=0EH
已知,M1,M2皆为 8位的二进制数,若 M1?M2=M1,则 M2=?请思考 0FFH或 M1
ORL A,Rn ;A←A ∪ Rn
ORL A,direct ;A←A ∪ direct
ORL A,@Ri ;A←A ∪ (Ri)
ORL A,#data ;A←A ∪ data
ORL direct,A ;direct←(direct) ∪ A
ORL direct,#data ;direct←(direct) ∪ data
逻辑 或 指令将两个指定的操作数按位进行“或”,
“或” 运算:有 1出 1,全 0为 0。
已知,M1,M2皆为 8位的二进制数,若 M1+ M2=M1,则 M2=?请思考例
② A=0FH,
( 20H) =0AEH
A = 0000 1111
∪ ) ( 20H) = 1010 1110
1010 1111
已知,R0=20H、( 20H) =0AEH,试问分别执行如下指令后,累加器 A和 20H单元中内容各是什么?
① MOV A,#20H ② MOV A,#0FH
ORL A,R0 ORL A,20H
解:根据或逻辑指令功能,上述指令执行后的结果为:
① A=20H,
( R0) =20H
A = 0010 0000
∪ ) R0 = 0010 0000
0010 0000
A=20H A=0AFH
00H或 M1
已知,A= 0AAH和 P2= 0FFH,编程把累加器
A中低 4位送入 P2口低 4位,P2口高 4位不变 。
解:程序思路为:根据逻辑与,逻辑或两类指令的特性来实现
ORG 0030H
ANL A,# 0FH ;屏蔽 A中的高 4位,低 4位不变
ANL P2,# 0F0H ;屏蔽 P2中的低 4位,高 4位不变
ORL P2,A ;装配数据,结果送 P2
例
XRL A,Rn ;A←A ⊕ Rn
XRL A,direct ;A←A ⊕ (direct)
XRL A,@Ri ;A←A ⊕ (Ri)
XRL A,#data ;A←A ⊕ data
XRL direct,A ;direct←(direct) ⊕ A
XRL direct,#data ;direct(direct)⊕ data
逻辑 异或 指令将两个指定的操作数按位进行“异或”,
“异或” 运算:相异为 1,相同为 0。
例
② A=0FH,
( 20H) =0AEH
A = 0000 1111
⊕ ) ( 20H) = 1010 1110
1010 0001
已知,R0=20H、( 20H) =0AEH,试问分别执行如下指令后,累加器 A和 20H单元中内容各是什么?
① MOV A,#20H ② MOV A,#0FH
XRL A,R0 XRL A,20H
解:根据异或逻辑指令功能,上述指令执行后的结果为:
① A=20H,
( R0) =20H
A = 0010 0000
⊕ ) R0 = 0010 0000
0000 0000
已知,M1,M2皆为 8位的二进制数,若 M1+ M2=M1,则 M2=?请思考 00H
A=00H A=0F1H
已知:外部 RAM0040H中有一数 BBH,假定高 4位不变和低 4位取反,试编出它的相应程序 。
解:利用 MOVX A,@DPTR类指令
ORG 0300H
MOV DPTR,#0040H ;地址送指针 DPTR
MOVX A,@DPTR ; A←BBH
XRL A,#0FH ; A←BBH ⊕ 0FH=B4H
MOVX @DPTR,A ;结果送回 30H单元例
位清 0 —— 逻辑与
位置 1 —— 逻辑或
位取反及恢复 —— 逻辑异或
ANL A,#0F0H ; A 中低 4 位清 0,高 4 位不 变
ORL A,#0F0H ; A 中高 4 位置 1,低 4 位不变
XRL A,#0FFH ; A 中各位取反
XRL A,#0FFH ; A 中各位恢 复应用小结
累加器清零指令( 1 条 )
CLR A ; A ← 0
取反指令( 1 条 )
CPL A ; A←/A
清零取反指令
+ 5V
89C51
P1.3
K1
P1.2
P1.1
P1.0 K2
K3
K4
MOV P1,#0FFH
MOV A,P1
ANL A,#0FH
针对以下的独立式键盘电路原理图试编写一段程序确定是否有键按下
CP
ANL A,#0FH
用指令实现逻辑电路
逻辑式编程
电路逻辑式 F = ( X·Y) +( Y⊕ Z)
注,X,Y,Z,F 为直接地址
MOV A,X ;符号地址 X 中的数送 A
ANL A,Y ;符号地址 X,Y 中的数与后送 A
MOV R0,A ; R0 中暂存 X· Y 的结果
MOV A,Y
XRL A,Z ; A 中存 Y⊕Z 的结果
CPL A ; A中存 /(Y⊕Z) 的结果
ORL A,R0 ; A中存 (X·Y) +/(Y⊕Z) 的结果
MOV F,A ;结果存入符号地址 F 中例
RL A ;
RR A ;
Cy A7 A0
A
Cy A7 A0
A
RLC A ;
RRC A ;
移位指令
A
A7 A0
A
A7 A0
已知,A=9AH,且 Cy=1,求运行下列指令后,A=?
(1)RL A (2)RR A
(3)RLC A (4)RRC A
解,A=10011010
(1)A= 0011010 1
(2)A= 0 1001101
(3)A= 0011010 1 Cy=1
(4)A=1 1001101 Cy=0
例已知,M和 M+ 1单元中有一个 16位二进制数
( M为低 8位),编程将其扩大到二倍。
解:一个 16位二进制数扩大到二倍就等于是把它进行一次算术左移。由于 MCS- 51单片机的移位指令都是二进制 8位的移位指令,因此 16位数的移位指令必须用程序来实现。
算法为:
MM+1
0
例程序为:
ORG 0030H
CLR C ;清进位标志位
MOV R0,# M ;操作数低 8位地址送 R0
MOV A,@ R0 ;A← 操作数低 8位
RLC A ;低 8位操作数左移低位补 0
MOV @ R0,A ;结果送回 M单元,Cy中为最高位
INC R0 ;R0指向 M+ 1单元
MOV A,@ R0 ;A← 操作数高 8位
RLC A ;高 8位操作数左移并加上低位 Cy
MOV @R0,A ;结果送回 M+ 1单元
INC R0
MOV @R0,#00H/#01H ;进位位存入 M+ 2单元
1)长转移指令
LJMP addr16 ;PC←addr16
2)短转移指令
AJMP addr11 ;PC←PC+2,PC10 —0←addr11
3)相对转移指令
SJMP rel ;PC←PC+2,PC←PC+rel
4)间接转移指令
JMP @A+DPTR ;PC←A+DPTR
1,无条件转移指令 (4条 )
3 控制程序转移指令一页,256个地址单元一区,8页,共 2KB地址单元;地址高 5位决定区。
64K,32区,256页。
地址的前 8位相同地址的前 5位相同几个概念“
F800H~FFFFHF000H~F7FFHE800H~EFFFHE000H~E7FFH
D800H~DFFFHD000H~D7FFHC800H~CFFFHC000H~C7FFH
B800H~BFFFHB000H~B7FFHA800H~AFFFHA000H~A7FFH
9800H~9FFFH9000H~97FFH8800H~8FFFH8000H~87FFH
7800H~7FFFH7000H~77FFH6800H~6FFFH6000H~67FFH
5800H~5FFFH5000H~57FFH4800H~4FFFH4000H~47FFH
3800H~3FFFH3000H~37FFH2800H~2FFFH2000H~27FFH
1800H~1FFFH1000H~17FFH0800H~0FFFH0000H~07FFH
程序存储器 64K地址空间
64K地址空间分为 32个区,256个页
① 长转移指令三字节指令,不影响标志位,可在 64KB地址范围内无条件转移。
LJMP addr16 ; PC addr16
例
0000H,LJMP 2000H
0000H 02 20 00
PC0000 02
0001 20
0002 00
0003
2000 02
2001 00
2002 00
2003
程序存储器
FFFF
……..
64KB
寻址范围
② 短转移指令二字节指令,可在 2KB
地址范围内转移。
AJMP addr11 ; PC PC+2
PC15-11不变
PC10-0 addr11
PC
2KB
寻址范围寻址范围在 PC+ 2
所在的区内
2031H,AJMP addr11
例程序存储器
FFFF
……..
……..0000
a10 a9 a8 0 0 0 0 1
a0- a7
……..
……..
2031
2000
27FF
特征码
PC15 PC14 PC12PC13 PC11 a10 a8a9 a7 a6 a4a5 a3 a2 a0a1
转移地址:
a10 a9 0a8 0 0 10 a7 a6 a4a5 a3 a2 a0a1
机器码:
若 PC的当前地址为 2802H
addr11=16AH
转移地址,296AH
0 0 01 1 0 10 0 1 01 1 0 01
机器码,216AH
0 0 01 0 0 10 0 1 01 1 0 01
练习
(00101000 0000 0010B)
(001 0110 1010B)
讨论 AJMP指令的转移范围:
PC15 PC14 PC12PC13 PC11 0 00 0 0 00 0 0 00
最小地址:
PC15 PC14 PC12PC13 PC11 1 11 1 1 11 1 1 11
最大地址:
AJMP指令可在 2KB地址范围转移思考若 PC+2=3FFF,则执行 AJMP的转移范围为:
3800H ∽ 3FFFH
③ 相对转移指令机器码,80H
rel
本指令是一条双字节双周期指令,在 PC内容加 2所指地址上,以 rel,-128∽+127 为偏移量,在一页地址 (-128∽+127) 范围内实现短转移。
SJMP rel ; PC PC+2+rel
rel是一个带符号数,00H- 7FH对应 0~ 127;
80H- FFH对应- 128~- 1
在实际使用时,rel用一个转移目标地址标号来表示。
在编译时计算 rel的实际偏移值
ORG 1000H
1000H 74 01H START,MOV A,#01H;字位码初值送 A
1002H F8H MOV R0,A ;暂存于 R0
1003H 90 CF 01H LOOP,MOV DPTR,#0CF01H ;端口地址; CF01送 DPTR
┋
1017H 80rel SJMP START ;转入 START
┋
SJMP $ ;停止例 下列程序中,请计算 SJMP START指令码中的 rel,并分析目标地址的转移范围 。
地址偏移量 rel的计算:
PC目的地址 = PC当前地址 + rel
rel=PC目的地址 - PC当前地址
= 1000H-( 1017H+2)=- 19H
rel应采用补码表示,为此
rel=[-19H]补 = [1001 1001]补 =E7H
解,SJMP指令中地址偏移量是采用 START符号表示的,指明指令执行后转入本程序开头重新执行 。
PC
0FFF
1000 74H
1001 01H
1002 F8H
1017 80H
1018 rel
1019
1017H,SJMP START;
START=1000H; rel=E7
E7H
跳转范围:
0F99H- 1098H
练习 已知,SZ,SJMP LOOP
其中 SZ=126FH,LOOP=1200H
请计算偏移量 rel=?
解,PC目的地址 =1200H
PC当前地址 =126FH+2=1271H
rel=[1200-1271]补 =[-71H]补
=[11110001B]补 =10001110+1
=10001111B=9FH
注意:当 rel=- 2,用补码表示为 FE时,
PC目的 = PC源 + 2- 2= PC源例,SZ,SJMP SZ 及 SZ,SJMP $
④ 变址寻址转移指令 (间接转移指令 )
JMP @A+DPTR; PC A+DPTR
机器码,73H
该类指令是一条单字节双周期无条件转移指令。 在 64KB地址范围内无条件转移。
+ 5V
89C51
P1.3
K0
P1.2
P1.1
P1.0 K1
K2
K3
…………
STAR:MOV A,R1
CLR C
RLC A ;A←A* 2
MOV DPTR,#MAIN ;转移指令表始址送 DPTR
JMP @ A+ DPTR
MAIN:AJMP PM0 ;转入 0#命令程序
AJMP PM1 ;转入 1#命令程序
AJMP PM2 ;转入 2#命令程序
AJMP PM3 ;转入 3#命令程序
PM0,CLR C MOV A,40H
ADD A,41H MOV 42H,A ……
PM1,CLR C MOV A,40H
SUBB A,41H MOV 42H,A ……
PM2,…………………,
JZ rel; A=0 PC PC+2+rel
A≠ 0 PC PC+2
JNZ rel; A≠0 PC PC+2+rel
A=0 PC PC+2
2,条件转移指令
① 累加器 A判零转移 (2条 )
rel是一个带符号数,00H- 7FH对应 0~ 127;
80H- FFH对应- 128~- 1
在实际使用时,rel用一个转移目标地址标号来表示。
在编译时计算 rel的实际偏移值已知:外部 RAM中以 2000H为起始地址的数据块,以零为结束标志,试编程将该数据块送到以 60H为起始地址的内部 RAM单元中 。
例
0000
0001
0002
0003
2000 AA
2001 BB
2002 CC
2003 00
外部 RAM
AA
00
01
02
03
60
61
62
63
内部 RAM
结束标志分析:
外部 RAM 内部 RAM
A
关键指令,MOVX A,@DPTR
MOV @R0,A
步骤,①设置 DPTR=#2000H
② 设置目的地首地址 R0=#30H
③ 取外部数据至 A
⑤ A≠0,送数,修改地址转至 ③
⑤ A=0,转至结束处④ 判断转移解:程序为:
ORG 1000H
① MOV DPTR,#2000H ;外部 RAM数据块始地址
② MOV R0,#60H ;内部 RAM数据块始址送 R0
③ MOVX A,@DPTR ;取外部 RAM数据送 A
④ JZ QUIT ;若 A=0,则跳转到 QUIT处,;否则往下执行
⑤ MOV @R0,A ;A中的数据送给内部 RAM单元中
INC R0 ;修改外部 RAM地址的指针
INC DPTR ;修改内部 RAM地址的指针
SJMP ;循环执行
⑤ QUIT,SJMP $ ;停止
MAIN:
MAIN
CJNE A,#data,rel ;不相等转移; A=#data,PC ← PC+3,Cy ← 0; A>#data,PC ← PC+3+rel,Cy ← 0; A<#data,PC ← PC+3+rel,Cy ← 1
CJNE A,direct,rel ;不相等转移;若 A=(direct),则 PC← PC+3,Cy← 0;若 A>(direct),则 PC← PC+3+rel,Cy← 0;若 A<(direct),则 PC← PC+3+rel,Cy← 1
② 不相等转移(影响标志位)
CJNE Rn,#data,rel ;不相等转移;若 (Rn)=data,则 PC← PC+3,Cy← 0;若 (Rn)>data,则 PC← PC+3+rel,Cy← 0;若 (Rn)<data,则 PC← PC+3+rel,Cy← 1
CJNE @Ri,#data,rel ;不相等转移;若 ((Ri))=data,则 PC← PC+3,Cy← 0;若 ((Ri))>data,则 PC← PC+3+rel,; Cy← 0;若 ((Ri))<data,则 PC← PC+3+rel,;Cy← 1
DJNZ direct,rel ;direct← (direct)-1;若 (direct)≠ 0,则 PC← PC+3+rel;若 (direct)=0,则 PC← PC+3
DJNZ Rn,rel ;Rn ← (Rn)- 1;若 (Rn)=0 则 PC ← PC+2;若 (Rn)≠0 则 PC ← PC+2+rel
③ 减一不为零转移(循环转移指令)
例,从 P2.0输出 20个方波。
解:程序为:
ORG 1000H
MOV R2,#40D ;预置波形数= 2× 方波数
BACK,CPL P2.0 ;P2.0取反
DJNZ R2,BACK ;R2- 1不等于 0继续循环
SJMP $ ;停止思考,1、在此程序中标号的地址范围可以是??
2、用此程序产生的方波周期是多少??
子程序
ADD1
RET
A
C
B断点
D断点
3,子程序调用和返回指令子程序:具有一定功能的共用程序段子程序的最后一条指令必须是 RET
A:调用子程序指令地址
B:PC当前值,
入栈保护入口地址
(一般用标号来表示 )
ADD1:
① 调用指令 (2条 )
ACALL addr11 ;PC ← PC+2;SP ← SP+1;(SP) ← PC7~0;SP ← SP+1;(SP) ← PC15~8;PC10~0 ← addr11
a)短调用是一条双字节指令,格式为,
双字节指令,不影响标志位,在 2KB地址范围内寻址,以调用子程序。
保护返回地址目标地址机器码,a10 a9 a8 1 0 0 0 1
a7 a6 a5 a4 a3 a2 a1 a0
特征码例 已知,SZ,ACALL 3F2H; SZ=1800H
试确定:操作码及目的地址(子程序入口地址)
解,3F2H= 011 1111 0010B
机器码,011 10001 1111 0010B=71F2H
PC当前值 = SZ+ 2=1802H=0001 1000 0000 0010B
目的地址,0001 1011 1111 0010B=1BF2H
3F2
注意,所调用的子程序首地址必须在 PC当前值所在的同一区里
b) 长调用指令
LCALL addr16 ;PC ← PC+3;SP ← SP+1,(SP) ← PC7~0;SP ← SP+ 1,(SP) ← PC15~8;PC ← addr16(子程序入口地址)
三字节指令,在
64KB地址范围内调用子程序。
例已知,MAIN= 0200H,试问执行如下指令后,堆栈中数据如何变化? PC中内容是什么?
MOV SP,# 65H
MAIN,LCALL 2000H
解:执行上述指令后,SP= 67H、
( 66H) = 03H,( 67H) = 02H,PC= 2000H。
② 返回指令 (2条 )
RET PC15~8 ← (SP),SP ← SP-1
PC7~0 ← (SP),SP ← SP-1
② 子程序返回指令调用子程序后必须返回主程序,因此,每种子程序的最后一条指令必须是返回指令
RET。返回时完成将调用子程序时压入堆栈的断点地址送回 PC以恢复断点功能。堆栈遵循
“后进先出”原则。
b)中断返回指令
RETI
中断服务程序的最后一条指令后是中断返主指令。其恢复断点的操作与返回指令 RET相同。
此条指令前必须将相应的优先级状态触发器清 0。
NOP
PC15~8 ← (SP),SP← SP-1
PC7~0 ← (SP),SP← SP-1
③ 空操作用来产生一个机器周期的延时!
试利用子程序指令编写出以
20H- 23H单元中的数分别拆字送以
50H为首的地址单元中 。
例解:程序为:
ORG 0030H
MOV SP,#60H
CZCX:MOV R0,#50H ;目标首地址
MOV A,20H ;拆第一个字
LCALL PTDS ;调用拆字子程序
MOV A,21H ;拆第二个字
LCALL PTDS ;调用拆字子程序
MOV A,22H ;拆第三个字
LCALL PTDS ;调用拆字子程序
MOVA,23H ;拆第四个字
LCALL PTDS ;调用拆字子程序
SJMP $ ;停止
PTDS,MOV B,A ;把要拆的字送 B保存
ACALL PTDS1 ;调拆字子程序
MOV A,B ;调 B中的内容
SWAP A ;交换高低位
PTDS1:ANLA,#0FH ;屏蔽高位,保留低位
MOV @R0,A ;送目标地址
INC R0 ;目标地址加 1
RET ;返回内部 RAM中 20H~2FH单元是位寻址区和
11个可以位寻址的寄存器 P0,P1,P2,P3、
TCON,SCON,IE,IP,PSW,A,B。
5、位操作(布尔处理)类指令 (17条 )
① 传送指 令
MOV C,bit ; C ← bit
MOV bit,C ; bit ← C
bit可以是位直接地址、位名称、
点操作的形式( psw.2)
若 C=1,P1=1100 0101B,P3=0011 0101B,
顺次执行下列指令后结果表如何:
MOV P1.3,C;
MOV C,P3.3;
MOV P1.2,C;
例解:结果为,C=0,P1=1100 1001,P3不变
1→ P1.3则 P1=1100 1101
P3.3=0 →C
0 → P1.2则 P1=1100 1001
试编程把 00H位中内容和 3FH位中内容相交换 。
解:程序为:
MOV C,00H ; Cy← ( 00H)
MOV 01H,C ;暂存于 01H位中
MOV C,3FH ; Cy← ( 3FH)
MOV 00H,C ;存入目标 00H位中
MOV C,01H ; 00H位的原内容送 C
MOV 3FH,C ;存入目标 3FH位中
SJMP $ ;停止例
② 位置位和位清零指令 (4条 )
CLR C ; Cy ← 0
CLR bit ;bit ← 0
SETB C ;Cy ← 1
SETB bit ;bit ← 1
③ 位运算指令 (6条 )
ANL C,bit ;Cy ← Cy ∧ (bit)
ANL C,/bit ;Cy ← Cy ∧ /(bit)
ORL C,bit ;Cy ← Cy ∨ (bit)
ORL C,/bit ;Cy ← Cy ∨ /(bit)
CPL C ;Cy ← /Cy
CPL bit ;bit ← /bit
④ 位控制转移指令 (5条 )
若条件满足则 PC值改变,实现程序的转移。
JC rel ;若 Cy= 1 则 PC ←PC+2+rel
JNC rel ;若 Cy≠1 则 PC ←PC+2+rel
JB bit,rel ;若 bit=1 则 PC ←PC+2+rel
JNB bit,rel ;若 bit ≠1则 PC ←PC+2+rel
JBC bit,rel ;若 bit= 1 则 bit=0且 PC ←PC+3+rel
应用举例 2
一个引脚的高低电平,可以通过,光电耦合器” 控制继电器,从而以“弱电”控制“强电”。
第三章 作 业
5,7,8,9,19,32
33,36,37
26,27,29
21,23,24,25
自学内容 3.3.3及 3.3.4