2011-3-30 1
§ 3.1 概述
7种寻址方式,111条指令
字节数
运算速度
单字节指令,49条
双字节指令,45条
三字节指令,17条
单周期指令,64条
双周期指令,45条
四周期指令,2 条
第三章 MCS-51指令系统
Instruction Set
2011-3-30 2
功能
数据传送类,29条
算术运算类,24条
逻辑运算类,24条
控制转移类,17条
位操作类,17条
2011-3-30 3
常用符号
Rn:工作寄存器中的寄存器 R0,R1… R7之一,
Ri:工作寄存器中的寄存器 R0或 R1
#data,8位立即数
#data16,16位立即数
direct:片内 RAM或 SFR的地址( 8位)
@间接寻址寄存器
Bit:片内 RAM或 SFR的位地址
addr11,11位目的地址
addr16,16位目的地址
2011-3-30 4
rel,补码形式的 8位地址偏移量。
偏移范围为 -128~ 127
/,位操作指令中,该位求反后参与操作,不影响
该位
X,片内 RAM的直接地址或寄存器
(X),相应地址单元中的 内容
→, 箭头左边的内容送入箭头右边的单元内
2011-3-30 5
§ 3.2 寻址方式
3.2.1 立即寻址
Immediate Addressing
操作数就包含在指令代码中,在操作码之后,称为
立即数,用, #, 表示。
MCS-51
如,MOV P1,#80H
MOV R7,#0F5H
MOV DPTR,#1245H
操作数存在程
序存储器中
2011-3-30 6
3.2.2 直接寻址
Direct Addressing
直接使用数所在单元的 地址 找到了操作数,所以称
这种方法为 直接寻址 。
操作数在 SFR,内部 RAM,位地址 空间。
如,MOV A,00H
MOV C,60H
MOV A,0F0H
2011-3-30 7
3.2.3 寄存器寻址
Register Addressing
对选定的工作寄存器 R0~ R7、累加器 A、通用寄存器 B、
地址寄存器 DPTR中的数进行操作。
例,MOV A,R0; 将 R0工作寄存器中的数据送到累加器 A中去。
提一个问题,我们知道,工作寄存器就是内存单元
的一部分,如果我们选择工作寄存器组 0,则 R0就
是 RAM的 00H单元,那么这样一来,MOV A,00H
和 MOV A,R0不就没什么区别了吗?
2011-3-30 8
的确,这两条指令执行的结果是完全相同的,
都是将 00H单元中的内容送到 A中去,但是执行的过
程不同,执行第一条指令需要 2个机器周期,而第二
条则只需要 1个机器周期,第一条指令变成最终的目
标码要两个字节( E5H 00H),而第二条则只要一个
字节( E8H)就可以了。
2011-3-30 9
3.2.4 寄存器间接寻址
Register Indirect
Addressing
把地址放在另外一个寄存器中,根据这个寄存器中的数值
决定该到哪个单元中取数据。
?R0,R1----8位地址,片内 低 128字节或 片外
?DPTR----16位,片外 64KB
? MCS-51
如,MOV A,@R0
MOVX A,@R0
MOVX A,@DPTR
操作数在
片内 RAM中
操作数在
片外 RAM中
操作数在
片外 RAM中
2011-3-30 10
以 DPTR或 PC为基址寄存器,累加器 A为变址寄存器。把两
者内容相加,结果作为操作数的地址。
常用于查表操作。
? MCS-51
MOVC A,@A+DPTR ; (A+DPTR) →A
MOVC A,@A+PC ; PC+1 →PC, (A+PC)→A
3.2.5 变址寻址 (基址 +变址 )
Base-Register-plus-Index-Register-Indirect Addressing
操作数在程
序存储器中
2011-3-30 11
E0
A程序存储区
2040H 93
20E0H 47
2041H …
… …
DPH 20
DPL 00
ALU
如,MOVC A,@A+DPTR
设 DPTR=2000H,A=E0H
20E0H
47
指令代码
2011-3-30 12
3.2.6 相对寻址
将 PC中的当前内容与指令 第二字节给出的数 相加,结
果作为跳转指令的转移地址(转移目的地址)。
PC中的 当前 内容称为 基地址 (本指令后的字节地址)
指令第二字节给出的数据称为 偏移量, 1字节带符号数,
常用于跳转指令。
如, JC 23H
若 C=0,不跳转; C=1,跳转,
Relative Addressing改变 PC
2011-3-30 13
程序存储区
ALU
如,JC 23
1025H
1000H 40
1025H 45
1001H 23
… …
1024H 47
1002H 30
23H 1002H
指令代码
当前 PC
2011-3-30 14
对片内 RAM的 位寻址区 和某些可 位寻址 的特殊功
能寄存器进行位操作时的寻址方式。
如, SETB 3DH; 将 27H.5位置 1
CLR C ; Cy位清 0
3.2.7 位寻址
Bit Addressing
操作数在片内
RAM位地址区或
SFR某些位中
2011-3-30 15
寻址方式涉及的存储器空间
寻址方式 寻址空间(操作数存放空间)
立即寻址 程序存储器
直接寻址 片内 RAM低 128字节,SFR
寄存器寻址 工作寄存器 R0~ R7,A,B,DPTR
寄存器间接寻址 片内 RAM:@R0,@R1,SP片外 RAM:@R0,@R1,@DPTR
变址寻址 程序存储器,@A+PC,@A+DPTR
相对寻址 程序存储器 256字节范围内,PC+偏移量
位寻址 片内 RAM的位寻址区 (20H~ 2FH字节地址 )某些可位寻址的 SFR
2011-3-30 16
§ 3.3 数据传送类指令 ( 29条)
Data Transfer Instruction
MCS-51 助记符:
助记符:
MOV,MOVX,MOVC
XCH,XCHD,SWAP
PUSH,POP
? 源操作数寻址方式( 5种),
立即寻址、直接寻址、寄存器寻址、
寄存器间接寻址、变址寻址。
? 目的操作数寻址方式( 3种),
直接寻址、寄存器寻址、寄存器间接寻址
除了目的操作数为 ACC的指令影响奇偶标志 P外,一般不影响
标志位。
2011-3-30 17
3.3.1 十六位数的传递指令 ( 1条)
MOV DPTR,#data16
8051是一种 8位机,这是唯一的一条 16位 立即数传递指
令。功能:将一个 16位的立即数送入 DPTR中去。其中
高 8位送入 DPH,低 8位送入 DPL。
例,MOV DPTR,#1234H
执行完了之后 DPH中的值为 12H,DPL中的值为 34H。
如果我们分别向 DPH,DPL送数,则结果也一样。
如下面两条指令,MOV DPH,#35H
MOV DPL,#12H。
则就相当于执行了 MOV DPTR,#3512H。
2011-3-30 18
3.3.2 累加器 A与片外 RAM之间的数据传递类指令 (4条 )
MOVX A,@Ri
MOVX @Ri,A
MOVX A,@DPTR
MOVX @DPTR,A
说明:
1.在 51中,与 外 部存储器 RAM打交道的只可以是 A累加器。所有
需要送入外部 RAM的数据必需要通过 A送去,而所有要读入的外部
RAM中的数据也必需通过 A读入。
在此我们可以看出内外部 RAM的区别了,内部 RAM间可以直接进
行数据的传递,而外部则不行。
比如,要将外部 RAM中某一单元(设为 0100H单元的数据)送入
另一个单元(设为 0200H单元),也必须先将 0100H单元中的内容读
入 A,然后再送到 0200H单元中去 。
2011-3-30 19
2.要读或写外部的 RAM,当然也必须要知道 RAM的地址,
在后两条指令中,地址是被直接放在 DPTR中的。而前两条
指令,由于 Ri(即 R0或 R1)只是 8位的寄存器,所以只提
供低 8位地址。高 8位地址由 P2口 来提供。
3.使用时应先将要读或写的地址送入 DPTR或 Ri中,然后
再用读写命令。
例,将外部 RAM中 100H单元中的内容送入外部 RAM中 200H
单元中。
MOV DPTR,#0100H
MOVX A,@DPTR
MOV DPTR,#0200H
MOVX @DPTR,A
2011-3-30 20
3.3.3 读程序存储器指令 ( 2条)
MOVC A,@A+DPTR
MOVC A,@A+PC
本组指令是将 ROM中的数送入 A中。本组指令也被称为 查表指令,
常用此指令来查一个已做好在 ROM中的表格
说明,查找到的结果被放在 A中,因此,本条指令执行前后,A
中的值不一定相同。
例,有一个数在 R0中,要求用查表的方法确定 它的平方值 (此
数的取值范围是 0-5)
MOV DPTR,#100H
MOV A,R0
MOVC A,@A+DPTR
,…
ORG 0100H
DB 0,1,4,9,16,25
如果 R0中的值为 2,
则最终地址为
100H+2为 102H,
到 102H单元中找到
的是 4。
2011-3-30 21
3.3.4 堆栈操作 ( 2条)
PUSH direct ; SP?SP+1,(SP)?(direct)
POP direct ; (direct) ? (SP),SP?SP-1
第一条为 压入 指令,就是将 direct中的内容送入 堆栈 中,
第二条为 弹出 指令,就是将 堆栈 中的内容送回到 direct中。
例, MOV SP,#5FH
MOV A,#100
MOV B,#20
PUSH ACC
PUSH B
则执行第一条 PUSH ACC指令是这样的:将 SP中的值加 1,即变
为 60H,然后将 A中的值送到 60H单元中,因此执行完本条指令后,
内存 60H单元的值就是 100,同样,执行 PUSH B时,是将 SP+1,即变
为 61H,然后将 B中的值送入到 61H单元中,即执行完本条指令后,
61H单元中的值变为 20。
2011-3-30 22
1.给出每条指令执行后的结果
MOV 23H,#30H
MOV 12H,#34H
MOV R0,#23H
MOV R7,12H
MOV R1,#12H
MOV A,@R0
MOV 34H,@R1
MOV 45H,34H
MOV DPTR,#6712H
MOV 12H,DPH
MOV R0,DPL
MOV A,@R0; (23H)=30H; (12H)=34H; R0=23H
XX
XX
XX
XX
XX
XX
XX
XX
XX
DPH
DPL
45H
34H
23H
12H
R7
R1
R0
30
34
23
34
12
67
12
34
34
67
12; R7=34H; R1=12H; A=30H; (34H)=34H; (45H)=34H; DPTR=6712H; (12H)=67H; R0=12H; A=67H
内部 RAM
2011-3-30 23
§ 3.4 算术运算类指令 (24条 )
Arithmetic Operations
主要对 8位无符号数;也可用于带符号数运算。
包括:加、减、乘、除、加 1、减 1运算指令
影响 PSW有关位。
2011-3-30 24
3.4.1 加法指令
ADD A,#data ; A+ data→A
ADD A,direct ; A+ (direct )→A
ADD A,Rn ; A+ Rn→A
ADD A,@Ri ; A+ (Ri)→A
用途,将 A中的值与源操作数所指内容相加,最终结果
存在 A中。
1.不带进位位的加法指令 ( 4条)
2011-3-30 25
2.带进位位的加法指令 ( 4条)
ADDC A,Rn ; A+ Rn+ CY→A
ADDC A,direct ; A+ (direct )+ CY→A
ADDC A,@Ri ; A+ (Ri)+ CY→A
ADDC A,#data ; A+ data+ CY→A
用途,将 A中的值和其后面的值以及进位位 C中的值相加,
最终结果存在 A,常用于多字节数运算中。
说明,由于 51单片机是一种 8位机,所以只能做 8位的数学
运算,但 8位运算的范围只有 0~255,这在实际工作中是不
够的,因此就要进行扩展,一般是将 2个 8位 (两字节 )的数
学运算合起来,成为一个 16位的运算,这样,可以表达的
数的范围就可以达到 0~65535。
2011-3-30 26
例:
先做 67H+A0H=107H,而 107H显然超过了 0FFH,
因此最终保存在 A中的是 07H,而 1则到了 PSW中的
CY位了。换言之,CY就相当于是 100H。
然后再做 10H + 30H + CY,结果是 41H,所以
最终的结果是 4107H。
1067H+30A0H
0001 0000 0110 0111
0011 0000 1010 0000
0100 0001 0000 0111
1067H
30A0H
4107H
2011-3-30 27
设,1067H存在 R1R0中,30A0H存在 R3R2中,计算
R1R0+R3R2,结果存在 R5R4中。
MOV A,R0
ADD A,R2 ; R0+R2→ A和 CY
MOV R4,A
MOV A,R1
ADDC A,R3 ; R1+R3+CY→ A和 CY
MOV R5,A
2011-3-30 28
又例:
先做 67H+20H=87H,没有超过 0FFH,因此最终
保存在 A中的是 87H,而 PSW中的 CY=0。
然后再做 10H + 30H + CY,结果是 40H,所以
最终的结果是 4087H。
1067H+3020H
0001 0000 0110 0111
0011 0000 0010 0000
0100 0000 1000 0111
1067H
3020H
4087H
2011-3-30 29
DA A
在进行 BCD码加法运算时,跟在 ADD和 ADDC指令
之后,用于对累加器 A中刚进行的两个 BCD码的加法
的结果进行十进制调整。
例,A=0001 0101BCD(代表十进制数 15)
ADD A,#8
3,十进制调整指令 ( 1条); A=1DH,按二进制规律加; A=23H,按十进制规律加DA A
2011-3-30 30
调整要完成的任务是:
( 1)当累加器 A中的 低 4位数出现了非
BCD码( 1010~1111)或低 4位产生进
位( AC=1),则应在低 4位加 6调整,以
产生低 4位正确的 BCD结果。
( 2)当累加器 A中的 高 4位 数出现了非 BCD
码( 1010~1111)或高 4位产生进位
( CY=1),则应在高 4位加 6调整,以产生
高 4位正确的 BCD结果。
十进制调整指令执行后,PSW中的 CY表
示结果的百位值 。
2011-3-30 31
例 若( A)= 0101 0110B,表示的 BCD码为 56,
( R3)= 0110 0111B,表示的 BCD码为 67,( CY)= 0。
执行以下指令:
ADD A,R2
DA A
由于( A)= 0010 0011B,即,且( CY)= 1,即
结果为 BCD数 123。
应该注意,DA指令不能对减法进行十进制调整。
2011-3-30 32
3.4.2 减法指令 ( 8条)
SUBB A,Rn ; A- Rn- CY→A
SUBB A,direct ; A- (direct )- CY→A
SUBB A,@Ri ; A- (Ri)- CY→A
SUBB A,#data ; A- data- CY→A
将 A中的值减去源操作数所指内容以及进位位 C中的
值,最终结果存在 A中。
如,SUBB A,R2
设,A=C9H,R2=55H,CY=1,
执行指令之后,A中的值为 73H。
1,带借位的减法指令 ( 4条)
2011-3-30 33
说明, 没有不带借位的减法指令,如果需要做
不 带位的减法指令(在做第一次相减时),只要将
CY清零 即可。
对带符号数,要注意 OV标志。 OV=1,出错 。
2011-3-30 34
§ 3.5 逻辑运算类指令 ( 24条)
主要用于对 2个操作数按 位进行逻辑 操作,结果送到
A或直接寻址单元。
? 主要操作
与、或、异或、移位、取反、清零等。
? 对标志位的影响
除了目的操作数为 ACC的指令影响奇偶标志 P外,
一般不影响标志位。
Logic Operations
2011-3-30 35
3.5.1 逻辑或指令 ( 6条)
ORL A,Rn ; A∨ Rn→ A
ORL A,direct ; A∨ (direct)→ A
ORL A,@Ri ; A∨ (Ri)→ A
ORL A,#data ; A∨ data→ A
ORL direct,A ; (direct)∨ A→ (direct)
ORL direct,#data ; (direct)∨ data→ (direct)
影响 P标志
例,71H和 56H相或:
01110001 ( 71H)
∨ ) 01010110 ( 56H)
01110111 即 77H
后两条指令,若直接地址为 I/O端口,则为, 读-改
写, 操作。
OR Logic Instruction
2011-3-30 36
3.5.2 逻辑与指令 ( 6条)
ANL A,Rn ; A∧ Rn→ A
ANL A,direct ; A∧ (direct)→ A
ANL A,@Ri ; A∧ (Ri)→ A
ANL A,#data ; A∧ data→ A
ANL direct,A ; (direct)∧ A→ (direct)
ANL direct,#data ; (direct)∧ data→ (direct)
影响 P标志
例,71H和 56H相与:
01110001 ( 71H)
∧ ) 01010110 ( 56H)
01010000 即 50H
后两条指令,若直接地址为 I/O端口,则为, 读-改
写, 操作。
ANd Logic Instruction
2011-3-30 37
例,71H和 56H相异或:
01110001 ( 71H)
⊕ ) 01010110 ( 56H)
3.5.2 逻辑异或指令 ( 6条)
XRL A,Rn ; A ⊕ Rn→ A
XRL A,direct ; A ⊕ (direct)→ A
XRL A,@Ri ; A ⊕ (Ri)→ A
XRL A,#data ; A ⊕ data→ A
XRL direct,A ; (direct) ⊕ A→ (direct)
XRL direct,#data ; (direct) ⊕ data→ (direct)
影响 P标志
00100111 即 27H
后两条指令,若直接地址为 I/O端口,则为, 读-改
写, 操作。
eXclusive-oR Logic Instruction
2011-3-30 38
3.5.3 清 0与 取反指令 ( 2条)
取反,CPL A ; /A→A
例,若 A=5CH,执行 CPL A
结果,A=A3H
清 0,CLR A ; 0→A
ComPlement Logic Operation
2011-3-30 39
3.5.4 循环移位指令 ( 4条)
RL A
RR A
RLC A
RRC A
A.7 A.0
A.7 A.0
A.7 A.0CY
CY A.7 A.0
后两条指令,影响 P标志和 CY。
Rotate Logic instruction
2011-3-30 40
例:
若 A=5CH,CY=1,执行 RLC A后,
? 对 RLC,RRC指令,在 CY=0时
? RLC相当于 乘 以 2
? RRC相当于 除 以 2
结果,A=B9H,CY=0,P=1
0101 11001 101 0 10
2011-3-30 41
§ 3.6 控制转移类指令 ( 17条 )
Branching Instruction
共有控制程序转移类指令 (不包括位操作类的转移
指令 )。此类指令一般不影响 PSW。
包括以下类型:
? 无条件转移和条件转移
? 相对转移和绝对转移
? 长转移和短转移
? 调用与返回指令
2011-3-30 42
3.6.1 无条件转移类指令 ( 4条)
? 短转移类指令,AJMP addr11
? 长转移类指令,LJMP addr16
? 相对转移指令,SJMP rel
? 间接转移指令,JMP @A+DPTR
( 1) 上面的前三条指令,统统理解成,PC值改变,即
跳转到一个标号处。
那么他们的区别何在呢?
2011-3-30 43
?跳转的范围不同。
? 短转移类指令,AJMP addr11
? 长转移类指令,LJMP addr16
? 相对转移指令,SJMP rel
转移范围,
2KB
64KB
-128~+127
?指令构成不同。
AJMP,LJMP后跟的是 绝对地址,
而 SJMP后跟的是 相对地址 。
?指令长度不同
? 原则上,所有用 SJMP或 AJMP的地方都可以用
LJMP来替代。
2011-3-30 44
?间接转移指令,JMP @A+DPTR
这条指令的用途也是跳转,转到什么地方去呢?
这可不能由标号简单地决定了。
转移地址由 A+DPTR形成,并直接送入 PC。
指令对 A,DPTR和标志位均无影响 。
本指令可代替众多的判别跳转指令,又称为 散
转指令,多用于多分支程序结构中。
( 2) 第四条指令与前三条指令相比有所不同
2011-3-30 45
例, MOV DPTR,#TAB ;将 TAB代表的地址送入 DPTR
JMP @A+DPTR ;跳转
TAB,AJMP ROUT0 ;跳转 ROUT0开始的程序段
TAB+2,AJMP ROUT1 ;跳转 ROUT1开始的程序段
TAB+4,AJMP ROUT2 ;跳转 ROUT2开始的程序段
TAB+6,AJMP ROUT3 ;跳转 ROUT3开始的程序段
...
ROUT0:
...
ROUT1:
...
ROUT2:
...
ROUT3:
执行该段程序后,程序将根
据 A中的内容转移到不同的
程序段去执行 ----散转。
A=0,转 ROUT0
A=2,转 ROUT1
A=4,转 ROUT2
A=6,转 ROUT3
2011-3-30 46
3.6.2 条件转移指令 ( 8条)
条件转移指令是指在满足一定 条件 时进行 相对转
移,否则程序继续执行 本指令的 下一条指令。
一、判 A内容是否为 0转移指令 ( 2条)
JZ rel ;如果 A=0,则转移,否则顺序执行。
JNZ rel ;如果 A≠0,就转移。
转移到相对于当前 PC值的 8位移量的地址去 。即:
新的 PC值 =当前 PC+偏移量 rel
我们在编写汇编语言源程序时,可以直接写成:
JZ 标号 ;即转移到标号处。
2011-3-30 47
例,MOV A,R0JZ L1
MOV R1,#00H
AJMP L2
L1,MOV R1,#0FFH
L2,SJMP L2
END
在执行上面这段程序前:如果 R0=0,结果 R1=0FFH。
而如果 R0?0,则结果是 R1=00H。
把上面的那个例子中的 JZ改成 JNZ,看看程序执行的
结果是什么?
如果 R0=0,结果 R1=00H。如果 R0 ?0,结果是 R1中的
值为 0FFH。
2011-3-30 48
二、比较不等转移指令 ( 4条)
CJNE A,#data,rel
CJNE A,direct,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
此类指令的功能是将两个操作数比较,如果两者 相等,就
顺序执行,如果 不相等,就 转移 。
同样地,使用时,我们可以将 rel理解成标号,即:
CJNE A,#data,标号
CJNE A,direct,标号
CJNE Rn,#data,标号
CJNE @Ri,#data,标号
2011-3-30 49
利用这些指令,可以判断两数是否 相等 。
但有时还想得知两数比较之后 哪个大, 哪个小,
本条指令也具有这样的功能:
如果两数不相等,则 CPU还会用 CY(进位位)
来反映哪个数大,哪个数小。
如果前面的数大,则 CY=0,否则 CY=1。
因此在程序转移后再次利用 CY就可判断出哪个
数大,哪个数小了。
2011-3-30 50
举例:
MOV A,R0
CJNE A,#10H,L1
MOV R1,#0 ;如 R0=10H,则不转移 R1=00H;
AJMP L3
L1:JC L2 ;如 CY=1即 R0<10H,则转移
MOV R1,#0AAH ;否则 CY=0即 R0>10H,则转移
AJMP L3
L2:MOV R1,#0FFH
L3:SJMP L3
因此最终结果是:本程序执行前,
如果 R0=10H,则 R1=00H;
如果 R0>10H,则 R1=0AAH;
如果 R0<10H,则 R1=0FFH。
2011-3-30 51
三、减 1不为 0转移指令 ( 2条)
DJNZ Rn,rel
DJNZ direct,rel
DJNZ指令的执行过程是这样的,
它将第一个参数中的值 减 1,然后看这个值是否等于
0,如果 等于 0,就往下执行,如果 不等于 0,就转移
到第二个参数所指定的地方去。
例:
DJNZ 10H,LOOP
...
LOOP,...
2011-3-30 52
例,
MOV 23H,#0AH
CLR A
LOOP,ADD A,23H
DJNZ 23H,LOOP
SJMP $
上述程序段的执行过程是:
将 23H单元中的数连续相加,存至 A中,每加一次,
23H单元中的数值 减 1,直至减到 0,共加( 23H)次。
2011-3-30 53
3.6.3 调用与返回指令 ( 4条)
一,调用指令 ( 2条)
LCALL addr16 ;长调用指令 (3字节 )
ACALL addr11 ;短调用指令 (2字节 )
上面两条指令都是在主程序中调用子程序,两者的区别,
对短调用指令,被调用子程序入口地址必须与调用指令的
下一条指令的第一字节在相同的 2KB存储区之内。
使用时可以用:
LCALL 标号 ;标号表示子程序首地址
ACALL 标号
来调用子程序。
2011-3-30 54
指令的执行过程是,当前 PC压栈,子程
序首地址送 PC,实现转移。
二、返回指令 ( 2条)
子程序执行完后必须回到主程序,如何
返回呢?只要执行一条返回指令就可以了。
RET ;子程序返回指令
RETI ;中断子程序返回指令
两者不能互换使用。
2011-3-30 55
3.6.4 空操作指令 ( 1条)
NOP
空操作,就是什么事也不干,停一个周期,一般
用作短时间的延时。
RET指令的执行过程是,堆栈栈顶内容( 2字
节,调用时保存的当前 PC值)弹出给 PC,实
现返回。
RETI指令除了具有 RET指令的功能实现程序
返回外,还有对中断优先级状态触发器的清
零。
2011-3-30 56
§ 3.7 位操作指令 ( 17条 )
Boolean Operations
MCS-51单片机的硬件结构中,有一个位处理器
(又称布尔处理器),它有一套位变量处理的指令集,
包括 位 变量 传送, 逻辑 运算、控制程序 转移 等。
在 MCS-51 中,有一部份 RAM和一部份 SFR是具有位
寻址功能的。
? 位操作区,内部 RAM的 20H-2FH这 16个字节单
元,即 128个位单元 (位地址空间位 00~ 7FH);
? 可以位寻址的特殊功能寄存器, 8031中有一
2011-3-30 57
些 SFR是 可以进行位寻址 的,这些 SFR的特点是
其 字节地址均可被 8整除, 如 A累加器,B寄存
器,PSW,IP(中断优先级控制寄存器),IE
(中断允许控制寄存器),SCON(串行口控制
寄存器),TCON(定时器 /计数器控制寄存
器),P0-P3( I/O端口锁存器)。
在进行位处理时,CY用作, 位 累加器, 。
2011-3-30 58
以 PSW中位 4( RS1 ) 为例 。
? 直接 (位 )地址方式,如 D4H;
? 点操作符号方式,如 PSW.4,D0H.4;
? 位名称方式,如 RS1;
? 用户定义名方式,如用伪指令 bit
SUB.REG bit RS1
定义后,可用 SUB.REG代替 RS1。
位地址表达方式
2011-3-30 59
3.7.1 位传送指令 ( 2条)
MOV C,bit ; bit → C
MOV bit,C ; C → bit
这组指令的功能是实现位累加器( CY)和其它
位地址之间的数据传递。
例, MOV C,P1.0 ;将 P1.0的状态送给 C。
MOV P1.0,C ;将 C中的状态送到 P1.0;引脚上去。
2011-3-30 60
3.7.2 位清 0和置位 ( 4条)
? 位清 0指令
CLR C ;使 CY=0
CLR bit ;使指令的位地址等于 0。
例, CLR P1.0 ;即使 P1.0变为 0
? 位置 1指令
SETB C ;使 CY=1
SETB bit ;使指定的位地址等于 1。
例, SETB P1.0 ;使 P.0变为 1
2011-3-30 61
3.7.3 位逻辑运算指令 ( 6条)
位与指令
ANL C,bit ; Cy与指定位的值相与,结果送 Cy
ANL C,/bit ; 先将指定的位地址中的值取出后
取反,再和 Cy相与,结果送回 Cy。 但 注意,指定的
位地址中的值本身并不发生变化。
例, ANL C,/P1.0
2011-3-30 62
位取反指令
CPL C ;使 Cy值取反。
CPL bit ;使指定的位的值取反。
例, CPL P1.0
位或指令
ORL C,bit
ORL C,/bit
2011-3-30 63
3.7.4 位条件转移指令 ( 5条)
判 Cy转移指令
JC rel
JNC rel
第一条指令的功能是如果 Cy=1就转移,否则
就顺序执行。
第二条指令则和第一条指令相反,即如果
Cy=0就转移,否则就顺序执行。
同样理解,JNC 标号
2011-3-30 64
判位变量转移指令
JB bit,rel
JNB bit,rel
JBC bit,rel
第一条指令,如果指定的( bit) =1,则转移,否
则顺序执行,第二条指令功能相反。
同样理解,JB bit,标号
第三条指令是如果指定的 ( bit) =1,则转移,
并把该位 清 0,否则顺序执行。