第 3章 MCS-51单片机指令系统
3.1 MCS-51指令系统概述
3.2 寻址方式
3.3 分类指令下一页
MCS-51单片机指令系统有如下特点:
( 1) 指令执行时间快 。
( 2) 指令短,约有一半的指令为单字节指令 。
( 3) 用一条指令即可实现 2个一字节的相乘或相除 。
( 4)具有丰富的位操作指令。
( 5)可直接用传送指令实现端口的输入输出操作。
上一页
3.1 MCS-51指令系统的概述
3.1.1 指令分类
3.1.2 指令格式
3.1.3 指令描述符号介绍返回本章首页
3.1.1 指令分类
按指令功能,MCS-51指令系统分为数据传递与交换,算术运算,逻辑运算,程序转移,
布尔处理操作,CPU控制等 6类 。
布尔处理操作类指令又称位操作指令 。
返回本节
3.1.2 指令格式
在 MCS-51指令中,一般指令主要由操作码,
操作数组成 。
指令应具有以下功能:
( 1) 操作码指明执行什么性质和类型的操作 。
例如,数的传送,加法,减法等 。
( 2) 操作数指明操作的数本身或者是操作数所在的地址 。
( 3) 指定操作结果存放的地址 。
返回本节
3.1.3 指令描述符号介绍
Rn——当前选中的寄存器区中的 8个工作寄存器 R0~ R7( n=0~ 7) 。
Ri——当前选中的寄存器区中的 2个工作寄存器
R0,R1( i=0,1) 。
direct—8位的内部数据存储器单元中的地址 。
#data——包含在指令中的 8位常数 。
#data16——包含在指令中的 16位常数 。
addr16——16位目的地址 。
addr11——11位目的地址 。
下一页
rel——8位带符号的偏移字节,简称偏移量 。
DPTR——数据指针,可用作 16位地址寄存器 。
bit——内部 RAM或专用寄存器中的直接寻址位。
A——累加器 。
B——专用寄存器,用于乘法和除法指令中 。
C——进位标志或进位位,或布尔处理机中的累加器 。
下一页
@——间址寄存器或基址寄存器的前缀,如
@Ri,@DPTR。
/ ——位操作数的前缀,表示对该位操作数取反,
如 /bit。
× ——片内 RAM的直接地址或寄存器 。
(× )——由 × 寻址的单元中的内容 。
——箭头左边的内容被箭头右边的内容所代替 。
返回本节
3.2 寻址方式
3.2.1 立即寻址
3.2.2 直接寻址
3.2.3 寄存器寻址
3.2.4 寄存器间接寻址
3.2.5 变址寻址
3.2.6 相对寻址
3.2.7 位寻址返回本章首页
3.2.1 立即寻址
指令中跟在操作码以后的第一个字节就是实际的操作数 。 操作数前面加有 #号 。
例如,MOV A,#70H ; A←# 70H
MOV DPTR,#1600H ; DPTR←# 1600H
MOV 30H,#40H ; 30H单元 ← #40H
返回本节
M 程序存储空间
PC 0 1 1 1 0 1 0 0
PC+1 0 1 1 1 0 0 0 0
A
70H
M 程序存储空间
1 0 0 1 0 0 0 0
0 0 0 1 0 1 1 0
0 0 0 0 0 0 0 0
PC
PC+1
PC+2
高位立即数低位立即数
DPH
DPL
RAM
2F
30 40
M 程序存储空间
0 1 1 1 0 1 0 1
0 0 1 1 0 0 0 0
0 1 0 0 0 0 0 0
PC
PC+1
PC+2
返回
3.2.2 直接寻址
指令中直接给出操作数地址的寻址方式,能进行直接寻址的存储空间有 SFR寄存器和内部数据 RAM。
例如,MOV PSW,# 20H ; PSW←# 20H,
PSW为直接寻址寄存器的符号地址 。
MOV A,30H ; A← 30H内部 RAM单元中的内容,30H为直接给出的内部 RAM的地址 。
下一页
ANL 70H,#48H
把 RAM中 70H单元内容同 48H相,与,结果 —〉 70H单元中程序存储空间 128内 RAM
PC 0 1 0 1 0 0 1 1 70H
PC+1 0 1 1 1 0 0 0 0
PC+2 0 1 0 0 1 0 0 0 ALU
返回本节
3.2.3 寄存器寻址
以通用寄存器的内容为操作数的寻址方式 。
通用寄存器指 A,B,DPTR以及 R0~ R7。
例如,CLR A ; A← 0
INC DPTR ; DPTR←DPTR+ 1
ADD R5,# 20H ; R5←# 20H+R5
返回本节
3.2.4 寄存器间接寻址
以寄存器中内容为地址,以该地址中内容为操作数的寻址方式 。 间接寻址的存储器空间包括内部数据 RAM和外部数据 RAM。
能用于寄存器间接寻址的寄存器有 R0,R1,
DPTR,SP。 其中 R0,R1必须是工作寄存器组中的寄存器 。 SP仅用于堆栈操作 。
下一页例如,MOV @R0,A ;内部 RAM(R0)←A
其指令操作过程示意图 如图 所示 。
又如,MOVX A,@R1 ; A← 外部
RAM(P2R1)其指令操作过程示意图 如图 所示 。
再如,MOVX @DPTR,A ;外部
RAM(DPTR)←A
其指令操作过程示意图 如图 所示 。
返回本节片内 RAM
30HR0
34HA
30H 34H
图 MOV @R0,A间接寻址示意图返回片外
RAM
34HP2
45HA
3410H 45H
10HR1
片外
RAM
2000HDPTR
30HA
2000H 30H
图 MOVX A,@R1间接寻址示意图图 MOVX @DPTR,A间接寻址示意图返回
3.2.5 变址寻址
变址寻址只能对程序存储器中数据进行操作 。
由于程序存储器是只读的,因此变址寻址只有读操作而无写操作,在指令符号上采用
MOVC的形式 ( 如图所示 ) 。
例如,MOVC A,@ A+DPTR ; A←
( A+DPTR)
又如,MOVC A,@ A+PC ; A← ( A+PC)
这条指令与上条指令不同的是,基址寄存器是
PC。
返回本节图 3-4 变址寻址示意图程序存储器
2000H
DPTR
64H(10H)
A
2010H 64H
10H 2000H
返回
3.2.6 相对寻址
以当前程序计数器 PC的内容为基础,加上指令给出的一字节补码数 ( 偏移量 ) 形成新的
PC值的寻址方式 。
相对寻址用于修改 PC值,主要用于实现程序的分支转移 。
例如,SJMP 08H ; PC←PC+ 2+08H
指令操作示意图 如图 所示 。
返回本节程序存储器
(2000H)
200AH
SJMP
200AH
08H 2000H+2
08H
PC
2000H
图 3-5 相对寻址示意图返回
3.2.7 位寻址
位寻址只能对有位地址的单元作位寻址操作 。
位寻址其实是一种直接寻址方式,不过其地址是位地址 。
例如,SETB 10H ;将 10H位置 1若 22H
单元中存放着数据 40H,22H单元的 D0位的位地址为 10H,执行上述指令后 ( 22H) =41H。
又如,MOV 32H,C ; 32H← 进位位 C
ORL C,32H ; C←C ∨ 32H
返回本节
3.3 分类指令
3.3.1 数据传送类指令
3.3.2 算术运算类指令
3.3.3 逻辑运算与循环类指令
3.3.4 程序转移类指令
3.3.5 调用子程序及返回指令
3.3.6 位操作指令
3.3.7 空操作指令返回本章首页
3.3.1 数据传送类指令
数据传送类指令共 28条,是将源操作数送到目的操作数 。 指令执行后,源操作数不变,
目的操作数被源操作数取代 。 数据传送类指令用到的助记符有 MOV,MOVX,MOVC、
XCH,XCHD,SWAP,PUSH,POP8种 。
源操作数可采用寄存器,寄存器间接,直接,
立即,变址 5种寻址方式寻址,目的操作数可以采用寄存器,寄存器间接,直接寻址 3种寻址方式 。 MCS-51单片机片内数据传送途径 如图所示 。
下一页直接地址
direct
累加器
A
直接地址
direct
间接地址
@Ri
寄存器
Rn
立即数
#data
寄存器
DPTR
图 MCS-51单片机片内数据传送图返回
1.以 A为目的操作数
MOV A,Rn ; A← Rn
MOV A,direct ; A← ( direct)
MOV A,@Ri ; A← ( Ri)
MOV A,#data ; A← #data
下一页
2.以 Rn为目的操作数
MOV Rn,A ; Rn ← A
MOV Rn,direct ; Rn ← ( direct)
MOV Rn,#data; Rn ← #data
下一页
3.以直接地址为目的操作数
MOV @Ri,A ; ( Ri) ← A
MOV @Ri,direct ; ( Ri) ← ( direct)
MOV @Ri,#data ; ( Ri) ← #data
下一页
4.以间接地址为目的操作数
MOV @Ri,A ; ( Ri) ← A
MOV @Ri,direct ; ( Ri) ← ( direct)
MOV @Ri,#data ; ( Ri) ← #data
例如:设 ( 30H) =6FH,R1=40H,执行 MOV
@R1,30H后,30H单元中数据取出送入 R1
间接寻址的 40H单元,( 40H) =6FH。
下一页
5.以 DPTR为目的操作数
MOV DPTR,#data16 ; DPTR ← #data16
例如执行 MOV DPTR,#2000H 后,
( DPTR) = 2000H。
下一页
6.访问外部数据 RAM
MOVX A,@DPTR ; A ← ( DPTR)
MOVX @DPTR,A ; ( DPTR) ← A
MOVX A,@Ri ; A ← ( P2Ri)
MOVX @Ri,A ; ( P2Ri) ← A
下一页
7.读程序存储器
MOVC A,@A+DPTR ; A ← ( A+DPTR)
MOVC A,@A+PC; A ← ( A+PC)
例如已知 A=30H,DPTR=3000H,
程序存储器单元 ( 3030H) =50H,执行 MOVC A,@
A+DPTR后,A=50H。
下一页
8.数据交换
l 字节交换
XCH A,Rn ; A<=> Rn
XCH A,direct ; A<=>( direct)
XCH A,@Ri ; A<=>( Ri)
l 半字节交换
XCHD A,@Ri ; A0~ 3<=>( Ri) 0~ 3
SWAP A ; A0~ 3<=>A4~ 7
下一页
9.堆栈操作
所谓堆栈是在片内 RAM中按,先进后出,后进先出,原则设置的专用存储区 。 数据的进栈出栈由指针 SP统一管理 。 堆栈的操作有如下两条专用指令:
PUSH direct; SP← ( SP+1),( SP) ← ( direct)
POP direct ; ( direct) ← ( SP),SP← SP-1
PUSH是进栈(或称为压入操作)指令。指令执行过程如图所示。
下一页片内
RAM
30H
11H
10HSP
××
片内
RAM
50H40H
11H
10HSP ××
40H
30H
片内
RAM
50H40H
11H
10H
50H
××
SP
30H
片内
RAM
40H
11H
10H
34H
××
SP
30H 34H
34H
××
××
执行前 执行前执行前 PUSH指令后 执行 POP指令后图 指令 PUSH操作示意图 图 指令 POP操作示意图返回
【 例 3.1】 将片内 RAM 30H单元与 40H单元中的内容互换。
方法 1 ( 直 接 地 址 传 送法 ),
MOV 31H,30H
MOV 30H,40H
MOV 40H,31H
SJMP $
方法 2( 间接地址传送法 ),
MOV R0,#40H
MOV R1,#30H
MOV A,@R0
MOV B,@R1
MOV @R1,A
MOV @R0,B
SJMP $
下一页方法 3 ( 字 节 交 换 传 送法 ),
MOV A,30H
XCHA,40H
MOV 30H,A
SJMP $
方法 4( 堆栈传送法 ),
PUSH 30H
PUSH 40H
POP 30H
POP 40H
SJMP $
返回本节
3.3.2 算术运算类指令
1,加法指令
ADD A,Rn ; A← A + Rn
ADD A,direct ; A← A +( direct)
ADD A,@Ri ; A← A +( Ri)
ADD A,#data ; A← A + #data
下一页
2,带进位加指令
ADDC A,Rn ; A← A + Rn + C
ADDC A,direct; A← A +( direct) + C
ADDC A,@Ri ; A← A +( Ri) + C
ADDC A,#data ; A← A + #data + C
C为来自 PSW状态寄存器中的进位位 C。
例如,设 A=20H,R0=21H,C=1,执行指令
ADDC A,R0后,A=42H。
下一页
3,带借位减指令
SUBB A,Rn ; A← A - Rn - C
SUBB A,direct ; A← A -( direct) - C
SUBB A,@Ri ; A← A -( Ri) - C
SUBB A,#data ; A← A - #data – C
例如,设 A=39H,R0=20H,( 20H) =32H,
C=1,执行指令 SUBBA,@R0后,A=06H。
下一页
4,乘法指令
MUL AB ; BA← A× B
A和 B中各存放一个 8位无符号数,指令执行后,16位乘积的高 8位在 B中,低 8位存 A中 。
例如,A=30H,B=60H,执行 MUL AB 后,
A=00H,B=12H。
下一页
5,除法指令
DIV AB ; A÷ B→ 商在 A中,余数在 B中
A和 B中各存放一个 8位无符号数,A放被除数,
B放除数 。 指令执行后,A中存放商,B中存入余数 。 若 B=00H,则指令执行后 OV=1,A与 B不变 。
例如,A=30H,B=07H,执行 DIV AB 后,
A=06H,B=06H。
下一页
6,加 1指令
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
例如,( 30H) =22H,执行 INC 30H 后,
( 30H) =23H。
下一页
7,减 1指令
DEC A ; A← A - 1
DEC Rn ; Rn← Rn - 1
DEC direct; direct← ( direct) - 1
DEC @Ri ; ( Ri) ← ( Ri) - 1
例如,R0=30H,( 30H) =22H,执行 DEC
@R0 后,( 30H) =21H。
下一页
8,十进制调整指令
DA A ;把 A中按二进制相加的结果调整成按
BCD码相加的结果例如,A=65BCD,B=78BCD,C=0,执行下列语句
ADD A,B
DA A
后,A=43 BCD,C=1。
下一页
【 例 3.2】 试把存放在 R1R2和 R3R4中的两个
16位数相加,结果存于 R5R6中 。
解:参考程序如下:
MOV A,R2 ;取第一个数的低 8位
ADD A,R4 ;两数的低 8位相加
MOV R6,A ;保存和的低 8位下一页
MOV A,R1 ;取第一个数的高 8位
ADDC A,R3 ;两数的高 8位相加,
并把低 8位相加时的进位位加进来
MOV R5,A ;把相加的高 8位存入
R5寄存器中
SJMP $
返回本节
3.3.3 逻辑运算与循环类指令
1.“与”操作指令
2.“或”操作指令
3.,异或,操作指令
4,求反与清除指令
5,循环指令返回本节
3.3.4 程序转移类指令
1,无条件转移指令
l 绝对 ( 短 ) 转移指令
AJMP addr11 ; PC10~ 0 ← addr11
l 长转移指令
LJMP addr16 ; PC← addr16
l 短 ( 相对 ) 转移指令
SJMP rel ; PC← PC + 2 + rel
l 间接转移指令
JMP @A+DPTR ; PC← A + DPTR
下一页
2,条件转移指令
l 累加器为零 ( 非零 ) 转移指令
l 减 1非零转移指令
l 两数不等转移指令
l 相对偏移量 rel的求法下一页
0000H~ 07FFH 0800H~ 0FFFH 1000H~ 17FFH 1800H~ 1FFFH
2000H~ 27FFH 2800H~ 2FFFH 3000H~ 37FFH 3800H~ 3FFFH
4000H~ 47FFH 4800H~ 4FFFH 5000H~ 57FFH 5800H~ 5FFFH
6000H~ 67FFH 6800H~ 6FFFH 7000H~ 77FFH 7800H~ 7FFFH
8000H~ 87FFH 8800H~ 8FFFH 9000H~ 97FFH 9800H~ 9FFFH
A000H~ A7FFH A800H~ AFFFH B000H~ B7FFH B800H~ BFFFH
C000H~ C7FFH C800H~ CFFFH D000H~ D7FFH D800H~ DFFFH
E000H~ E7FFH E800H~ EFFFH F000H~ F7FFH F800H~ FFFFH
表3-
1
程序存储器空间32
个2K
地址范围返回本节
3.3.5 调用子程序及返回指令
1,调用子程序指令
LCALL addr16; PC←PC+ 3,SP←SP+ 1,( SP) ← PC7~ 10; SP←SP+ 1,( SP ) ← PC15 ~ 8,
PC←addr 16
ACALL addr11; PC←PC+ 2,SP←SP+ 1,( SP) ← PC7~ 0; SP← SP+1,( SP) ← PC15~ 8,PC10~ 0←addr 11
下一页
2,返回指令
RET ; PC15~ 8← ( SP),SP←SP -1; PC7~ 0← ( SP),SP←SP -1
RETI ; PC15~ 8← ( SP),SP←SP -1; PC7~ 0← ( SP),SP←SP -1
返回本节
3.3.6 位操作指令
1,位数据传送指令
MOV C,bit; C← ( bit)
MOV bit,C; bit←C
2,位状态修改指令
CLR C ; C← 0
CLR bit ; ( bit) ← 0
CPL C ; C←
CPL bit ; ( bit) ← ( bit)
SETB C ; C← 1
SETB bit ; ( bit) ← 1
下一页
3,位逻辑运算指令
ANL C,bit ; C←C ∧ ( bit)
ANL C,/bit ; C←C ∧ ( bit)
ORL C,bit ; C←C ∨ ( bit)
ORL C,/bit ; C←C ∨ ( bit)
下一页
4,位转移指令
JC rel ; 若 C=1,
则转移 ( PC←PC+ 2+rel) ;否则程序顺序执行
JNC rel ; 若 C=0,
则转移 ( PC←PC+ 2+rel) ;否则程序顺序执
JB bit,rel ; 若 (bit)=1,
则转移 ( PC←PC+ 3+rel) ;否则程序顺序执行下一页
JNB bit,rel ; 若 (bit)=0,
则转移 ( PC←PC+ 3+rel) ;否则程序顺序执行
JBC bit,rel ; 若 (bit)=1,
则 PC←PC+ 3+rel,( bit) ← 0;否则程序顺序执行功能:分别检测指定位是 1还是 0,若条件符合,
则 CPU转向指定的目标地址去执行程序;否则,顺序执行下条指令 。
返回本节
3.3.7 空操作指令
NOP ; PC ← PC+1
这是一条单字节指令 。 执行时,不作任何操作 ( 即空操作 ),仅将程序计数器 PC的内容加 1,使 CPU指向下一条指令继续执行程序 。
这条指令常用来产生一个机器周期的时间延迟 。
返回本节