http://www.wenyuan.com.cn/webnew/
第 3章 8051指令系统
( 课时,12学时 )
http://www.wenyuan.com.cn/webnew/
教学目的
指令和指令系统的概念与分类。
掌握指令的格式和寻址方式。
掌握数据传送、算术运算、逻辑运算、控制转移和位操作指令的功能和应用。
学习重点和难点
指令的寻址方式。
控制转移指令和位操作指令。
http://www.wenyuan.com.cn/webnew/
第 3章 8051指令系统
3.1 汇编语言
3.2 数据传送指令
3.3 算术运算指令
3.4 逻辑操作指令
3.5 控制程序转移类指令
3.6 位操作类指令
本章小结
习题
http://www.wenyuan.com.cn/webnew/
3.1 汇编语言
3.1.1 指令系统分类
3.1.2 指令格式
3.1.3 寻址方式
3.1.4 寻址空间及符号注释
http://www.wenyuan.com.cn/webnew/
3.1.1 指令系统分类基本概念
指令 是 CPU根据人的意图来执行某种操作的命令 。 指令常以其英文名称或者缩写形式作为助记符 。
一台计算机所能执行的全部指令的集合称为这个 CPU的 指令系统 。
采用助记符表示的指令称为 汇编语言 。
使用这种指令编写的程序称为 汇编语言程序 。
http://www.wenyuan.com.cn/webnew/
指令系统分类(一)
按照指令的 功能 划分,8051指令可分为以下五类:
数据传送 类指令 (29条 )
算术运算 类指令 (24条 )
逻辑运算 类指令 (24条 )
控制转移 类指令 (17条 )
位操作 类指令 (17条 )
http://www.wenyuan.com.cn/webnew/
指令系统分类(二)
按照指令占用的 存储空间 可分为:
单字节指令 (49条 )
双字节指令 (45条 )
三字节指令 (17条 )
按照指令的 执行时间 可分为:
单周期指令 (64条 )
双周期指令 (45条 )
四周期指令 (2条,乘,除法指令 )
http://www.wenyuan.com.cn/webnew/
3.1.2 指令格式
8051汇编语言指令由 操作码 段和 操作数 字段两部分组成。
汇编语言指令格式
[标号,] 操作码助记符 [目的操作数 ] [,源操作数 ] [;注释 ]
机器语言指令格式
双字节指令格式操作码代码 操作数或者地址
三字节指令格式操作码代码 操作数或地址,操作数或地址
http://www.wenyuan.com.cn/webnew/
3.1.3 寻址方式基本概念
寻址 就是寻找指令中操作数或操作数所在地址 。
寻址方式 就是找到存放操作数的地址,并把操作数提取出来的方法,即寻找操作数或者是操作数地址的方法 。
8051单片机寻址方式共有 7种,寄存器 寻址,直接 寻址,立即数 寻址,寄存器间接 寻址,变址 寻址,相对 寻址和 位 寻址 。
http://www.wenyuan.com.cn/webnew/
1,寄存器寻址
寄存器寻址就是操作数存放在寄存器中,指令中指定的寄存器的内容就是操作数 。
在寄存器寻址方式中以符号名称来表示寄存器 。
寄存器寻址方式的寻址范围包括:
通用工作寄存器 ——有 4组共 32个通用工作寄存器。
部分专用寄存器 ——累加器 A,B寄存器,DPTR寄存器。
http://www.wenyuan.com.cn/webnew/
2,直接寻址
直接寻址方式就是在指令中直接给出操作数所在存储单元的地址 。 此时,指令中操作数部分是操作数所在地址 。
直接寻址方式的寻址范围是内部 RAM,具体包括:
片内 RAM的 128个单元 ——在指令中以直接地址给出。
特殊功能寄存器 (SFR)——既可使用它们的 地址,也可使用它们的 名字 。
http://www.wenyuan.com.cn/webnew/
3,立即数寻址
立即数寻址就是操作数在指令中直接给出,或者说指令操作码后面立即给出一字节或两字节操作数 。
指令中给出的操作数是立即数,立即数前加,#”号标志,
以区别直接寻址中的直接地址 。
16位立即数传送指令,MOV DPTR,#datal6”,其中
#data16是一个 16位立即数 。
http://www.wenyuan.com.cn/webnew/
4,寄存器间接寻址
寄存器间接寻址是把指定寄存器的内容作为操作数地址,
该地址所指定的单元内容作为操作数 。
为了区分寄存器寻址和寄存器间接寻址,在寄存器间接寻址中,所用到的寄存器的前面要加间接寻址符,@”。
寄存器 R0,R1和数据指针 DPTR可以作为间接寻址寄存器 。
http://www.wenyuan.com.cn/webnew/
寄存器间接寻址示意图例如,寄存器 R0内容为 30H,片内 RAM 30H单元的内容为 45H。
解,指令,MOV A,R0”的功能是将 R0的内容 30H传送给累加器 A,
指令执行结果是 累加器 A中的内容为 30H。
指令,MOV A,@R0”的功能是将 R0的内容 30H作为操作数的地址,根据这一地址找到内部 RAM 30H单元,将其内容 45H
传送至累加器 A,指令执行结果是 累加器 A中内容为 45H。
R A M
地址 R0
30H
45H
30H
A
45H
4,寄存器间接寻址
http://www.wenyuan.com.cn/webnew/
5,变址寻址 (基址寄存器 +变址寄存器间接寻址 )
变址寻址是以 DPTR或者 PC作为基址寄存器,其内容为 基地址,以累加器 A作为变址寄存器,其内容为 变址,并将两个寄存器内容也就是基址和变址相加,形成 16位操作数地址 。
然后在程序存储器中找到该地址所对应的单元,其内容即为操作数 。
http://www.wenyuan.com.cn/webnew/
变址 寻址 示意图例如,指令,MOVC A,@A+DPTR”是变址寻址 。
解:假设 DPTR的内容为
2030H,累加器 A的内容为 12H。
该指令的功能是将
2030H和 12H相加,
得到 2042H作为操作数地址,在程序存储器中找到 2042H单元,将其内容送至累加器 A。
R O M
D P T R
+ = 2042H
2030H
12H
56H
56H
A
A 7
A0
地址
5,变址寻址 (基址寄存器 +变址寄存器间接寻址 )
http://www.wenyuan.com.cn/webnew/
6,相对寻址
相对转移指令执行时,是以当前的 PC值加上指令中规定的偏移量 rel而形成实际的转移地址 。 这里所说的 PC的当前值是执行完相对转移指令后的 PC值 。
一般将相对转移指令操作码所在地址称为源地址,转移后的地址称为目的地址。于是有:
目的地址 =源地址 +相对转移指令本身字节数 +rel
相对寻址只出现在相对转移指令中,以修正 PC的方式来控制程序的转移目的。
http://www.wenyuan.com.cn/webnew/
相对转移指令操作示意图例如,在 程 序 存 储器 中
2000H单元有一条双字节的相对转移指令
,SJMP 75H”。
解:程序存储器 2000H、
2001H单元的内容 80H、
75H是,SJMP 75H”的机器语言代码 。
6,相对寻址
http://www.wenyuan.com.cn/webnew/
7,位寻址
位寻址指令中给出的是位地址,即片内 RAM某一单元中的一位 。 位地址在指令中用 bit表示 。
单片机片内 RAM有两个区域可以进行位寻址。具体如下:
内部 RAM中的位寻址区 ——该区共有 16个单元,单元地址是
20H~ 2FH,一共有 128位,位地址为 00~ 7FH。
特殊功能寄存器的可操作位 ——有 11个单元地址能被 8整除的寄存器,它们都可以进行位寻址,实际可寻址位为 83个。
http://www.wenyuan.com.cn/webnew/
可寻址位在指令中的表示方式
① 直接使用 位地址 。
例,PSW寄存器的第 5位可表示为 D5H。
20H单元的第 7位可表示为 07H。
② 用 位名称 表示。
例,PSW寄存器的第 5位可表示为 F0。
③ 单元地址加位号 表示。
例,PSW寄存器的第 5位可表示为 D0H.5。
20H单元的第 7位可表示为 20H.7。
④ 可以用 寄存器名称加位号 表示。
例,PSW寄存器的第 5位可表示为 PSW.5。
http://www.wenyuan.com.cn/webnew/
3.1.4 寻址空间及符号注释寻址方式 寻址空间直接寻址 片内 RAM低 128字节和特殊功能寄存器 (只能采用直接寻址 )
寄存器寻址 工作寄存器 R0~ R7,A,B,DPTR
寄存器间接寻址片内 RAM低 128字节 (@R0,@R1,SP用于 PUSH/POP指令时 )
片外 RAM(@R0,@R1,@DPTR)
变址寻址 程序存储器相对寻址 程序存储器 (控制转移用 )
位寻址 片内 RAM20~ 2FH单元的 128个可寻址位和特殊功能寄存器中的 83个可寻址位
http://www.wenyuan.com.cn/webnew/
寻址方式中常用符号注释
Rn (n=0~ 7),当前选中的工作寄存器组 R0~ R7。它在片内数据存储器中的地址由 PSW中的 RSl和 RS0确定,可以是 00H~ 07H(第 0组 ),08H~
0FH(第 1组 ),10H~ 17H(第 2组 )或 18H~ 1FH(第 3组 )。
Ri (i=0,1),当前选中的工作寄存器组中可以用于寄存器间接寻址的的两个工作寄存器 R0,R1。它在片内数据存储器中的地址由 RSl,RS0确定,分别有 01H,02H; 08H,09H; 10H,11H和 18H,19H。
#data,8位立即数,即包含在指令中的 8位操作数。
#data16,16位立即数,即包含在指令中的 16位操作数。
direct,8位片内 RAM单元 (包括 SFR)的直接地址。
addr11,11位目的地址,用于 ACALL和 AJMP指令中。
addr16,16位目的地址,用于 LCALL和 LJMP指令中。
rel,补码形式的 8位地址偏移量,以下条指令第一字节地址为基值。
地址偏移量在 -128~ +127范围内。
bit,片内 RAM或 SFR的直接寻址位地址。
@,间接寻址方式中,表示间接寻址的符号。
/,位操作指令中,表示对该位先取反再参与操作,但不影响该位原值。
(X),某一个寄存器或者存储单元 X中的内容。
((X)),由 X间接寻址的单元的内容,即 X指向的地址单元中的内容。
←,指令中数据的传送方向,将箭头右边的内容送入箭头左边的单元。
http://www.wenyuan.com.cn/webnew/
3.2 数据传送指令
3.2.1 内部 RAM数据传送指令
3.2.2 外部 RAM传送指令
3.2.3 查表指令
3.2.4 交换指令
3.2.5 堆栈操作指令
3.2.6 数据传送类指令应用实例
http://www.wenyuan.com.cn/webnew/
3.2.1 内部 RAM数据传送指令
内部 RAM数据传送指令共有 15条,用于 8051单片机片内数据存储器和寄存器之间的数据传送。
采用的寻址方式有:
立即数寻址直接寻址寄存器寻址寄存器间接寻址
数据传输形式如右图所示。
A
@ Ri
# d a ta Rn
d ire c t
http://www.wenyuan.com.cn/webnew/
3.2.1 内部 RAM数据传送指令
1,以累加器 A为目的操作数的指令汇编指令格式 机器指令格式 操 作
MOV A,Rn E8H~ EFH A ← (Rn)
MOV A,direct E5H direct A ← (direct)
MOV A,@Ri E6H~ E7H A ← ((Ri))
MOV A,#data 74H data A ← #data
注意:上述操作不影响源字节和任何别的寄存器内容,只影响
PSW的 P标志位。
http://www.wenyuan.com.cn/webnew/
3.2.1 内部 RAM数据传送指令
2,以寄存器 Rn为目的操作数的指令汇编指令格式 机器指令格式 操 作
MOV Rn,A F8H~ FFH Rn ← (A)
MOV Rn,direct A8H~ AFH direct Rn ← (direct)
MOV Rn,#data 78H~ 7FH data Rn ← #data
注意,8051指令系统中没有,MOV Rn,@Ri”和,MOV Rn,Rn”
传送指令,也没有,MOV @Ri,@Ri”指令。
http://www.wenyuan.com.cn/webnew/
3.2.1 内部 RAM数据传送指令
3,以直接地址为目的操作数的指令汇编指令格式 机器指令格式 操作
MOV direct,A F5H direct direct ← (A)
MOV direct,Rn 88H~ 8FH direct direct ← (Rn)
MOV direct2,direct1 85H direct1 direct2 direct2 ← (direct1)
MOV direct,@Ri 86H~ 87H direct direct ← ((Ri))
MOV direct,#data 75H direct data direct ← # data
注意:,MOV direct2,direct1”指令在译成机器码时,源地址在前,目的地址在后。如,MOV 50H,90H”的机器码为,85 90
50” 。
http://www.wenyuan.com.cn/webnew/
3.2.1 内部 RAM数据传送指令
4,间接地址为目的操作数的指令汇编指令格式 机器指令格式 操 作
MOV @Ri,A F6H~ F7H (Ri) ← (A)
MOV @Ri,direct A6H~ A7H direct (Ri) ← (direct)
MOV @Ri,#data 76H~ 77H data (Ri) ← data
注意,(Ri)表示以 Ri中的内容为地址所指定的 RAM单元。
5,十六位数据传送指令汇编指令格式 机器指令格式 操 作
MOV DPTR,#data16 90H dataH dataL DPH ← dataH,
DPL ← dataL
注意:这是唯一的 16位立即数传送指令 。
http://www.wenyuan.com.cn/webnew/
3.2.2 外部 RAM传送指令汇编指令格式 机器指令格式 操 作
MOVX @DPTR,A F0H 外 ((DPTR)) ← (A)
MOVX A,@DPTR E0H A ← 外 ((DPTR))
MOVX @Ri,A F2H~ F3H 外 ((Ri) ) ← (A)
MOVX A,@Ri E2H~ E3H A ← 外 ((Ri))
注意,8051没有专门的输入 / 输出指令,在访问外部的设备时,可以采用这种方式与外部设备的端口打交道。
A
寄存器间接寻址
@Ri
外部 RA M 2 5 6 B
寄存器间接寻址
@D P T R
外部 RA M 6 4 KB
http://www.wenyuan.com.cn/webnew/
3.2.3 查表指令汇编指令格式 机器指令格式 操 作
MOVC A,@A+DPTR 93H PC ← (PC)+1,
A ← ((A)+(DPTR))
MOVC A,@A+PC 83H PC ← (PC)+1,
A ← ((A)+(PC))
注意:前一条指令只能查找指令所在位置以后 256B
范围内的代码或常数,后一条指令查表范围可达整个程序存储器的 64KB空间。
A
@ A + D P T R 变址远程查表
R O M 6 4 K B
@ A + P C 变址近程查表
R O M 指令附近 256B
http://www.wenyuan.com.cn/webnew/
3.2.4 交换指令
1,字节交换指令汇编指令格式 机器指令格式 操 作
XCH A,Rn C8~ CFH (A)? (Rn)
XCH A,direct C5H (A)? (direct)
XCH A,@Ri C6H~ C7H (A)? ((Ri))
注意:该操作只影响标志位 P。
2,半字节交换指令汇编指令格式 机器指令格式 操 作
XCHD A,@Ri D6H~ D7H (A)0~ 3? ((Ri))0~ 3
注意:该操作只影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.2.4 交换指令
3,累加器半字节交换指令汇编指令格式 机器码格式 操 作
SWAP A C4H (A)0~ 3? (A)4~ 7
注意:该操作不影响标志位 P。
S W A P
X C H
X C H D
A Rn @R i
di r ec t
http://www.wenyuan.com.cn/webnew/
3.2.5 堆栈操作指令
1,入栈指令汇编指令格式 机器指令格式 操 作
PUSH direct C0H direct SP ← (SP)+1,
(SP) ← (direct)
注意:堆栈指针 SP先加 1,并指向栈顶的上一个空单元,然后再将直接地址 (direct)寻址的单元内容压入当前 SP所指示的堆栈单元中。该操作不影响标志位 P。
2,出栈指令汇编指令格式 机器指令格式 操 作
POP direct D0H direct direct ← ((SP)),
SP ← (SP)-1
注意:先将堆栈指针 (SP)所指示的内部 RAM(栈顶 )单元中内容送入由直接地址寻址的单元中,然后再将栈指针 (SP)减 1并回送
SP。该操作不影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.2.6 数据传送类指令应用实例
【 例 5】 使用不同的指令将累加器 A的内容送至内部 RAM的 26H
单元。
解:在访问内部 RAM时,可以有多种寻址方式供选择,在实际应用中要注意根据实际情况选择合适的寻址方式来进行数据传送。可以通过下面指令采用不同寻址方式实现。
① MOV 26H,A ; 目的操作数采用直接寻址,
源操作数采用寄存器寻址
② MOV R0,#26H
MOV @R0,A ; 目的操作数采用寄存器间接寻址,
源操作数采用寄存器寻址
③ MOV 26H,ACC ; 采用直接寻址
④ MOV 26H,0E0H ; 采用直接寻址
⑤ PUSH ACC ; 利用栈操作,直接寻址
POP 26H
http://www.wenyuan.com.cn/webnew/
3.2.6 数据传送类指令应用实例
【 例 6】 已知 (A)=23H,(R0)=30H,内部 RAM(30H)=45H,
(45H)=56H,试分析分别执行下列指令后累加器 A的内容,
并写出源操作数的寻址方式。
解:这四条指令代表了数据传送指令中常用的四种寻址方式,
在使用时要特别注意不同寻址方式的区别,搞清楚谁是最终的操作数。要注意题中第一条指令与第二条指令、第三条与第四条指令的区别。
指令 结果 寻址方式
MOV A,R0 (A)=30H 寄存器寻址
MOV A,@R0 (A)=45H 寄存器间接寻址
MOV A,45H (A)=56H 直接寻址
MOV A,#45H (A)=45H 立即数寻址
http://www.wenyuan.com.cn/webnew/
3.2.6 数据传送类指令应用实例
【 例 7】 将外部 RAM 2000H单元的内容传送至外部 RAM 3000H
单元。
解,8051单片机指令系统中没有外部 RAM两个单元直接传送数据的指令,只有外部 RAM和累加器的传送指令,要想实现题目中要求的功能,必须通过累加器 A进行。
具体程序如下:
MOV DPTR,#2000H ;送源数据地址
MOVX A,@DPTR ;源数据送累加器
MOV DPTR,#3000H ;送数据目的地址
MOVX @DPTR,A ;累加器内容送目的单元
http://www.wenyuan.com.cn/webnew/
3.2.6 数据传送类指令应用实例
【 例 8】 (A)=20H,(B)=30H,分析执行下面指令以后的结果。
PUSH ACC
PUSH B
POP ACC
POP B
解:根据堆栈的,先入后出、后入先出,操作原则进行分析,
执行上面指令以后结果为,(A)=30H,(B)=20H。
程序执行结果和初始状态比较,两寄存器内容进行了互换,
正是由“先入后出”的存储原则造成的。
在子程序调用时,堆栈经常用来保护现场,利用 PUSH保护现场,利用 POP恢复现场。 恢复现场时,一定要注意 POP指令的顺序要和 PUSH指令对称,后压入的数据先弹出,先压入的数据后弹出,使得现场正确恢复到原来状态。
http://www.wenyuan.com.cn/webnew/
3.2.6 数据传送类指令应用实例
【 例 9】 在程序存储器中有一平方表,从 2000H单元开始存放,如图所示,试通过查表指令查找出 6的平方。
解:采用 DPTR作为基址寄存器的查表程序比较简单,查表范围大,也容易理解。只要预先使用一条 16位数据传送指令,把表的首地址 2000H
送入 DPTR,然后进行查表就可以了。
相应的程序如下:
MOV A,#6 ;设定备查的表项
MOV DPTR,#2000H ;设置 DPTR为表始址
MOVC A,@A+DPTR ;将 A的平方值查表后送 A
如果需要查找其他数的平方,只需要将累加器
A的内容 (变址 )改一下即可。
2000H 0
2001H 1
2002H 4
2003H 9
2004H 16
2005H 25
2006H 36
2007H 49
2008H 64
2009H 81
http://www.wenyuan.com.cn/webnew/
3.3 算术运算指令
3.3.1 加法、减法指令
3.3.2 乘法、除法指令
3.3.3 加 1、减 1指令
3.3.4 十进制调整指令
3.3.5 算术运算类指令应用实例
http://www.wenyuan.com.cn/webnew/
3.3.1 加法、减法指令
1,加法类指令汇编指令格式 机器指令格式 操 作
ADD A,Rn 28H~ 2FH A ← (A)+(Rn)
ADD A,direct 25H direct A ← (A)+(direct)
ADD A,@Ri 26H~ 27H A ← (A)+((Ri))
ADD A,#data 24H data A ← (A)+#data
注意:当和的第 3位或第 7位有进位时,分别将 AC,CY标志位置 1;否则为 0。如果第 6位向第 7位有进位而第 7位没有向前进位,或者如果第 7位向前有进位而第 6位没有向第 7位进位,OV=1,否则 OV=0。该操作也影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.3.1 加法、减法指令
2,带进位加法指令汇编指令格式 机器指令格式 操 作
ADDC A,Rn 38H~ 3FH A ← (A) +(Rn) +CY
ADDC A,direct 35H direct A ← (A)+(direct)+CY
ADDC A,@Ri 36H~ 37H A ← (A)+((Ri))+CY
ADDC A,#data 34H data A ← (A)+#data+CY
注意:本指令的执行将影响标志位 AC,CY,OV,P,与 ADD
指令相同 。
http://www.wenyuan.com.cn/webnew/
3.3.1 加法、减法指令
3,带借位减法指令汇编指令格式 机器指令格式 操 作
SUBB A,Rn 98H~ 9FH A ← (A)-CY-(Rn)
SUBB A,direct 95H direct A ← (A)-CY-(direct)
SUBB A,@Ri 96H~ 97H A ← (A)-CY-((Ri))
SUBB A,#data 94H data A ← (A)-CY-#data
注意:在执行不带借位的运算时,可在,SUBB”指令前用
,CLR C”指令将 CY清 0。如果第 7位有借位,则 CY置 1,否则清 0。若第 3位有借位,则 AC置 1;否则清 0。两个带符号数相减,还要考查 OV标志,若 OV为 1,表示差数溢出,即破坏了正确结果的符号位。该操作也影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.3.2 乘法、除法指令
1,乘法指令汇编指令格式 机器指令格式 操 作
MUL AB A4H BA ← (A)× (B)
注意:若乘积大于 0FFH,则 OV置 1,否则清 0(此时 B的内容为
0)。 CY总是被清 0。该操作也影响标志位 P。
2,除法指令汇编指令格式 机器指令格式 操 作
DIV AB 84H A← (A)÷ (B)的商,
B← (A)÷ (B)的余数注意:若除数 (B)=00H,则结果无法确定,则 OV置 1。 CY总是被清 0。该操作也影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.3.3 加 1、减 1指令
1,加 1指令汇编指令格式 机器指令格式 操 作
INC A 04H A ← (A)+1
INC Rn 08H~ 0FH Rn ← (Rn)+1
INC direct 05H direct direct ← (direct)+1
INC @Ri 06H~ 07H (Ri) ← ((Ri))+l
INC DPTR A3H DPTR ← (DPTR)+1
注意:该操作不影响 PSW标志位。
http://www.wenyuan.com.cn/webnew/
3.3.3 加 1、减 1指令
2,减 1指令汇编指令格式 机器指令格式 操 作
DEC A 14H A ← (A)-1
DEC Rn 18H~ 1FH Rn ← (Rn)-l
DEC direct 15H direct direct ← (direct)-1
DEC @Ri 16H~ 17H (Ri) ← ((Ri))-1
注意:该操作不影响 PSW标志位。
http://www.wenyuan.com.cn/webnew/
3.3.4 十进制调整指令汇编指令格式 机器码格式 操 作
DA A D4H 调整累加器 A内容为 BCD码注意:这条指令一般跟在 ADD或 ADDC指令后,将相加后存放在累加器中的结果进行十进制调整,完成十进制加法运算功能(不能用于十进制减法的调整 )。调整方法如下:
若 (A0-3)>9或 AC=1,则 (A0-3)+6→ A0-3
若 (A4-7)>9或 CY=1,则 (A4-7)+6→ A4-7
该操作影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.3.5 算术运算类指令应用实例
【 例 13】 有两个 BCD码表示的 4位十进制数,分别存放在内部数据存储器的 50H~ 51H单元和 60H~ 61H单元,试编写程序求这两个数之和,并将结果存放在 40H~ 42H
单元。
解,求两个 BCD数之和的运算程序如下:
MOV A,50H ;取第一个数低 2位 BCD码
ADD A,60H ;加第二个数低 2位 BCD码
DA A ;十进制调整
MOV 40H,A ;保存结果的低 2位
MOV A,51H ;取高位 BCD码
ADDC A,61H ;高位相加
DA A ;十进制调整
MOV 41H,A ;保存结果的高 2位
MOV A,#00H
ADDC A,#00H ;计算进位
MOV 42H,A ;保存进位
http://www.wenyuan.com.cn/webnew/
3.3.5 算术运算类指令应用实例
【 例 14】 试编程计算 5678H~ 1234H的值,结果保存在 R6、
R5中。
解:减数和被减数都是 16位二进制数,计算时要先进行低 8
位的减法,然后再进行高 8位的减法,在进行低 8位减法时,不需要考虑借位,所以要在减法指令之前将借位标志清 0。程序如下:
MOV A,#78H ;被减数低 8位送累加器
CLR C ;清进位标志位 CY
SUBB A,#34H ;减去减数
MOV R5,A ;保存低 8位
MOV A,#56H ;被减数高 8位送累加器
SUBB A,#12H ;减去减数
MOV R6,A ;保存高 8位
http://www.wenyuan.com.cn/webnew/
3.3.5 算术运算类指令应用实例
【 例 15】 试分析执行下列指令以后,寄存器和内部 RAM的状态。
MOV R0,#30H ;数 30H送入 R0
MOV 30H,#40H ;数 40H送入片内 RAM 30H单元
MOV 31H,#50H ;数 50H送入片内 RAM 31H单元
INC @R0 ;将片内 RAM 30H单元中的内容加 1
INC R0 ;将 R0中的内容加 1
INC @R0 ;将片内 RAM 31H单元中的内容加 1
解:分析结果,(R0)=31H
(30H)=41H
(31H)=51H
http://www.wenyuan.com.cn/webnew/
3.4 逻辑操作指令
3.4.1 逻辑,与,,,或,,,异或,指令
3.4.2 清零、取反指令
3.4.3 循环移位指令
3.4.4 逻辑运算类指令应用实例
http://www.wenyuan.com.cn/webnew/
3.4.1 逻辑,与,,,或,,,异或,
指令
1,逻辑“与”指令汇编指令格式 机器指令格式 操 作
ANL A,Rn 58H~ 5FH A ← (A)∧ (Rn)
ANL A,direce 55H direct A ← (A)∧ (direct)
ANL A,@Ri 56H~ 57H A ← (A)∧ ((Ri))
ANL A,#data 54H data A ← (A)∧ #data
ANL direct,A 52H direct direct ← (direct)∧ (A)
ANL direct,#data 53H direct data direct ← (direct)∧ #data
注意:后 2条指令若直接地址正好是 I/O端口 P0~ P3,则为端口的
“读 —改 —写”操作。前 4条指令的操作影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.4.1 逻辑,与,,,或,,,异或,
指令
2,逻辑“或”指令汇编指令格式 机器指令格式 操 作
ORL A,Rn 48H~ 4FH A ← (A)∨ (Rn)
ORL A,direct 45H direct A ← (A)∨ (direct)
ORL A,@Ri 46H~ 47H A ← (A)∨ ((Ri))
ORL A,#data 44H data A ← (A)∨ #data
ORL direct,A 42H direct direct ← (direct)∨ (A)
ORL direct,#data 43H direct data direct ← (direct)∨ #data
注意:后 2条指令若直接地址正好是 I/O端口 P0~ P3,则为端口的
“读 —改 —写”操作。前 4条指令的操作影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.4.1 逻辑,与,,,或,,,异或,
指令
3,逻辑“异或”指令汇编指令格式 机器指令格式 操 作
XRL A,Rn 68H~ 6FH A ← (A)⊕ (Rn)
XRL A,direct 65H direct A ← (direct)⊕ (A)
XRL A,@Ri 66H~ 67H A ← (A)⊕ ((Ri))
XRL A,#data 64H data A ← (A)⊕ #data
XRL direct,A 62H direct direct ← (direct)⊕ (A)
XRL direct,#data 63H direct data direct ← (direct)⊕ #data
注意:后 2条指令若直接地址正好是 I/O端口 P0~ P3,则为端口的
“读 —改 —写”操作。前 4条指令的操作影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.4.2 清零、取反指令
1,累加器 A清 0指令汇编指令格式 机器指令格式 操 作
CLR A E4H A ← 0
注意:该操作影响标志位 P。
2,累加器 A取反指令汇编指令格式 机器指令格式 操 作
CPL A F4H A ← ( )
对累加器 A的内容逐位取反,不影响标志位。
注意:该操作不影响标志位 P。
A
http://www.wenyuan.com.cn/webnew/
3.4.3 循环移位指令
1,累加器 A循环左移指令汇编指令格式 机器指令格式 操 作
RL A 23H
注意:该操作不影响 PSW标志位。
2,累加器 A循环右移指令汇编指令格式 机器指令格式 操 作
RR A 03H
注意:该操作不影响 PSW标志位。
http://www.wenyuan.com.cn/webnew/
3.4.3 循环移位指令
3,累加器 A带进位循环左移指令汇编指令格式 机器指令格式 操 作
RLC A 33H
注意:该操作影响标志位 P和 CY。
4,累加器 A带进位循环右移指令汇编指令格式 机器指令格式 操 作
RRC A 23H
注意:该操作影响标志位 P和 CY 。
http://www.wenyuan.com.cn/webnew/
3.4.4 逻辑运算类指令应用实例
【 例 16】 将 P1口的 P1.2,P1.3,P1.7清零,其余位不变。
解:相应的指令为:
ANL P1,#01110011B
【 例 17】 利用逻辑运算指令将 P1口的 P1.1,P1.3,P1.5置 1,
其余位保持不变。
解:相应的指令为:
ORL P1,#00101010B
【 例 18】 利用逻辑运算指令,将内部 RAM中 40H单元的 1,3、
5,7位取反,其他位保持不变。
解:相应指令为:
XRL 40H,#0AAH ;0AAH=10101010B
http://www.wenyuan.com.cn/webnew/
3.4.4 逻辑运算类指令应用实例
【 例 19】 利用逻辑运算指令将当前工作寄存器设定为第 3组工作寄存器。
解:相应指令为:
ORL PSW,#00011000B
【 例 20】 无符号 8位二进制数 (A)=00111101B=3DH,CY=0。
试分析执行,RLC A”指令后累加器 A的内容。
解:执行指令,RLC A”的结果为
(A)=01111010B=7AH
CY=0
7AH正是 3DH的 2倍,该指令执行的是乘 2操作。
http://www.wenyuan.com.cn/webnew/
3.4.4 逻辑运算类指令应用实例
【 例 21】 拆字程序:在内部 RAM 40H单元保存有以压缩 BCD码表示的 2位十进制数,编程将它们拆开,分别保存在内部
RAM的 41H,42H单元。
解:程序如下:
MOV A,40H ;压缩 BCD码送累加器
ANL A,#0FH ;高 4位清 0,保留低 4位
MOV 41H,A ;保存低 4位 BCD码
MOV A,40H ;取数据
MOV A,#0F0H ;低 4位清 0,保留高 4位
SWAP A ;高低位交换
MOV 42H,A ;保存高 4位 BCD码
http://www.wenyuan.com.cn/webnew/
3.5 控制程序转移类指令
3.5.1 无条件转移指令
3.5.2 条件转移指令
3.5.3 调用、返回指令
3.5.4 空操作指令
3.5.5 控制转移类指令应用实例
http://www.wenyuan.com.cn/webnew/
3.5.1 无条件转移指令
无条件转移指令是指当程序执行到该指令时,程序无条件转移到指令所提供的地址处执行。
无条件转移类指令有四类,
绝对转移 ——LJMP
长转移 ——AJMP
相对转移 (短转移 )——SJMP
间接转移 (散转指令 )——JMP
http://www.wenyuan.com.cn/webnew/
3.5.1 无条件转移指令
1,绝对转移指令汇编指令格式 机器指令格式 操 作
AJMP addr11 a10a9a800001 a7~ a0 PC← (PC)+2,
PC10~ 0← addrll,
(PC15~ 11)不变注意:本条指令提供 11
位地址,可在该指令后面一个存储单元所在的
2KB区域内无条件转移。
地址
R OM
2 KB A JM P ad d r 1 1
PC
+2
http://www.wenyuan.com.cn/webnew/
3.5.1 无条件转移指令
2,长转移指令汇编指令格式 机器指令格式 操 作
LJMP addr16 02H addr16 PC ← addrl6
注意:本条指令提供 16
位目的地址,所以程序可转向 64KB程序存储器地址空间的任何单元。
FFFFH
0 0 0 0 H
G
L J MP a d d r16 64K
ROM
地址
…
http://www.wenyuan.com.cn/webnew/
3.5.1 无条件转移指令
3,相对转移 (短转移 )指令汇编指令格式 机器指令格式 操 作
SJMP rel 80H rel PC ← (PC)+2,
PC ← (PC)+rel
注意:本条指令的操作数是相对地址,rel是一个带符号的偏移量 (补码 ),其范围为 -128~ +127共 256字节。负数表示反向转移,正数表示正向转移。
如果指令中偏移量 rel=FEH,因为 FEH是 -2的补码,所以转移目的地址 =PC+2-2=PC,结果转向自己,导致无限循环。
这条指令称为原地踏步指令,即程序执行到这条指令时,
不再向下执行,而在该指令处原地踏步。
http://www.wenyuan.com.cn/webnew/
3.5.1 无条件转移指令
4,间接转移指令 (散转指令 )
汇编指令格式 机器指令格式 操 作
JMP @A+DPTR 73H PC ← (A)+(DPTR)
注意:该指令采用的是变址寻址方式,指令执行过程对 DPTR、
A和标志位均无影响。这条指令可以根据累加器 A的不同值实现多个方向的转移,可代替众多的判断跳转指令,具有散转功能,所以又称散转指令。
http://www.wenyuan.com.cn/webnew/
3.5.2 条件转移指令
条件转移指令是指根据给出的条件进行判断,
若 条件满足,则程序转向由偏移量确定的目的地址处去执行。
若 条件不满足,程序将不会转移,而是按原顺序执行。
8051有丰富的条件转移指令。
http://www.wenyuan.com.cn/webnew/
3.5.2 条件转移指令
1,累加器判零转移指令汇编指令格式 机器指令格式 操 作
JZ rel 60H rel PC ← (PC)+2
若 A=0,则程序转移 PC← (PC)+rel
若 A≠0,则程序往下顺序执行
JNZ rel 50H rel PC ← (PC)+2
若 A≠0,则程序转移 PC← (PC)+rel
若 A=0,则程序往下顺序执行注意:相对偏移量为一个带符号的 8位数,偏移范围为 -128~
+127,共 256个字节。本指令不改变累加器 A的内容,也不影响任何标志位。
http://www.wenyuan.com.cn/webnew/
3.5.2 条件转移指令
2,比较转移指令汇编指令格式 机器指令格式 操 作
CJNE A,direct,rel B5H direct rel 累加器内容和直接寻址单元比较
CJNE A,#data,rel B4H data rel 累加器和立即数比较
CJNE Rn,#data,rel B6H~ B7H data rel 寄存器内容和立即数比较
CJNE @Ri,#data,rel B8H~ BFH data rel 间接寻址单元内容和立即数比较注意:若目的操作数 =源操作数,程序顺序执行,CY=0;
若目的操作数 >源操作数,程序转移,PC← (PC)+rel,并且 CY=0;
若目的操作数 <源操作数,程序转移,PC← (PC)+rel,并且 CY=1。本指令执行后不影响任何操作数。
http://www.wenyuan.com.cn/webnew/
3.5.2 条件转移指令
3,减 1非 0转移指令 (循环转移指令 )
汇编指令格式 机器指令格式 操 作
DJNZ Rn,rel D8H~ DFH rel PC ← (PC)+2,
Rn ← (Rn)-1;
若 (Rn)≠0,则程序转移 PC← (PC)+rel;
若 (Rn)=0,则程序往下顺序执行
DJNZ direct,rel D5H direct rel PC ← (PC)+3,
direct ← (direct)-1
若 (direct)≠0,则程序转移 PC← (PC)+rel;
若 (direct)=0,则程序往下顺序执行
http://www.wenyuan.com.cn/webnew/
3.5.2 条件转移指令
3,减 1非 0转移指令 (循环转移指令 )
注意:在一般的应用中,
经常把 rel设为负值,
使得程序负向跳转。
通过改变指令中 Rn或者 direct单元的内容,
就可以控制程序负向跳转的次数,也就控制了程序循环的次数,
所以该指令又称为循环转移指令。
http://www.wenyuan.com.cn/webnew/
3.5.3 调用、返回指令
通常把具有一定功能的公用程序段作为 子程序,在主程序中采用调用指令 调用子程序,子程序的最后一条指令为 返回主程序 指令 (RET)。
8051指令系统中有两条调用指令,分别是 绝对调用 和 长调用指令 。
主程序调用子程序及从子程序返回主程序的过程如右图所示。
返回调用 断点返回调用子程序主程序主程序主程序断点
http://www.wenyuan.com.cn/webnew/
3.5.3 调用、返回指令
1,绝对调用指令汇编指令格式 机器指令格式 操 作
ACALL addr11 a10a9a810001 a7~ a0 PC ← (PC)+2
SP ← (SP)+1,(SP) ← (PC0~ PC7)
SP ← (SP)+1,(SP) ← (PC8~ PC 15)
PC0~ PC10 ← addr0~ 10,PC11~ PC15不变注意:本指令提供 11位子程序目的地址,调用地址的形成方法和绝对转移指令类似;被调用的子程序首地址必须在 ACALL
指令后一字节所在的 2KB范围内的程序存储器中。
http://www.wenyuan.com.cn/webnew/
3.5.3 调用、返回指令
2,长调用指令汇编指令格式 机器指令格式 操 作
LCALL addr16 12H addr16 PC ← (PC)+3
SP ← (SP)+1,(SP) ← (PC0~ PC7)
SP ← (SP)+1,(SP) ← (PC8~ PC15)
PC ← addr16
注意:本指令提供 16位子程序目的地址,被调用的子程序首地址可设置在 64KB程序存储器地址空间的任何位置。
http://www.wenyuan.com.cn/webnew/
3.5.3 调用、返回指令
3,返回指令汇编指令格式 机器指令格式 操 作
RET 22H PC8~ 15 ← ((SP)),弹出断点高 8位
SP ← ((SP)-1
PC0~ 7 ← ((SP)),弹出断点低 8位
SP ← (SP)-1
注意:本指令的作用是从子程序返回。当程序执行到本指令时,
表示结束子程序的执行,返回调用指令 (ACALL或 LCALL)的下一条指令处 (断点 )继续往下执行。因此,它的主要操作是将栈顶的断点地址送 PC,于是,子程序返回主程序继续执行。
http://www.wenyuan.com.cn/webnew/
3.5.3 调用、返回指令
3,返回指令汇编指令格式 机器指令格式 操 作
RETI 32H PC8~ 15 ← ((SP)),弹出断点高 8位
SP ← ((SP)-1
PC0~ 7 ← ((SP)),弹出断点低 8位
SP ← (SP)-1
注意:本指令是中断返回指令,除具有 RET指令的功能外,还具有开放低优先级中断、恢复中断逻辑等功能。在编程时不能将两种返回指令混用,中断返回一定要安排在中断服务程序的最后。
http://www.wenyuan.com.cn/webnew/
3.5.4 空操作指令汇编指令格式 机器指令格式 操 作
NOP 00H PC ← (PC)+1
注意:这是一条单字节指令,除 PC加 1指向下一条指令以外,
它不执行其他任何操作,不影响其他寄存器和标志位。
NOP指令常用来产生一个机器周期的延迟,用来编写软件延时程序。
http://www.wenyuan.com.cn/webnew/
3.5.5 控制转移类指令应用实例
【 例 22】 在累加器 A中保存有命令键键值,编写程序使程序根据键值不同而转向不同的子程序入口。
解,本题可以采用散转指令,程序如下:
KEY,CLR C ;清进位
RLC A ;键值乘 2
MOV DPTR,# KEYTAB;DPTR指向命令键跳转表首址
JMP @A+DPTR ;散转到命令键入口
KEYTAB,AJMP KEYPR0 ;转向 0号键处理程序
AJMP KEYPR1 ;转向 1号键处理程序
AJMP KEYPR2 ;转向 2号键处理程序
……
从程序中看出,当 (A)=00H时,散转到 KEYPR 0;当
(A)=01H,散转到 KEYPR l……。由于 AJMP是双字节指令,
转移表中相邻的 AJMP指令地址相差 2个字节,所以散转前应先将 A中键值乘 2。
http://www.wenyuan.com.cn/webnew/
3.5.5 控制转移类指令应用实例
【 例 23】 设 (SP)=30H,符号地址 PROG1指向程序存储器的
5678H单元,当前 PC值为 0123H。从 0123H处执行指令
,LCALL PROG1”,分析执行后 PC,SP的值和相关存储器的内容。
解:执行过程为:
(PC)+3=0123H+3=0126H。
将 PC内容压入堆栈:向 (SP)+1=31H中压入 26H,向
(SP)+1=32H中压入 01H,(SP)=33H。
将 PROG1=5678H送入 PC,即 (PC)=5678H。程序转向以
5678H为首地址的子程序执行。
最终执行结果是,(PC)=5678H,(SP)=33H,(31H)=26H、
(32H)=01H。
http://www.wenyuan.com.cn/webnew/
3.5.5 控制转移类指令应用实例
【 例 24】 编程判断内部 RAM 30H单元中的数据是奇数还是偶数,
如果是偶数,程序转向 PROG0处,如果是奇数程序转向
PROG1处 (0按照偶数对待 )。
解:程序如下:
MOV A,30H ;数据送累加器
ANL A,#01H ;高 7位清 0,保留最低位
JZ PROG0 ;如果全为 0说明是偶数,转向 PROG0
SJMP PROG1 ;数据为奇数,转向 PROG1
http://www.wenyuan.com.cn/webnew/
【 例 25】 利用 DJNZ指令和 NOP指令编写一循环程序,实现延时
1ms(晶振频率为 12MHz)。
解:程序如下:
DELAY,MOV A,#0AH ;1μs
LOOP,MOV R2,#30H ;1μs
DJNZ R2,$ ;2× 48μs
DJNZ R1,LOOP ;1μs× (1+2× 48+1)× 10
NOP ;1μs
NOP ;1μs
NOP ;1μs
NOP ;1μs
NOP ;1μs
RET ;2μs
总的延时时间为,1+(1+2× 48+1)× 10+7=998μs,若再加上调用本子程序的调用指令所用的时间 2μs共 1000μs,即 1ms。
http://www.wenyuan.com.cn/webnew/
3.6 位操作类指令
3.6.1 位数据传送指令
3.6.2 位逻辑运算指令
3.6.3 位清 0、置 1指令
3.6.4 位条件转移类指令
3.6.5 位操作类指令应用实例
http://www.wenyuan.com.cn/webnew/
3.6 位操作类指令
8051硬件结构中有个位处理机又称布尔处理机,它具有一套完整的处理位变量的指令集,包括 位变量传送,逻辑运算,控制程序转移指令 等。
在进行位寻址时,PSW中的进位标志 CY作为位处理机的累加器,称为 位累加器 。
位寻址空间包括以下两部分:
片内 RAM中位寻址区 ——即字节地址 20H~ 2FH单元中连续的 128个位,位地址为 00H~ 7FH。
部分特殊功能寄存器中的可寻址位 ——凡 SFR中字节地址能被 8整除的特殊功能寄存器都可以进行位寻址。位地址为 80~ F7H,一共 83位。
http://www.wenyuan.com.cn/webnew/
3.6.1 位数据传送指令汇编指令格式 机器指令格式 操 作
MOV C,bit A2H bit C ← (bit)
MOV bit,C 92H bit bit ← (C)
注意:本指令一个操作数为位地址 (bit),另一个必定为位累加器 C(即进位标志位 CY)。此指令不影响其他寄存器或标志位。
在位操作指令中,位地址 bit表示方法除前面已讲过的 4种之外,如果事先用伪指令定义,还可以采用伪指令定义过的字符名称来表示一个可寻址位。
http://www.wenyuan.com.cn/webnew/
3.6.2 位逻辑运算指令
1,位逻辑“与”指令汇编指令格式 机器指令格式 操 作
ANL C,bit 82H bit C ← (C)∧ (bit)
ANL C,/bit B0H bit C ← (C)∧ (bit)
注意:斜杠,/”表示对该位取反后再参与运算,但不改变原来的数值。 8051单片机中没有位逻辑“异或”指令。
2,位逻辑“或”指令汇编指令格式 机器指令格式 操 作
ORL C,bit 72H bit C ← (C)∨ (bit)
ORL C,/bit A0H bit C ← (C)∨ (bit)
注意:斜杠,/”表示对该位取反后再参与运算,但不改变原来的数值。 8051单片机中没有位逻辑“异或”指令。
http://www.wenyuan.com.cn/webnew/
3.6.3 位清 0、置 1指令
1,位清 0指令汇编指令格式 机器指令格式 操 作
CLR C C3H C ← 0
CLR bit C2H bit bit ← 0
注意:本指令执行结果不影响其他标志位。当直接位地址为端口 P0~ P3中的某一位时,具有“读 —改 —写”功能。
2,位置 1指令汇编指令格式 机器指令格式 操 作
SETB C D3H C ← 1
SETB bit D2H bit bit ← 1
注意:本指令执行结果不影响其他标志位。当直接位地址为端口 P0~ P3中的某一位时,具有“读 —改 —写”功能。
http://www.wenyuan.com.cn/webnew/
3.6.3 位清 0、置 1指令
3,位取反指令汇编指令格式 机器指令格式 操 作
CPL C B3H C ← ( )
CPL bit B2H bit bit ← ( )
注意:本指令执行结果不影响其他标志位。当直接位地址为端口 P0~ P3中的某一位时,具有“读 —改 —写”功能。
bit
C
http://www.wenyuan.com.cn/webnew/
3.6.4 位条件转移类指令
1,判位累加器 C转移指令汇编指令格式 机器指令格式 操 作
JC rel 40H rel PC ← (PC)+2
若 (C)=1,则程序转移 PC ← (PC)+rel
若 (C)=0,则程序往下顺序执行
JNC rel 50H rel PC ← (PC)+2
若 (C)=0,则程序转移 PC ← (PC)+rel
若 (C)=1,则程序往下顺序执行注意:本指令执行结果不影响 PSW标志位。
http://www.wenyuan.com.cn/webnew/
3.6.4 位条件转移类指令
2,判位变量转移指令汇编指令格式 机器指令格式 操 作
JB bit,rel 30H bit rel PC ← (PC)+3
若 (bit)=1,则程序转移 ← (PC)+rel
若 (bit)=0,则程序往下顺序执行
JNB bit,rel 20H bit rel PC ← (PC)+3;
若 (bit)=0,则程序转移 PC ← (PC)+rel
若 (bit)=1,则程序往下顺序执行注意:本指令执行结果不影响 PSW标志位。
http://www.wenyuan.com.cn/webnew/
3.6.4 位条件转移类指令
3,判位变量清 0转移指令汇编指令格式 机器指令格式 操 作
JBC bit,rel 10H bit rel PC ← (PC)+3
若 (bit)=1,则程序转移 PC← (PC)+rel,
且 bit← 0
若 (bit)=0,则程序往下顺序执行注意:本指令执行结果不影响 PSW标志位。
http://www.wenyuan.com.cn/webnew/
3.6.5 位操作类指令应用实例
【 例 26】 将 P1.4的状态取反后传送给 P1.6。
解:相应的指令为,MOV C,P1.4
CPL C
MOV P1.6,C
【 例 27】 编程判断内部 RAM 30H单元中存放的有符号数是正数还是负数,如果是正数,程序转移到 PROP处;如果是负数,
程序转移到 PRON处;如果是 0,程序转移到 ZERO处。
解:程序如下:
MOV A,30H ;取数据
JZ ZERO ;如果为 0,转移至 ZERO处
JB ACC.7,PRON ;ACC.7=1,说明是负数,转移至 PRON
SJMP PROP ;否则,是正数,转移至 PROP
http://www.wenyuan.com.cn/webnew/
3.6.5 位操作类指令应用实例
【 例 28】 比较内部 RAM中 40H,41H两个单元中的数据大小,
将大的数送至 42H单元。
解:程序如下:
MOV A,40H ;取第一个数
CJNE A,41H,NEQU ;比较,不相等转移至 NEQU处
MOV 42H,40H ;相等,(40H)→ 42H
SJMP TOOFF ;完成,转移至结尾退出
NEQU,JC LESS ;若 CY=1,说明 (40H)< (41H)转移
MOV 42H,40H ;(40H)> (41H),(40H)→ 40H
SJMP TOOFF ;完成,转移至结尾退出
LESS,MOV 42H,41H ;(40H)< (41H),(41H)→ 40H
TOOFF,RET
http://www.wenyuan.com.cn/webnew/
3.6.5 位操作类指令应用实例
【 例 29】 利用逻辑运算指令实现逻辑关系:
Y=(A∧ B)∨ (C∧ D),A,B,C,D均为位变量。
解:将 A,B,C,D分别接至 P1.0~ P1.3,P1.4输出即为 Y信号,
相应程序如下:
MOV C,P1.0
ANL C,P1.1 ;A∧ B
MOV 00H,C ;暂存在 00H位
MOV C,P1.2
ANL C,P1.3 ;C∧ D
ORL C,00H ;(A∧ B)∨ (C∧ D)
MOV P1.4,C ;逻辑关系输出
http://www.wenyuan.com.cn/webnew/
本章小结
指令系统是计算机可执行命令的集合,是程序设计的基础。
本章主要介绍 8051单片机的指令系统。熟悉和掌握指令系统对于 单片机的汇编语言程序设计 是十分重要的。
8051单片机具有功能强大的指令系统,根据功能可分为:
数据传送类指令、算术运算类指令、逻辑运算和移位操作指令、控制转移类指令和位操作指令。
寻址方式 是寻找操作数或操作数地址的方式。要正确理解指令的功能一定要分析指令中操作数是如何获取的,也就是要清楚寻址方式。 8051单片机支持多种寻址方式,分别是:寄存器寻址、立即数寻址、直接寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址。要注意区分不同寻址方式的区别,特别是要区分寄存器寻址和寄存器间接寻址、
直接寻址和立即数寻址。
http://www.wenyuan.com.cn/webnew/
本章小结
每一种寻址方式都有相应的 寻址空间 。寄存器寻址可以访问工作寄存器 R0~ R7,A,B,DPTR,直接寻址可以访问内部 RAM低 128B和特殊功能寄存器 (SFR),寄存器间接寻址可以访问片内 RAM低 128B和片外 RAM 64KB,变址寻址可以访问程序存储器。要注意特殊功能寄存器 (SFR)只能采用直接寻址,片外 RAM只能采用寄存器间接寻址。
变址寻址 一般用于查表指令中,用来查找存放在程序存储器中的常数表格。根据基址寄存器的不同,又可以分为近程查表和远程查表,近程查表用 PC作为基址寄存器,远程查表采用 DPTR作为基址寄存器。
http://www.wenyuan.com.cn/webnew/
本章小结
数据传送类指令 是指令系统中应用最普遍的指令,这类指令是把源地址单元的内容传送到目的地址单元中去,而源地址单元内容不变。数据传送指令分为内部数据传送指令、
累加器和外部 RAM传送指令、查表指令、堆栈操作指令等。
外部 RAM数据传送指令只能通过累加器 A进行,没有两个外部 RAM单元之间直接传送数据的指令。堆栈操作指令可以将某一直接寻址单元内容入栈,也可以把栈顶单元弹出到某一直接寻址单元,入栈和出栈要遵循“后入先出”的存储原则。数据传送类指令中还包含了一种交换指令,能将源地址单元和目的地址单元内容互换。
http://www.wenyuan.com.cn/webnew/
本章小结
算术运算指令 可以完成加、减、乘、除和加 1、减 1等运算。
加、减、乘、除指令要影响 PSW中的标志位 CY,AC,OV。
乘除运算只能通过累加器 A和 B寄存器进行。如果是进行
BCD码运算,在加法指令后面还要紧跟一条十进制调整指令,DA A”,它可以根据运算结果自动进行十进制调整,
使结果满足 BCD码运算规则。
http://www.wenyuan.com.cn/webnew/
本章小结
逻辑运算和移位操作指令 可以实现包括清 0、置 1、取反、
逻辑与、逻辑或、逻辑异或等逻辑运算和循环移位操作。
逻辑运算是将对应的存储单元按位进行逻辑操作,将结果保存在累加器 A中或者是某一个直接寻址存储单元中。如果保存结果的直接寻址单元是端口 P0~ P3,则为,读 —改 —
写,指令,即:将端口的内容读入 CPU进行逻辑运算,然后再回写到端口。
http://www.wenyuan.com.cn/webnew/
本章小结
控制转移类指令 是用来控制程序流程的,使用控制转移指令可以实现分支、循环等复杂程序结构,使程序变得巧妙、
实用、高效。控制转移指令的特点是修改 PC的内容,8051
单片机也正是通过修改 PC的内容来控制程序流程的。 8051
的控制转移指令分为无条件转移指令、条件转移指令、子程序调用和返回指令。在使用转移指令和调用指令时要注意转移范围和调用范围。绝对转移和绝对调用的范围是指令下一个存储单元所在的 2KB空间。长转移和长调用的范围是 64KB空间。采用相对寻址的转移指令转移范围是 256B。
http://www.wenyuan.com.cn/webnew/
本章小结
位操作指令 又称为 布尔操作指令,这类指令是对某一个可寻址位进行清 0,取反等操作,或者是根据位的状态进行控制转移 。 位操作指令采用的是位寻址方式,位寻址的寻址空间分为两部分:一是内部 RAM中的位寻址区,即内部
RAM的 20H~ 2FH单元,一共 128位,位地址是 00H~ 7FH;二是字节地址能被 8整除的特殊功能寄存器的可寻址位,共
83位 。
http://www.wenyuan.com.cn/webnew/
习 题
1,什么是指令系统? 8051单片机的指令按照功能分为几种? 分别有多少条指令?
2,什么是寻址方式? 8051单片机有哪几种寻址方式?
3,简述 8051单片机汇编语言指令格式和机器语言指令格式 。
4,指出下列指令中源操作数的寻址方式 。
MOV A,#55H
MOV A,2AH
MOV C,20H
MOV A,@R0
MOV @R0,A
MOV A,R0
MOVX A,@DPTR
MOV DPTR,#0123H
MOVC A,@A+PC
5,简述 8051的各种寻址方式的寻址空间 。
6,8051若访问特殊功能寄存器,可使用哪种寻址方式?
7,8051若访问片外 RAM单元,可使用哪种寻址方式?
8,8051若访问片内 RAM单元,可使用哪些寻址方式?
9,8051如果访问程序存储器,应该使用哪种寻址方式?
http://www.wenyuan.com.cn/webnew/
习 题
10,己知 (A)=7AH,(R0)=34H,(34H)=A5H,请写出分别执行下面各条指令后累加器 A的内容 。
(1) MOV A,R0
(2) MOV A,@R0
(3) MOV A,34H
(4) MOV A,#34H
11,己知 (A)=70H,(R0)=30H,(30H)=A0H,(PSW)=80H,请写出执行下列各条指令后累加器 A和相关存储单元的内容 。
(1) XCH A,R0
(2) XCH A,30H
(3) XCH A,@R0
(4) SWAP A
(5) ADD A,R0
(6) ADD A,30H
(7) ADD A,#30H
(8) ADDC A,30H
(9) SUBB A,30H
http://www.wenyuan.com.cn/webnew/
习 题
12,设 (R0)=32H,(A)=48H,片内 RAM中 (32H)=60H,(40H)=61H。 请指出在执行下列程序段后上述各单元内容的变化 。
MOV A,@R0
MOV @R0,40H
MOV 40H,A
MOV R0,#40H
13,已知 (A)=83H,(R0)=47H,(47H)=34H。 请写出执行完下列程序段后 A
的内容 。
ANL A,47H
ORL 47H,A
XRL A,@R0
SWAP A
14,说明下段程序执行过程中,SP的内容及堆栈中内容的改变过程 。
MOV SP,#30H
MOV 30,#55H
MOV 40,#66H
PUSH 30H
PUSH 40H
POP 30H
POP 40H
http://www.wenyuan.com.cn/webnew/
习 题
15,编程实现两个 16位二进制数的减法 。 设被减数放在 40H,41H单元中,
减数放在 50H,51H单元,差仍存于被减数地址单元中,减数,被减数都是低地址单元存放低 8位 。
16,编写一 BCD码拼字程序,将存放在 40H,41H单元的两个一位十进制数的
BCD码合并构成一个字节的压缩 BCD码,并将结果保存在 42H单元中 (高地址单元的 BCD码放在高 4位 )。
17,把片外数据存储器 4020H单元中的数据读到累加器中,应用哪几条指令?
18,试编写程序将外部 RAM 5000H单元内容传送至外部 RAM 6030H单元 。
19,度编写一多字节加法程序,将分别存放在 40H,41H和 50H,51H的两个
16位数相加 (高地址单元存放高 8位 ),结果存放于 40H,41H,42H单元中 。
20,试编写一段程序,将累加器 A的高 4位由 P1口的高 4位输出,P1口低 4位保持不变 。
21,试编写一段程序,将 P1口的高 5位置位,低 3位不变 。
22,试编写一段程序,将 R2中的数乘 4(用移位指令 )。
23,试编写程序,当累加器 A的内容 (无符号数 )小于 10时,程序转 NEXT处,
否则顺序执行 。
http://www.wenyuan.com.cn/webnew/
习 题
24,试编程比较内部 RAM 40H,41H单元的无符号数的大小,将较小的数存放在 42H单元中 。
25,使用位操作指令实现下列逻辑关系 。
(1) P1.0=(10H) ∨ Pl.1)∧ (ACC.0∨ CY)
(2) P1.3=(ACC.2∧ P1.0)⊕ (ACC.1∨ P1.1)
26,试编程将内部 RAM 30H~ 3FH单元中的内容全部清 0(利用循环转移指令 )。
27,在程序存储器中有一个常数表,从 2040H单元开始分别存放表格的第 0
项,第 1项 ……第 n项,试编程查出表格第 m项的内容 。
http://www.wenyuan.com.cn/webnew/
Q & A?
Thanks!
第 3章 8051指令系统
( 课时,12学时 )
http://www.wenyuan.com.cn/webnew/
教学目的
指令和指令系统的概念与分类。
掌握指令的格式和寻址方式。
掌握数据传送、算术运算、逻辑运算、控制转移和位操作指令的功能和应用。
学习重点和难点
指令的寻址方式。
控制转移指令和位操作指令。
http://www.wenyuan.com.cn/webnew/
第 3章 8051指令系统
3.1 汇编语言
3.2 数据传送指令
3.3 算术运算指令
3.4 逻辑操作指令
3.5 控制程序转移类指令
3.6 位操作类指令
本章小结
习题
http://www.wenyuan.com.cn/webnew/
3.1 汇编语言
3.1.1 指令系统分类
3.1.2 指令格式
3.1.3 寻址方式
3.1.4 寻址空间及符号注释
http://www.wenyuan.com.cn/webnew/
3.1.1 指令系统分类基本概念
指令 是 CPU根据人的意图来执行某种操作的命令 。 指令常以其英文名称或者缩写形式作为助记符 。
一台计算机所能执行的全部指令的集合称为这个 CPU的 指令系统 。
采用助记符表示的指令称为 汇编语言 。
使用这种指令编写的程序称为 汇编语言程序 。
http://www.wenyuan.com.cn/webnew/
指令系统分类(一)
按照指令的 功能 划分,8051指令可分为以下五类:
数据传送 类指令 (29条 )
算术运算 类指令 (24条 )
逻辑运算 类指令 (24条 )
控制转移 类指令 (17条 )
位操作 类指令 (17条 )
http://www.wenyuan.com.cn/webnew/
指令系统分类(二)
按照指令占用的 存储空间 可分为:
单字节指令 (49条 )
双字节指令 (45条 )
三字节指令 (17条 )
按照指令的 执行时间 可分为:
单周期指令 (64条 )
双周期指令 (45条 )
四周期指令 (2条,乘,除法指令 )
http://www.wenyuan.com.cn/webnew/
3.1.2 指令格式
8051汇编语言指令由 操作码 段和 操作数 字段两部分组成。
汇编语言指令格式
[标号,] 操作码助记符 [目的操作数 ] [,源操作数 ] [;注释 ]
机器语言指令格式
双字节指令格式操作码代码 操作数或者地址
三字节指令格式操作码代码 操作数或地址,操作数或地址
http://www.wenyuan.com.cn/webnew/
3.1.3 寻址方式基本概念
寻址 就是寻找指令中操作数或操作数所在地址 。
寻址方式 就是找到存放操作数的地址,并把操作数提取出来的方法,即寻找操作数或者是操作数地址的方法 。
8051单片机寻址方式共有 7种,寄存器 寻址,直接 寻址,立即数 寻址,寄存器间接 寻址,变址 寻址,相对 寻址和 位 寻址 。
http://www.wenyuan.com.cn/webnew/
1,寄存器寻址
寄存器寻址就是操作数存放在寄存器中,指令中指定的寄存器的内容就是操作数 。
在寄存器寻址方式中以符号名称来表示寄存器 。
寄存器寻址方式的寻址范围包括:
通用工作寄存器 ——有 4组共 32个通用工作寄存器。
部分专用寄存器 ——累加器 A,B寄存器,DPTR寄存器。
http://www.wenyuan.com.cn/webnew/
2,直接寻址
直接寻址方式就是在指令中直接给出操作数所在存储单元的地址 。 此时,指令中操作数部分是操作数所在地址 。
直接寻址方式的寻址范围是内部 RAM,具体包括:
片内 RAM的 128个单元 ——在指令中以直接地址给出。
特殊功能寄存器 (SFR)——既可使用它们的 地址,也可使用它们的 名字 。
http://www.wenyuan.com.cn/webnew/
3,立即数寻址
立即数寻址就是操作数在指令中直接给出,或者说指令操作码后面立即给出一字节或两字节操作数 。
指令中给出的操作数是立即数,立即数前加,#”号标志,
以区别直接寻址中的直接地址 。
16位立即数传送指令,MOV DPTR,#datal6”,其中
#data16是一个 16位立即数 。
http://www.wenyuan.com.cn/webnew/
4,寄存器间接寻址
寄存器间接寻址是把指定寄存器的内容作为操作数地址,
该地址所指定的单元内容作为操作数 。
为了区分寄存器寻址和寄存器间接寻址,在寄存器间接寻址中,所用到的寄存器的前面要加间接寻址符,@”。
寄存器 R0,R1和数据指针 DPTR可以作为间接寻址寄存器 。
http://www.wenyuan.com.cn/webnew/
寄存器间接寻址示意图例如,寄存器 R0内容为 30H,片内 RAM 30H单元的内容为 45H。
解,指令,MOV A,R0”的功能是将 R0的内容 30H传送给累加器 A,
指令执行结果是 累加器 A中的内容为 30H。
指令,MOV A,@R0”的功能是将 R0的内容 30H作为操作数的地址,根据这一地址找到内部 RAM 30H单元,将其内容 45H
传送至累加器 A,指令执行结果是 累加器 A中内容为 45H。
R A M
地址 R0
30H
45H
30H
A
45H
4,寄存器间接寻址
http://www.wenyuan.com.cn/webnew/
5,变址寻址 (基址寄存器 +变址寄存器间接寻址 )
变址寻址是以 DPTR或者 PC作为基址寄存器,其内容为 基地址,以累加器 A作为变址寄存器,其内容为 变址,并将两个寄存器内容也就是基址和变址相加,形成 16位操作数地址 。
然后在程序存储器中找到该地址所对应的单元,其内容即为操作数 。
http://www.wenyuan.com.cn/webnew/
变址 寻址 示意图例如,指令,MOVC A,@A+DPTR”是变址寻址 。
解:假设 DPTR的内容为
2030H,累加器 A的内容为 12H。
该指令的功能是将
2030H和 12H相加,
得到 2042H作为操作数地址,在程序存储器中找到 2042H单元,将其内容送至累加器 A。
R O M
D P T R
+ = 2042H
2030H
12H
56H
56H
A
A 7
A0
地址
5,变址寻址 (基址寄存器 +变址寄存器间接寻址 )
http://www.wenyuan.com.cn/webnew/
6,相对寻址
相对转移指令执行时,是以当前的 PC值加上指令中规定的偏移量 rel而形成实际的转移地址 。 这里所说的 PC的当前值是执行完相对转移指令后的 PC值 。
一般将相对转移指令操作码所在地址称为源地址,转移后的地址称为目的地址。于是有:
目的地址 =源地址 +相对转移指令本身字节数 +rel
相对寻址只出现在相对转移指令中,以修正 PC的方式来控制程序的转移目的。
http://www.wenyuan.com.cn/webnew/
相对转移指令操作示意图例如,在 程 序 存 储器 中
2000H单元有一条双字节的相对转移指令
,SJMP 75H”。
解:程序存储器 2000H、
2001H单元的内容 80H、
75H是,SJMP 75H”的机器语言代码 。
6,相对寻址
http://www.wenyuan.com.cn/webnew/
7,位寻址
位寻址指令中给出的是位地址,即片内 RAM某一单元中的一位 。 位地址在指令中用 bit表示 。
单片机片内 RAM有两个区域可以进行位寻址。具体如下:
内部 RAM中的位寻址区 ——该区共有 16个单元,单元地址是
20H~ 2FH,一共有 128位,位地址为 00~ 7FH。
特殊功能寄存器的可操作位 ——有 11个单元地址能被 8整除的寄存器,它们都可以进行位寻址,实际可寻址位为 83个。
http://www.wenyuan.com.cn/webnew/
可寻址位在指令中的表示方式
① 直接使用 位地址 。
例,PSW寄存器的第 5位可表示为 D5H。
20H单元的第 7位可表示为 07H。
② 用 位名称 表示。
例,PSW寄存器的第 5位可表示为 F0。
③ 单元地址加位号 表示。
例,PSW寄存器的第 5位可表示为 D0H.5。
20H单元的第 7位可表示为 20H.7。
④ 可以用 寄存器名称加位号 表示。
例,PSW寄存器的第 5位可表示为 PSW.5。
http://www.wenyuan.com.cn/webnew/
3.1.4 寻址空间及符号注释寻址方式 寻址空间直接寻址 片内 RAM低 128字节和特殊功能寄存器 (只能采用直接寻址 )
寄存器寻址 工作寄存器 R0~ R7,A,B,DPTR
寄存器间接寻址片内 RAM低 128字节 (@R0,@R1,SP用于 PUSH/POP指令时 )
片外 RAM(@R0,@R1,@DPTR)
变址寻址 程序存储器相对寻址 程序存储器 (控制转移用 )
位寻址 片内 RAM20~ 2FH单元的 128个可寻址位和特殊功能寄存器中的 83个可寻址位
http://www.wenyuan.com.cn/webnew/
寻址方式中常用符号注释
Rn (n=0~ 7),当前选中的工作寄存器组 R0~ R7。它在片内数据存储器中的地址由 PSW中的 RSl和 RS0确定,可以是 00H~ 07H(第 0组 ),08H~
0FH(第 1组 ),10H~ 17H(第 2组 )或 18H~ 1FH(第 3组 )。
Ri (i=0,1),当前选中的工作寄存器组中可以用于寄存器间接寻址的的两个工作寄存器 R0,R1。它在片内数据存储器中的地址由 RSl,RS0确定,分别有 01H,02H; 08H,09H; 10H,11H和 18H,19H。
#data,8位立即数,即包含在指令中的 8位操作数。
#data16,16位立即数,即包含在指令中的 16位操作数。
direct,8位片内 RAM单元 (包括 SFR)的直接地址。
addr11,11位目的地址,用于 ACALL和 AJMP指令中。
addr16,16位目的地址,用于 LCALL和 LJMP指令中。
rel,补码形式的 8位地址偏移量,以下条指令第一字节地址为基值。
地址偏移量在 -128~ +127范围内。
bit,片内 RAM或 SFR的直接寻址位地址。
@,间接寻址方式中,表示间接寻址的符号。
/,位操作指令中,表示对该位先取反再参与操作,但不影响该位原值。
(X),某一个寄存器或者存储单元 X中的内容。
((X)),由 X间接寻址的单元的内容,即 X指向的地址单元中的内容。
←,指令中数据的传送方向,将箭头右边的内容送入箭头左边的单元。
http://www.wenyuan.com.cn/webnew/
3.2 数据传送指令
3.2.1 内部 RAM数据传送指令
3.2.2 外部 RAM传送指令
3.2.3 查表指令
3.2.4 交换指令
3.2.5 堆栈操作指令
3.2.6 数据传送类指令应用实例
http://www.wenyuan.com.cn/webnew/
3.2.1 内部 RAM数据传送指令
内部 RAM数据传送指令共有 15条,用于 8051单片机片内数据存储器和寄存器之间的数据传送。
采用的寻址方式有:
立即数寻址直接寻址寄存器寻址寄存器间接寻址
数据传输形式如右图所示。
A
@ Ri
# d a ta Rn
d ire c t
http://www.wenyuan.com.cn/webnew/
3.2.1 内部 RAM数据传送指令
1,以累加器 A为目的操作数的指令汇编指令格式 机器指令格式 操 作
MOV A,Rn E8H~ EFH A ← (Rn)
MOV A,direct E5H direct A ← (direct)
MOV A,@Ri E6H~ E7H A ← ((Ri))
MOV A,#data 74H data A ← #data
注意:上述操作不影响源字节和任何别的寄存器内容,只影响
PSW的 P标志位。
http://www.wenyuan.com.cn/webnew/
3.2.1 内部 RAM数据传送指令
2,以寄存器 Rn为目的操作数的指令汇编指令格式 机器指令格式 操 作
MOV Rn,A F8H~ FFH Rn ← (A)
MOV Rn,direct A8H~ AFH direct Rn ← (direct)
MOV Rn,#data 78H~ 7FH data Rn ← #data
注意,8051指令系统中没有,MOV Rn,@Ri”和,MOV Rn,Rn”
传送指令,也没有,MOV @Ri,@Ri”指令。
http://www.wenyuan.com.cn/webnew/
3.2.1 内部 RAM数据传送指令
3,以直接地址为目的操作数的指令汇编指令格式 机器指令格式 操作
MOV direct,A F5H direct direct ← (A)
MOV direct,Rn 88H~ 8FH direct direct ← (Rn)
MOV direct2,direct1 85H direct1 direct2 direct2 ← (direct1)
MOV direct,@Ri 86H~ 87H direct direct ← ((Ri))
MOV direct,#data 75H direct data direct ← # data
注意:,MOV direct2,direct1”指令在译成机器码时,源地址在前,目的地址在后。如,MOV 50H,90H”的机器码为,85 90
50” 。
http://www.wenyuan.com.cn/webnew/
3.2.1 内部 RAM数据传送指令
4,间接地址为目的操作数的指令汇编指令格式 机器指令格式 操 作
MOV @Ri,A F6H~ F7H (Ri) ← (A)
MOV @Ri,direct A6H~ A7H direct (Ri) ← (direct)
MOV @Ri,#data 76H~ 77H data (Ri) ← data
注意,(Ri)表示以 Ri中的内容为地址所指定的 RAM单元。
5,十六位数据传送指令汇编指令格式 机器指令格式 操 作
MOV DPTR,#data16 90H dataH dataL DPH ← dataH,
DPL ← dataL
注意:这是唯一的 16位立即数传送指令 。
http://www.wenyuan.com.cn/webnew/
3.2.2 外部 RAM传送指令汇编指令格式 机器指令格式 操 作
MOVX @DPTR,A F0H 外 ((DPTR)) ← (A)
MOVX A,@DPTR E0H A ← 外 ((DPTR))
MOVX @Ri,A F2H~ F3H 外 ((Ri) ) ← (A)
MOVX A,@Ri E2H~ E3H A ← 外 ((Ri))
注意,8051没有专门的输入 / 输出指令,在访问外部的设备时,可以采用这种方式与外部设备的端口打交道。
A
寄存器间接寻址
@Ri
外部 RA M 2 5 6 B
寄存器间接寻址
@D P T R
外部 RA M 6 4 KB
http://www.wenyuan.com.cn/webnew/
3.2.3 查表指令汇编指令格式 机器指令格式 操 作
MOVC A,@A+DPTR 93H PC ← (PC)+1,
A ← ((A)+(DPTR))
MOVC A,@A+PC 83H PC ← (PC)+1,
A ← ((A)+(PC))
注意:前一条指令只能查找指令所在位置以后 256B
范围内的代码或常数,后一条指令查表范围可达整个程序存储器的 64KB空间。
A
@ A + D P T R 变址远程查表
R O M 6 4 K B
@ A + P C 变址近程查表
R O M 指令附近 256B
http://www.wenyuan.com.cn/webnew/
3.2.4 交换指令
1,字节交换指令汇编指令格式 机器指令格式 操 作
XCH A,Rn C8~ CFH (A)? (Rn)
XCH A,direct C5H (A)? (direct)
XCH A,@Ri C6H~ C7H (A)? ((Ri))
注意:该操作只影响标志位 P。
2,半字节交换指令汇编指令格式 机器指令格式 操 作
XCHD A,@Ri D6H~ D7H (A)0~ 3? ((Ri))0~ 3
注意:该操作只影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.2.4 交换指令
3,累加器半字节交换指令汇编指令格式 机器码格式 操 作
SWAP A C4H (A)0~ 3? (A)4~ 7
注意:该操作不影响标志位 P。
S W A P
X C H
X C H D
A Rn @R i
di r ec t
http://www.wenyuan.com.cn/webnew/
3.2.5 堆栈操作指令
1,入栈指令汇编指令格式 机器指令格式 操 作
PUSH direct C0H direct SP ← (SP)+1,
(SP) ← (direct)
注意:堆栈指针 SP先加 1,并指向栈顶的上一个空单元,然后再将直接地址 (direct)寻址的单元内容压入当前 SP所指示的堆栈单元中。该操作不影响标志位 P。
2,出栈指令汇编指令格式 机器指令格式 操 作
POP direct D0H direct direct ← ((SP)),
SP ← (SP)-1
注意:先将堆栈指针 (SP)所指示的内部 RAM(栈顶 )单元中内容送入由直接地址寻址的单元中,然后再将栈指针 (SP)减 1并回送
SP。该操作不影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.2.6 数据传送类指令应用实例
【 例 5】 使用不同的指令将累加器 A的内容送至内部 RAM的 26H
单元。
解:在访问内部 RAM时,可以有多种寻址方式供选择,在实际应用中要注意根据实际情况选择合适的寻址方式来进行数据传送。可以通过下面指令采用不同寻址方式实现。
① MOV 26H,A ; 目的操作数采用直接寻址,
源操作数采用寄存器寻址
② MOV R0,#26H
MOV @R0,A ; 目的操作数采用寄存器间接寻址,
源操作数采用寄存器寻址
③ MOV 26H,ACC ; 采用直接寻址
④ MOV 26H,0E0H ; 采用直接寻址
⑤ PUSH ACC ; 利用栈操作,直接寻址
POP 26H
http://www.wenyuan.com.cn/webnew/
3.2.6 数据传送类指令应用实例
【 例 6】 已知 (A)=23H,(R0)=30H,内部 RAM(30H)=45H,
(45H)=56H,试分析分别执行下列指令后累加器 A的内容,
并写出源操作数的寻址方式。
解:这四条指令代表了数据传送指令中常用的四种寻址方式,
在使用时要特别注意不同寻址方式的区别,搞清楚谁是最终的操作数。要注意题中第一条指令与第二条指令、第三条与第四条指令的区别。
指令 结果 寻址方式
MOV A,R0 (A)=30H 寄存器寻址
MOV A,@R0 (A)=45H 寄存器间接寻址
MOV A,45H (A)=56H 直接寻址
MOV A,#45H (A)=45H 立即数寻址
http://www.wenyuan.com.cn/webnew/
3.2.6 数据传送类指令应用实例
【 例 7】 将外部 RAM 2000H单元的内容传送至外部 RAM 3000H
单元。
解,8051单片机指令系统中没有外部 RAM两个单元直接传送数据的指令,只有外部 RAM和累加器的传送指令,要想实现题目中要求的功能,必须通过累加器 A进行。
具体程序如下:
MOV DPTR,#2000H ;送源数据地址
MOVX A,@DPTR ;源数据送累加器
MOV DPTR,#3000H ;送数据目的地址
MOVX @DPTR,A ;累加器内容送目的单元
http://www.wenyuan.com.cn/webnew/
3.2.6 数据传送类指令应用实例
【 例 8】 (A)=20H,(B)=30H,分析执行下面指令以后的结果。
PUSH ACC
PUSH B
POP ACC
POP B
解:根据堆栈的,先入后出、后入先出,操作原则进行分析,
执行上面指令以后结果为,(A)=30H,(B)=20H。
程序执行结果和初始状态比较,两寄存器内容进行了互换,
正是由“先入后出”的存储原则造成的。
在子程序调用时,堆栈经常用来保护现场,利用 PUSH保护现场,利用 POP恢复现场。 恢复现场时,一定要注意 POP指令的顺序要和 PUSH指令对称,后压入的数据先弹出,先压入的数据后弹出,使得现场正确恢复到原来状态。
http://www.wenyuan.com.cn/webnew/
3.2.6 数据传送类指令应用实例
【 例 9】 在程序存储器中有一平方表,从 2000H单元开始存放,如图所示,试通过查表指令查找出 6的平方。
解:采用 DPTR作为基址寄存器的查表程序比较简单,查表范围大,也容易理解。只要预先使用一条 16位数据传送指令,把表的首地址 2000H
送入 DPTR,然后进行查表就可以了。
相应的程序如下:
MOV A,#6 ;设定备查的表项
MOV DPTR,#2000H ;设置 DPTR为表始址
MOVC A,@A+DPTR ;将 A的平方值查表后送 A
如果需要查找其他数的平方,只需要将累加器
A的内容 (变址 )改一下即可。
2000H 0
2001H 1
2002H 4
2003H 9
2004H 16
2005H 25
2006H 36
2007H 49
2008H 64
2009H 81
http://www.wenyuan.com.cn/webnew/
3.3 算术运算指令
3.3.1 加法、减法指令
3.3.2 乘法、除法指令
3.3.3 加 1、减 1指令
3.3.4 十进制调整指令
3.3.5 算术运算类指令应用实例
http://www.wenyuan.com.cn/webnew/
3.3.1 加法、减法指令
1,加法类指令汇编指令格式 机器指令格式 操 作
ADD A,Rn 28H~ 2FH A ← (A)+(Rn)
ADD A,direct 25H direct A ← (A)+(direct)
ADD A,@Ri 26H~ 27H A ← (A)+((Ri))
ADD A,#data 24H data A ← (A)+#data
注意:当和的第 3位或第 7位有进位时,分别将 AC,CY标志位置 1;否则为 0。如果第 6位向第 7位有进位而第 7位没有向前进位,或者如果第 7位向前有进位而第 6位没有向第 7位进位,OV=1,否则 OV=0。该操作也影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.3.1 加法、减法指令
2,带进位加法指令汇编指令格式 机器指令格式 操 作
ADDC A,Rn 38H~ 3FH A ← (A) +(Rn) +CY
ADDC A,direct 35H direct A ← (A)+(direct)+CY
ADDC A,@Ri 36H~ 37H A ← (A)+((Ri))+CY
ADDC A,#data 34H data A ← (A)+#data+CY
注意:本指令的执行将影响标志位 AC,CY,OV,P,与 ADD
指令相同 。
http://www.wenyuan.com.cn/webnew/
3.3.1 加法、减法指令
3,带借位减法指令汇编指令格式 机器指令格式 操 作
SUBB A,Rn 98H~ 9FH A ← (A)-CY-(Rn)
SUBB A,direct 95H direct A ← (A)-CY-(direct)
SUBB A,@Ri 96H~ 97H A ← (A)-CY-((Ri))
SUBB A,#data 94H data A ← (A)-CY-#data
注意:在执行不带借位的运算时,可在,SUBB”指令前用
,CLR C”指令将 CY清 0。如果第 7位有借位,则 CY置 1,否则清 0。若第 3位有借位,则 AC置 1;否则清 0。两个带符号数相减,还要考查 OV标志,若 OV为 1,表示差数溢出,即破坏了正确结果的符号位。该操作也影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.3.2 乘法、除法指令
1,乘法指令汇编指令格式 机器指令格式 操 作
MUL AB A4H BA ← (A)× (B)
注意:若乘积大于 0FFH,则 OV置 1,否则清 0(此时 B的内容为
0)。 CY总是被清 0。该操作也影响标志位 P。
2,除法指令汇编指令格式 机器指令格式 操 作
DIV AB 84H A← (A)÷ (B)的商,
B← (A)÷ (B)的余数注意:若除数 (B)=00H,则结果无法确定,则 OV置 1。 CY总是被清 0。该操作也影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.3.3 加 1、减 1指令
1,加 1指令汇编指令格式 机器指令格式 操 作
INC A 04H A ← (A)+1
INC Rn 08H~ 0FH Rn ← (Rn)+1
INC direct 05H direct direct ← (direct)+1
INC @Ri 06H~ 07H (Ri) ← ((Ri))+l
INC DPTR A3H DPTR ← (DPTR)+1
注意:该操作不影响 PSW标志位。
http://www.wenyuan.com.cn/webnew/
3.3.3 加 1、减 1指令
2,减 1指令汇编指令格式 机器指令格式 操 作
DEC A 14H A ← (A)-1
DEC Rn 18H~ 1FH Rn ← (Rn)-l
DEC direct 15H direct direct ← (direct)-1
DEC @Ri 16H~ 17H (Ri) ← ((Ri))-1
注意:该操作不影响 PSW标志位。
http://www.wenyuan.com.cn/webnew/
3.3.4 十进制调整指令汇编指令格式 机器码格式 操 作
DA A D4H 调整累加器 A内容为 BCD码注意:这条指令一般跟在 ADD或 ADDC指令后,将相加后存放在累加器中的结果进行十进制调整,完成十进制加法运算功能(不能用于十进制减法的调整 )。调整方法如下:
若 (A0-3)>9或 AC=1,则 (A0-3)+6→ A0-3
若 (A4-7)>9或 CY=1,则 (A4-7)+6→ A4-7
该操作影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.3.5 算术运算类指令应用实例
【 例 13】 有两个 BCD码表示的 4位十进制数,分别存放在内部数据存储器的 50H~ 51H单元和 60H~ 61H单元,试编写程序求这两个数之和,并将结果存放在 40H~ 42H
单元。
解,求两个 BCD数之和的运算程序如下:
MOV A,50H ;取第一个数低 2位 BCD码
ADD A,60H ;加第二个数低 2位 BCD码
DA A ;十进制调整
MOV 40H,A ;保存结果的低 2位
MOV A,51H ;取高位 BCD码
ADDC A,61H ;高位相加
DA A ;十进制调整
MOV 41H,A ;保存结果的高 2位
MOV A,#00H
ADDC A,#00H ;计算进位
MOV 42H,A ;保存进位
http://www.wenyuan.com.cn/webnew/
3.3.5 算术运算类指令应用实例
【 例 14】 试编程计算 5678H~ 1234H的值,结果保存在 R6、
R5中。
解:减数和被减数都是 16位二进制数,计算时要先进行低 8
位的减法,然后再进行高 8位的减法,在进行低 8位减法时,不需要考虑借位,所以要在减法指令之前将借位标志清 0。程序如下:
MOV A,#78H ;被减数低 8位送累加器
CLR C ;清进位标志位 CY
SUBB A,#34H ;减去减数
MOV R5,A ;保存低 8位
MOV A,#56H ;被减数高 8位送累加器
SUBB A,#12H ;减去减数
MOV R6,A ;保存高 8位
http://www.wenyuan.com.cn/webnew/
3.3.5 算术运算类指令应用实例
【 例 15】 试分析执行下列指令以后,寄存器和内部 RAM的状态。
MOV R0,#30H ;数 30H送入 R0
MOV 30H,#40H ;数 40H送入片内 RAM 30H单元
MOV 31H,#50H ;数 50H送入片内 RAM 31H单元
INC @R0 ;将片内 RAM 30H单元中的内容加 1
INC R0 ;将 R0中的内容加 1
INC @R0 ;将片内 RAM 31H单元中的内容加 1
解:分析结果,(R0)=31H
(30H)=41H
(31H)=51H
http://www.wenyuan.com.cn/webnew/
3.4 逻辑操作指令
3.4.1 逻辑,与,,,或,,,异或,指令
3.4.2 清零、取反指令
3.4.3 循环移位指令
3.4.4 逻辑运算类指令应用实例
http://www.wenyuan.com.cn/webnew/
3.4.1 逻辑,与,,,或,,,异或,
指令
1,逻辑“与”指令汇编指令格式 机器指令格式 操 作
ANL A,Rn 58H~ 5FH A ← (A)∧ (Rn)
ANL A,direce 55H direct A ← (A)∧ (direct)
ANL A,@Ri 56H~ 57H A ← (A)∧ ((Ri))
ANL A,#data 54H data A ← (A)∧ #data
ANL direct,A 52H direct direct ← (direct)∧ (A)
ANL direct,#data 53H direct data direct ← (direct)∧ #data
注意:后 2条指令若直接地址正好是 I/O端口 P0~ P3,则为端口的
“读 —改 —写”操作。前 4条指令的操作影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.4.1 逻辑,与,,,或,,,异或,
指令
2,逻辑“或”指令汇编指令格式 机器指令格式 操 作
ORL A,Rn 48H~ 4FH A ← (A)∨ (Rn)
ORL A,direct 45H direct A ← (A)∨ (direct)
ORL A,@Ri 46H~ 47H A ← (A)∨ ((Ri))
ORL A,#data 44H data A ← (A)∨ #data
ORL direct,A 42H direct direct ← (direct)∨ (A)
ORL direct,#data 43H direct data direct ← (direct)∨ #data
注意:后 2条指令若直接地址正好是 I/O端口 P0~ P3,则为端口的
“读 —改 —写”操作。前 4条指令的操作影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.4.1 逻辑,与,,,或,,,异或,
指令
3,逻辑“异或”指令汇编指令格式 机器指令格式 操 作
XRL A,Rn 68H~ 6FH A ← (A)⊕ (Rn)
XRL A,direct 65H direct A ← (direct)⊕ (A)
XRL A,@Ri 66H~ 67H A ← (A)⊕ ((Ri))
XRL A,#data 64H data A ← (A)⊕ #data
XRL direct,A 62H direct direct ← (direct)⊕ (A)
XRL direct,#data 63H direct data direct ← (direct)⊕ #data
注意:后 2条指令若直接地址正好是 I/O端口 P0~ P3,则为端口的
“读 —改 —写”操作。前 4条指令的操作影响标志位 P。
http://www.wenyuan.com.cn/webnew/
3.4.2 清零、取反指令
1,累加器 A清 0指令汇编指令格式 机器指令格式 操 作
CLR A E4H A ← 0
注意:该操作影响标志位 P。
2,累加器 A取反指令汇编指令格式 机器指令格式 操 作
CPL A F4H A ← ( )
对累加器 A的内容逐位取反,不影响标志位。
注意:该操作不影响标志位 P。
A
http://www.wenyuan.com.cn/webnew/
3.4.3 循环移位指令
1,累加器 A循环左移指令汇编指令格式 机器指令格式 操 作
RL A 23H
注意:该操作不影响 PSW标志位。
2,累加器 A循环右移指令汇编指令格式 机器指令格式 操 作
RR A 03H
注意:该操作不影响 PSW标志位。
http://www.wenyuan.com.cn/webnew/
3.4.3 循环移位指令
3,累加器 A带进位循环左移指令汇编指令格式 机器指令格式 操 作
RLC A 33H
注意:该操作影响标志位 P和 CY。
4,累加器 A带进位循环右移指令汇编指令格式 机器指令格式 操 作
RRC A 23H
注意:该操作影响标志位 P和 CY 。
http://www.wenyuan.com.cn/webnew/
3.4.4 逻辑运算类指令应用实例
【 例 16】 将 P1口的 P1.2,P1.3,P1.7清零,其余位不变。
解:相应的指令为:
ANL P1,#01110011B
【 例 17】 利用逻辑运算指令将 P1口的 P1.1,P1.3,P1.5置 1,
其余位保持不变。
解:相应的指令为:
ORL P1,#00101010B
【 例 18】 利用逻辑运算指令,将内部 RAM中 40H单元的 1,3、
5,7位取反,其他位保持不变。
解:相应指令为:
XRL 40H,#0AAH ;0AAH=10101010B
http://www.wenyuan.com.cn/webnew/
3.4.4 逻辑运算类指令应用实例
【 例 19】 利用逻辑运算指令将当前工作寄存器设定为第 3组工作寄存器。
解:相应指令为:
ORL PSW,#00011000B
【 例 20】 无符号 8位二进制数 (A)=00111101B=3DH,CY=0。
试分析执行,RLC A”指令后累加器 A的内容。
解:执行指令,RLC A”的结果为
(A)=01111010B=7AH
CY=0
7AH正是 3DH的 2倍,该指令执行的是乘 2操作。
http://www.wenyuan.com.cn/webnew/
3.4.4 逻辑运算类指令应用实例
【 例 21】 拆字程序:在内部 RAM 40H单元保存有以压缩 BCD码表示的 2位十进制数,编程将它们拆开,分别保存在内部
RAM的 41H,42H单元。
解:程序如下:
MOV A,40H ;压缩 BCD码送累加器
ANL A,#0FH ;高 4位清 0,保留低 4位
MOV 41H,A ;保存低 4位 BCD码
MOV A,40H ;取数据
MOV A,#0F0H ;低 4位清 0,保留高 4位
SWAP A ;高低位交换
MOV 42H,A ;保存高 4位 BCD码
http://www.wenyuan.com.cn/webnew/
3.5 控制程序转移类指令
3.5.1 无条件转移指令
3.5.2 条件转移指令
3.5.3 调用、返回指令
3.5.4 空操作指令
3.5.5 控制转移类指令应用实例
http://www.wenyuan.com.cn/webnew/
3.5.1 无条件转移指令
无条件转移指令是指当程序执行到该指令时,程序无条件转移到指令所提供的地址处执行。
无条件转移类指令有四类,
绝对转移 ——LJMP
长转移 ——AJMP
相对转移 (短转移 )——SJMP
间接转移 (散转指令 )——JMP
http://www.wenyuan.com.cn/webnew/
3.5.1 无条件转移指令
1,绝对转移指令汇编指令格式 机器指令格式 操 作
AJMP addr11 a10a9a800001 a7~ a0 PC← (PC)+2,
PC10~ 0← addrll,
(PC15~ 11)不变注意:本条指令提供 11
位地址,可在该指令后面一个存储单元所在的
2KB区域内无条件转移。
地址
R OM
2 KB A JM P ad d r 1 1
PC
+2
http://www.wenyuan.com.cn/webnew/
3.5.1 无条件转移指令
2,长转移指令汇编指令格式 机器指令格式 操 作
LJMP addr16 02H addr16 PC ← addrl6
注意:本条指令提供 16
位目的地址,所以程序可转向 64KB程序存储器地址空间的任何单元。
FFFFH
0 0 0 0 H
G
L J MP a d d r16 64K
ROM
地址
…
http://www.wenyuan.com.cn/webnew/
3.5.1 无条件转移指令
3,相对转移 (短转移 )指令汇编指令格式 机器指令格式 操 作
SJMP rel 80H rel PC ← (PC)+2,
PC ← (PC)+rel
注意:本条指令的操作数是相对地址,rel是一个带符号的偏移量 (补码 ),其范围为 -128~ +127共 256字节。负数表示反向转移,正数表示正向转移。
如果指令中偏移量 rel=FEH,因为 FEH是 -2的补码,所以转移目的地址 =PC+2-2=PC,结果转向自己,导致无限循环。
这条指令称为原地踏步指令,即程序执行到这条指令时,
不再向下执行,而在该指令处原地踏步。
http://www.wenyuan.com.cn/webnew/
3.5.1 无条件转移指令
4,间接转移指令 (散转指令 )
汇编指令格式 机器指令格式 操 作
JMP @A+DPTR 73H PC ← (A)+(DPTR)
注意:该指令采用的是变址寻址方式,指令执行过程对 DPTR、
A和标志位均无影响。这条指令可以根据累加器 A的不同值实现多个方向的转移,可代替众多的判断跳转指令,具有散转功能,所以又称散转指令。
http://www.wenyuan.com.cn/webnew/
3.5.2 条件转移指令
条件转移指令是指根据给出的条件进行判断,
若 条件满足,则程序转向由偏移量确定的目的地址处去执行。
若 条件不满足,程序将不会转移,而是按原顺序执行。
8051有丰富的条件转移指令。
http://www.wenyuan.com.cn/webnew/
3.5.2 条件转移指令
1,累加器判零转移指令汇编指令格式 机器指令格式 操 作
JZ rel 60H rel PC ← (PC)+2
若 A=0,则程序转移 PC← (PC)+rel
若 A≠0,则程序往下顺序执行
JNZ rel 50H rel PC ← (PC)+2
若 A≠0,则程序转移 PC← (PC)+rel
若 A=0,则程序往下顺序执行注意:相对偏移量为一个带符号的 8位数,偏移范围为 -128~
+127,共 256个字节。本指令不改变累加器 A的内容,也不影响任何标志位。
http://www.wenyuan.com.cn/webnew/
3.5.2 条件转移指令
2,比较转移指令汇编指令格式 机器指令格式 操 作
CJNE A,direct,rel B5H direct rel 累加器内容和直接寻址单元比较
CJNE A,#data,rel B4H data rel 累加器和立即数比较
CJNE Rn,#data,rel B6H~ B7H data rel 寄存器内容和立即数比较
CJNE @Ri,#data,rel B8H~ BFH data rel 间接寻址单元内容和立即数比较注意:若目的操作数 =源操作数,程序顺序执行,CY=0;
若目的操作数 >源操作数,程序转移,PC← (PC)+rel,并且 CY=0;
若目的操作数 <源操作数,程序转移,PC← (PC)+rel,并且 CY=1。本指令执行后不影响任何操作数。
http://www.wenyuan.com.cn/webnew/
3.5.2 条件转移指令
3,减 1非 0转移指令 (循环转移指令 )
汇编指令格式 机器指令格式 操 作
DJNZ Rn,rel D8H~ DFH rel PC ← (PC)+2,
Rn ← (Rn)-1;
若 (Rn)≠0,则程序转移 PC← (PC)+rel;
若 (Rn)=0,则程序往下顺序执行
DJNZ direct,rel D5H direct rel PC ← (PC)+3,
direct ← (direct)-1
若 (direct)≠0,则程序转移 PC← (PC)+rel;
若 (direct)=0,则程序往下顺序执行
http://www.wenyuan.com.cn/webnew/
3.5.2 条件转移指令
3,减 1非 0转移指令 (循环转移指令 )
注意:在一般的应用中,
经常把 rel设为负值,
使得程序负向跳转。
通过改变指令中 Rn或者 direct单元的内容,
就可以控制程序负向跳转的次数,也就控制了程序循环的次数,
所以该指令又称为循环转移指令。
http://www.wenyuan.com.cn/webnew/
3.5.3 调用、返回指令
通常把具有一定功能的公用程序段作为 子程序,在主程序中采用调用指令 调用子程序,子程序的最后一条指令为 返回主程序 指令 (RET)。
8051指令系统中有两条调用指令,分别是 绝对调用 和 长调用指令 。
主程序调用子程序及从子程序返回主程序的过程如右图所示。
返回调用 断点返回调用子程序主程序主程序主程序断点
http://www.wenyuan.com.cn/webnew/
3.5.3 调用、返回指令
1,绝对调用指令汇编指令格式 机器指令格式 操 作
ACALL addr11 a10a9a810001 a7~ a0 PC ← (PC)+2
SP ← (SP)+1,(SP) ← (PC0~ PC7)
SP ← (SP)+1,(SP) ← (PC8~ PC 15)
PC0~ PC10 ← addr0~ 10,PC11~ PC15不变注意:本指令提供 11位子程序目的地址,调用地址的形成方法和绝对转移指令类似;被调用的子程序首地址必须在 ACALL
指令后一字节所在的 2KB范围内的程序存储器中。
http://www.wenyuan.com.cn/webnew/
3.5.3 调用、返回指令
2,长调用指令汇编指令格式 机器指令格式 操 作
LCALL addr16 12H addr16 PC ← (PC)+3
SP ← (SP)+1,(SP) ← (PC0~ PC7)
SP ← (SP)+1,(SP) ← (PC8~ PC15)
PC ← addr16
注意:本指令提供 16位子程序目的地址,被调用的子程序首地址可设置在 64KB程序存储器地址空间的任何位置。
http://www.wenyuan.com.cn/webnew/
3.5.3 调用、返回指令
3,返回指令汇编指令格式 机器指令格式 操 作
RET 22H PC8~ 15 ← ((SP)),弹出断点高 8位
SP ← ((SP)-1
PC0~ 7 ← ((SP)),弹出断点低 8位
SP ← (SP)-1
注意:本指令的作用是从子程序返回。当程序执行到本指令时,
表示结束子程序的执行,返回调用指令 (ACALL或 LCALL)的下一条指令处 (断点 )继续往下执行。因此,它的主要操作是将栈顶的断点地址送 PC,于是,子程序返回主程序继续执行。
http://www.wenyuan.com.cn/webnew/
3.5.3 调用、返回指令
3,返回指令汇编指令格式 机器指令格式 操 作
RETI 32H PC8~ 15 ← ((SP)),弹出断点高 8位
SP ← ((SP)-1
PC0~ 7 ← ((SP)),弹出断点低 8位
SP ← (SP)-1
注意:本指令是中断返回指令,除具有 RET指令的功能外,还具有开放低优先级中断、恢复中断逻辑等功能。在编程时不能将两种返回指令混用,中断返回一定要安排在中断服务程序的最后。
http://www.wenyuan.com.cn/webnew/
3.5.4 空操作指令汇编指令格式 机器指令格式 操 作
NOP 00H PC ← (PC)+1
注意:这是一条单字节指令,除 PC加 1指向下一条指令以外,
它不执行其他任何操作,不影响其他寄存器和标志位。
NOP指令常用来产生一个机器周期的延迟,用来编写软件延时程序。
http://www.wenyuan.com.cn/webnew/
3.5.5 控制转移类指令应用实例
【 例 22】 在累加器 A中保存有命令键键值,编写程序使程序根据键值不同而转向不同的子程序入口。
解,本题可以采用散转指令,程序如下:
KEY,CLR C ;清进位
RLC A ;键值乘 2
MOV DPTR,# KEYTAB;DPTR指向命令键跳转表首址
JMP @A+DPTR ;散转到命令键入口
KEYTAB,AJMP KEYPR0 ;转向 0号键处理程序
AJMP KEYPR1 ;转向 1号键处理程序
AJMP KEYPR2 ;转向 2号键处理程序
……
从程序中看出,当 (A)=00H时,散转到 KEYPR 0;当
(A)=01H,散转到 KEYPR l……。由于 AJMP是双字节指令,
转移表中相邻的 AJMP指令地址相差 2个字节,所以散转前应先将 A中键值乘 2。
http://www.wenyuan.com.cn/webnew/
3.5.5 控制转移类指令应用实例
【 例 23】 设 (SP)=30H,符号地址 PROG1指向程序存储器的
5678H单元,当前 PC值为 0123H。从 0123H处执行指令
,LCALL PROG1”,分析执行后 PC,SP的值和相关存储器的内容。
解:执行过程为:
(PC)+3=0123H+3=0126H。
将 PC内容压入堆栈:向 (SP)+1=31H中压入 26H,向
(SP)+1=32H中压入 01H,(SP)=33H。
将 PROG1=5678H送入 PC,即 (PC)=5678H。程序转向以
5678H为首地址的子程序执行。
最终执行结果是,(PC)=5678H,(SP)=33H,(31H)=26H、
(32H)=01H。
http://www.wenyuan.com.cn/webnew/
3.5.5 控制转移类指令应用实例
【 例 24】 编程判断内部 RAM 30H单元中的数据是奇数还是偶数,
如果是偶数,程序转向 PROG0处,如果是奇数程序转向
PROG1处 (0按照偶数对待 )。
解:程序如下:
MOV A,30H ;数据送累加器
ANL A,#01H ;高 7位清 0,保留最低位
JZ PROG0 ;如果全为 0说明是偶数,转向 PROG0
SJMP PROG1 ;数据为奇数,转向 PROG1
http://www.wenyuan.com.cn/webnew/
【 例 25】 利用 DJNZ指令和 NOP指令编写一循环程序,实现延时
1ms(晶振频率为 12MHz)。
解:程序如下:
DELAY,MOV A,#0AH ;1μs
LOOP,MOV R2,#30H ;1μs
DJNZ R2,$ ;2× 48μs
DJNZ R1,LOOP ;1μs× (1+2× 48+1)× 10
NOP ;1μs
NOP ;1μs
NOP ;1μs
NOP ;1μs
NOP ;1μs
RET ;2μs
总的延时时间为,1+(1+2× 48+1)× 10+7=998μs,若再加上调用本子程序的调用指令所用的时间 2μs共 1000μs,即 1ms。
http://www.wenyuan.com.cn/webnew/
3.6 位操作类指令
3.6.1 位数据传送指令
3.6.2 位逻辑运算指令
3.6.3 位清 0、置 1指令
3.6.4 位条件转移类指令
3.6.5 位操作类指令应用实例
http://www.wenyuan.com.cn/webnew/
3.6 位操作类指令
8051硬件结构中有个位处理机又称布尔处理机,它具有一套完整的处理位变量的指令集,包括 位变量传送,逻辑运算,控制程序转移指令 等。
在进行位寻址时,PSW中的进位标志 CY作为位处理机的累加器,称为 位累加器 。
位寻址空间包括以下两部分:
片内 RAM中位寻址区 ——即字节地址 20H~ 2FH单元中连续的 128个位,位地址为 00H~ 7FH。
部分特殊功能寄存器中的可寻址位 ——凡 SFR中字节地址能被 8整除的特殊功能寄存器都可以进行位寻址。位地址为 80~ F7H,一共 83位。
http://www.wenyuan.com.cn/webnew/
3.6.1 位数据传送指令汇编指令格式 机器指令格式 操 作
MOV C,bit A2H bit C ← (bit)
MOV bit,C 92H bit bit ← (C)
注意:本指令一个操作数为位地址 (bit),另一个必定为位累加器 C(即进位标志位 CY)。此指令不影响其他寄存器或标志位。
在位操作指令中,位地址 bit表示方法除前面已讲过的 4种之外,如果事先用伪指令定义,还可以采用伪指令定义过的字符名称来表示一个可寻址位。
http://www.wenyuan.com.cn/webnew/
3.6.2 位逻辑运算指令
1,位逻辑“与”指令汇编指令格式 机器指令格式 操 作
ANL C,bit 82H bit C ← (C)∧ (bit)
ANL C,/bit B0H bit C ← (C)∧ (bit)
注意:斜杠,/”表示对该位取反后再参与运算,但不改变原来的数值。 8051单片机中没有位逻辑“异或”指令。
2,位逻辑“或”指令汇编指令格式 机器指令格式 操 作
ORL C,bit 72H bit C ← (C)∨ (bit)
ORL C,/bit A0H bit C ← (C)∨ (bit)
注意:斜杠,/”表示对该位取反后再参与运算,但不改变原来的数值。 8051单片机中没有位逻辑“异或”指令。
http://www.wenyuan.com.cn/webnew/
3.6.3 位清 0、置 1指令
1,位清 0指令汇编指令格式 机器指令格式 操 作
CLR C C3H C ← 0
CLR bit C2H bit bit ← 0
注意:本指令执行结果不影响其他标志位。当直接位地址为端口 P0~ P3中的某一位时,具有“读 —改 —写”功能。
2,位置 1指令汇编指令格式 机器指令格式 操 作
SETB C D3H C ← 1
SETB bit D2H bit bit ← 1
注意:本指令执行结果不影响其他标志位。当直接位地址为端口 P0~ P3中的某一位时,具有“读 —改 —写”功能。
http://www.wenyuan.com.cn/webnew/
3.6.3 位清 0、置 1指令
3,位取反指令汇编指令格式 机器指令格式 操 作
CPL C B3H C ← ( )
CPL bit B2H bit bit ← ( )
注意:本指令执行结果不影响其他标志位。当直接位地址为端口 P0~ P3中的某一位时,具有“读 —改 —写”功能。
bit
C
http://www.wenyuan.com.cn/webnew/
3.6.4 位条件转移类指令
1,判位累加器 C转移指令汇编指令格式 机器指令格式 操 作
JC rel 40H rel PC ← (PC)+2
若 (C)=1,则程序转移 PC ← (PC)+rel
若 (C)=0,则程序往下顺序执行
JNC rel 50H rel PC ← (PC)+2
若 (C)=0,则程序转移 PC ← (PC)+rel
若 (C)=1,则程序往下顺序执行注意:本指令执行结果不影响 PSW标志位。
http://www.wenyuan.com.cn/webnew/
3.6.4 位条件转移类指令
2,判位变量转移指令汇编指令格式 机器指令格式 操 作
JB bit,rel 30H bit rel PC ← (PC)+3
若 (bit)=1,则程序转移 ← (PC)+rel
若 (bit)=0,则程序往下顺序执行
JNB bit,rel 20H bit rel PC ← (PC)+3;
若 (bit)=0,则程序转移 PC ← (PC)+rel
若 (bit)=1,则程序往下顺序执行注意:本指令执行结果不影响 PSW标志位。
http://www.wenyuan.com.cn/webnew/
3.6.4 位条件转移类指令
3,判位变量清 0转移指令汇编指令格式 机器指令格式 操 作
JBC bit,rel 10H bit rel PC ← (PC)+3
若 (bit)=1,则程序转移 PC← (PC)+rel,
且 bit← 0
若 (bit)=0,则程序往下顺序执行注意:本指令执行结果不影响 PSW标志位。
http://www.wenyuan.com.cn/webnew/
3.6.5 位操作类指令应用实例
【 例 26】 将 P1.4的状态取反后传送给 P1.6。
解:相应的指令为,MOV C,P1.4
CPL C
MOV P1.6,C
【 例 27】 编程判断内部 RAM 30H单元中存放的有符号数是正数还是负数,如果是正数,程序转移到 PROP处;如果是负数,
程序转移到 PRON处;如果是 0,程序转移到 ZERO处。
解:程序如下:
MOV A,30H ;取数据
JZ ZERO ;如果为 0,转移至 ZERO处
JB ACC.7,PRON ;ACC.7=1,说明是负数,转移至 PRON
SJMP PROP ;否则,是正数,转移至 PROP
http://www.wenyuan.com.cn/webnew/
3.6.5 位操作类指令应用实例
【 例 28】 比较内部 RAM中 40H,41H两个单元中的数据大小,
将大的数送至 42H单元。
解:程序如下:
MOV A,40H ;取第一个数
CJNE A,41H,NEQU ;比较,不相等转移至 NEQU处
MOV 42H,40H ;相等,(40H)→ 42H
SJMP TOOFF ;完成,转移至结尾退出
NEQU,JC LESS ;若 CY=1,说明 (40H)< (41H)转移
MOV 42H,40H ;(40H)> (41H),(40H)→ 40H
SJMP TOOFF ;完成,转移至结尾退出
LESS,MOV 42H,41H ;(40H)< (41H),(41H)→ 40H
TOOFF,RET
http://www.wenyuan.com.cn/webnew/
3.6.5 位操作类指令应用实例
【 例 29】 利用逻辑运算指令实现逻辑关系:
Y=(A∧ B)∨ (C∧ D),A,B,C,D均为位变量。
解:将 A,B,C,D分别接至 P1.0~ P1.3,P1.4输出即为 Y信号,
相应程序如下:
MOV C,P1.0
ANL C,P1.1 ;A∧ B
MOV 00H,C ;暂存在 00H位
MOV C,P1.2
ANL C,P1.3 ;C∧ D
ORL C,00H ;(A∧ B)∨ (C∧ D)
MOV P1.4,C ;逻辑关系输出
http://www.wenyuan.com.cn/webnew/
本章小结
指令系统是计算机可执行命令的集合,是程序设计的基础。
本章主要介绍 8051单片机的指令系统。熟悉和掌握指令系统对于 单片机的汇编语言程序设计 是十分重要的。
8051单片机具有功能强大的指令系统,根据功能可分为:
数据传送类指令、算术运算类指令、逻辑运算和移位操作指令、控制转移类指令和位操作指令。
寻址方式 是寻找操作数或操作数地址的方式。要正确理解指令的功能一定要分析指令中操作数是如何获取的,也就是要清楚寻址方式。 8051单片机支持多种寻址方式,分别是:寄存器寻址、立即数寻址、直接寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址。要注意区分不同寻址方式的区别,特别是要区分寄存器寻址和寄存器间接寻址、
直接寻址和立即数寻址。
http://www.wenyuan.com.cn/webnew/
本章小结
每一种寻址方式都有相应的 寻址空间 。寄存器寻址可以访问工作寄存器 R0~ R7,A,B,DPTR,直接寻址可以访问内部 RAM低 128B和特殊功能寄存器 (SFR),寄存器间接寻址可以访问片内 RAM低 128B和片外 RAM 64KB,变址寻址可以访问程序存储器。要注意特殊功能寄存器 (SFR)只能采用直接寻址,片外 RAM只能采用寄存器间接寻址。
变址寻址 一般用于查表指令中,用来查找存放在程序存储器中的常数表格。根据基址寄存器的不同,又可以分为近程查表和远程查表,近程查表用 PC作为基址寄存器,远程查表采用 DPTR作为基址寄存器。
http://www.wenyuan.com.cn/webnew/
本章小结
数据传送类指令 是指令系统中应用最普遍的指令,这类指令是把源地址单元的内容传送到目的地址单元中去,而源地址单元内容不变。数据传送指令分为内部数据传送指令、
累加器和外部 RAM传送指令、查表指令、堆栈操作指令等。
外部 RAM数据传送指令只能通过累加器 A进行,没有两个外部 RAM单元之间直接传送数据的指令。堆栈操作指令可以将某一直接寻址单元内容入栈,也可以把栈顶单元弹出到某一直接寻址单元,入栈和出栈要遵循“后入先出”的存储原则。数据传送类指令中还包含了一种交换指令,能将源地址单元和目的地址单元内容互换。
http://www.wenyuan.com.cn/webnew/
本章小结
算术运算指令 可以完成加、减、乘、除和加 1、减 1等运算。
加、减、乘、除指令要影响 PSW中的标志位 CY,AC,OV。
乘除运算只能通过累加器 A和 B寄存器进行。如果是进行
BCD码运算,在加法指令后面还要紧跟一条十进制调整指令,DA A”,它可以根据运算结果自动进行十进制调整,
使结果满足 BCD码运算规则。
http://www.wenyuan.com.cn/webnew/
本章小结
逻辑运算和移位操作指令 可以实现包括清 0、置 1、取反、
逻辑与、逻辑或、逻辑异或等逻辑运算和循环移位操作。
逻辑运算是将对应的存储单元按位进行逻辑操作,将结果保存在累加器 A中或者是某一个直接寻址存储单元中。如果保存结果的直接寻址单元是端口 P0~ P3,则为,读 —改 —
写,指令,即:将端口的内容读入 CPU进行逻辑运算,然后再回写到端口。
http://www.wenyuan.com.cn/webnew/
本章小结
控制转移类指令 是用来控制程序流程的,使用控制转移指令可以实现分支、循环等复杂程序结构,使程序变得巧妙、
实用、高效。控制转移指令的特点是修改 PC的内容,8051
单片机也正是通过修改 PC的内容来控制程序流程的。 8051
的控制转移指令分为无条件转移指令、条件转移指令、子程序调用和返回指令。在使用转移指令和调用指令时要注意转移范围和调用范围。绝对转移和绝对调用的范围是指令下一个存储单元所在的 2KB空间。长转移和长调用的范围是 64KB空间。采用相对寻址的转移指令转移范围是 256B。
http://www.wenyuan.com.cn/webnew/
本章小结
位操作指令 又称为 布尔操作指令,这类指令是对某一个可寻址位进行清 0,取反等操作,或者是根据位的状态进行控制转移 。 位操作指令采用的是位寻址方式,位寻址的寻址空间分为两部分:一是内部 RAM中的位寻址区,即内部
RAM的 20H~ 2FH单元,一共 128位,位地址是 00H~ 7FH;二是字节地址能被 8整除的特殊功能寄存器的可寻址位,共
83位 。
http://www.wenyuan.com.cn/webnew/
习 题
1,什么是指令系统? 8051单片机的指令按照功能分为几种? 分别有多少条指令?
2,什么是寻址方式? 8051单片机有哪几种寻址方式?
3,简述 8051单片机汇编语言指令格式和机器语言指令格式 。
4,指出下列指令中源操作数的寻址方式 。
MOV A,#55H
MOV A,2AH
MOV C,20H
MOV A,@R0
MOV @R0,A
MOV A,R0
MOVX A,@DPTR
MOV DPTR,#0123H
MOVC A,@A+PC
5,简述 8051的各种寻址方式的寻址空间 。
6,8051若访问特殊功能寄存器,可使用哪种寻址方式?
7,8051若访问片外 RAM单元,可使用哪种寻址方式?
8,8051若访问片内 RAM单元,可使用哪些寻址方式?
9,8051如果访问程序存储器,应该使用哪种寻址方式?
http://www.wenyuan.com.cn/webnew/
习 题
10,己知 (A)=7AH,(R0)=34H,(34H)=A5H,请写出分别执行下面各条指令后累加器 A的内容 。
(1) MOV A,R0
(2) MOV A,@R0
(3) MOV A,34H
(4) MOV A,#34H
11,己知 (A)=70H,(R0)=30H,(30H)=A0H,(PSW)=80H,请写出执行下列各条指令后累加器 A和相关存储单元的内容 。
(1) XCH A,R0
(2) XCH A,30H
(3) XCH A,@R0
(4) SWAP A
(5) ADD A,R0
(6) ADD A,30H
(7) ADD A,#30H
(8) ADDC A,30H
(9) SUBB A,30H
http://www.wenyuan.com.cn/webnew/
习 题
12,设 (R0)=32H,(A)=48H,片内 RAM中 (32H)=60H,(40H)=61H。 请指出在执行下列程序段后上述各单元内容的变化 。
MOV A,@R0
MOV @R0,40H
MOV 40H,A
MOV R0,#40H
13,已知 (A)=83H,(R0)=47H,(47H)=34H。 请写出执行完下列程序段后 A
的内容 。
ANL A,47H
ORL 47H,A
XRL A,@R0
SWAP A
14,说明下段程序执行过程中,SP的内容及堆栈中内容的改变过程 。
MOV SP,#30H
MOV 30,#55H
MOV 40,#66H
PUSH 30H
PUSH 40H
POP 30H
POP 40H
http://www.wenyuan.com.cn/webnew/
习 题
15,编程实现两个 16位二进制数的减法 。 设被减数放在 40H,41H单元中,
减数放在 50H,51H单元,差仍存于被减数地址单元中,减数,被减数都是低地址单元存放低 8位 。
16,编写一 BCD码拼字程序,将存放在 40H,41H单元的两个一位十进制数的
BCD码合并构成一个字节的压缩 BCD码,并将结果保存在 42H单元中 (高地址单元的 BCD码放在高 4位 )。
17,把片外数据存储器 4020H单元中的数据读到累加器中,应用哪几条指令?
18,试编写程序将外部 RAM 5000H单元内容传送至外部 RAM 6030H单元 。
19,度编写一多字节加法程序,将分别存放在 40H,41H和 50H,51H的两个
16位数相加 (高地址单元存放高 8位 ),结果存放于 40H,41H,42H单元中 。
20,试编写一段程序,将累加器 A的高 4位由 P1口的高 4位输出,P1口低 4位保持不变 。
21,试编写一段程序,将 P1口的高 5位置位,低 3位不变 。
22,试编写一段程序,将 R2中的数乘 4(用移位指令 )。
23,试编写程序,当累加器 A的内容 (无符号数 )小于 10时,程序转 NEXT处,
否则顺序执行 。
http://www.wenyuan.com.cn/webnew/
习 题
24,试编程比较内部 RAM 40H,41H单元的无符号数的大小,将较小的数存放在 42H单元中 。
25,使用位操作指令实现下列逻辑关系 。
(1) P1.0=(10H) ∨ Pl.1)∧ (ACC.0∨ CY)
(2) P1.3=(ACC.2∧ P1.0)⊕ (ACC.1∨ P1.1)
26,试编程将内部 RAM 30H~ 3FH单元中的内容全部清 0(利用循环转移指令 )。
27,在程序存储器中有一个常数表,从 2040H单元开始分别存放表格的第 0
项,第 1项 ……第 n项,试编程查出表格第 m项的内容 。
http://www.wenyuan.com.cn/webnew/
Q & A?
Thanks!