第三章 指令系统
51系列单片机指令集含有 111条指令
每条指令在执行时要花去一定的 时间,以机器
周期为单位。按指令 执行时间 分类:
单周期 (64条 );双周期 (45条 );4周期 (2条 )
按指令的 功能 分类,可分为 5大类:
数据传送类( 28条);算术运算类( 24条)
逻辑运算及移位类( 25条);控制转移类( 17条)
位操作类( 17条)
每条指令在程序存储器 ROM中占据一定的 空间,
以字节为单位。按指令 所占字节数 分类:
单字节 (49条 );双字节 (45条 );3字节 (17条 )
MCS-51单片机指令系统有如下特点:
( 1) 指令执行时间快 。
( 2) 指令短, 约有一半的指令为单字节指令 。
( 3) 用一条指令即可实现 2个一字节的相乘或
相除 。
( 4)具有丰富的位操作指令。
( 5)可直接用传送指令实现端口的输入输出操作。
指令格式
在 MCS-51指令中, 一般指令主要由操作
码, 操作数组成 。
指令应具有以下功能:
( 1) 操作码指明执行什么性质和类型的操
作 。 例如, 数的传送, 加法, 减法等 。
( 2) 操作数指明操作的数本身或者是操作
数所在的地址 。
( 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的直接地址或寄存器 。
( (× )) —— 由 × 寻址的单元中的内容 。
—— 箭头左边的内容被箭头右边的内
容所代替 。
51单片机指令的寻址方式
? 立即寻址
? 直接寻址
? 寄存器寻址
? 寄存器间接寻址
? 变址寻址 (基址寄存器 +变址寄存器间接寻址 )
? 相对寻址
? 位寻址
寻址方式:指令按地址获得操作数的方式
七种寻址方式,一条指令可能含多种寻址方式 。
立即寻址
指令中直接给出操作数的寻址方式 。 立即操作
数用前面加有 #号的 8位或 16位数来表示 。
例如,MOV A,# 60H ; A←# 60H
MOV DPTR,# 3400H ; DPTR←# 3400H
MOV 30H,# 40H; 30H单元 ← #40H
上述三条指令执行完后, 累加器 A中数据为立即
数据 60H,DPTR寄存器中数据为 3400H,30H单元
中数据为立即数 40H。
注意:符号, #”表明其后跟的是立即数,
立即数 ——就是数字量本身 。
直接寻址
指令中直接给出操作数地址的寻址方式, 能进行直接
寻址的存储空间有 SFR寄存器和内部数据 RAM。
例如,MOV R1,1FH ; (R1) ← ( 1FH)
MOV 30H,4AH ; (30H)← ( 4AH)
在本单片机中规定:访问特殊功能寄存器 SFR只能采用直
接寻址方式。例如:
MOV A,SP ; (A) ←(SP)
MOV A,81H ; (A) ←(SP)
MOV P1,#5AH ; (P1)←(#5AH)
MOV 90H,#5AH ; (P1)←(#5AH)
MOV B,30H ; (B) ←(30H)
相同
相同
寄存器寻址
以通用寄存器的内容为操作数的寻址方式 。 通
用寄存器指 A,B, DPTR以及 R0~ R7 。
从寄存器中读取操作数或存放操作数进寄存器
例如,CLR A ; A← 0
INC DPTR ; (DPTR)←(DPTR+ 1)
ADD R5,#20H ; (R5)←(R 5+#20H)
MOV A,B ; ( A) ← ( B)
MOV 30H,R0 ; ( 30H) ← ( R0)
MOV A,R1 ; ( A) ← ( R1)
寄存器间接寻址
寄存器中的内容是一个地址, 由该地址单元
寻址到所需的操作数 。 间接寻址的存储器空
间包括内部数据 RAM和外部数据 RAM。
能用于寄存器间接寻址的寄存器有 R0,R1,
DPTR,SP。 其中 R0,R1必须是工作寄存器组
中的寄存器 。 SP仅用于堆栈操作 。
注意,
1), 间接, 表示某寄存器中的, 内容, 只是一个, 单元地
址,,
这个地址单元中存放的数据才是要找的, 操作数, 。
2)符号, @”表示, 在 …”,其含义与读音皆同, at”。
例如,MOV @R0,A;内部 RAM(R0)←A
其指令操作过程示意图如图 3-1所示 。
又如,MOVX A,@R1; A← 外部 RAM(P2R1)
其指令操作过程示意图如图 3-2所示 。
再如,MOVX @DPTR,A;外部 RAM(DPTR)←A
其指令操作过程示意图如图 3-3所示 。
片内 RAM
30HR0
34HA
30H 34H
图 3-1 MOV @R0,A间接寻址示意图
片 外
RAM
34HP2
45HA
3410H 45H
10HR1
片 外
RAM
2000HDPTR
30HA
2000H 30H
图 3-2 MOVX A,@R1
间接寻址示意图
图 3-3 MOVX @DPTR,A
间接寻址示意图
变址寻址
变址寻址只能对程序存储器中数据进行操作 。 由
于程序存储器是只读的, 因此变址寻址只有读操
作而无写操作, 在指令符号上采用 MOVC的形式
( 如图 3-4所示 ) 。
例如,MOVC A,@A+DPTR ; A← ( A+DPTR)
[设,A中已存有 #10H,DPTR中已存有 #2000H]
操作:将 10H+2000H=2010H单元中的数放进累加器 A
又如, MOVC A,@A+PC ; A← ( A+PC)
这条指令与上条指令不同的是, 基址寄存器是 PC。
图 3-4 变址寻址示意图
程序存储器
2000H
DPTR
64H(10H)
A
2010H 64H
10H 2000H
相对寻址
以当前程序计数器 PC的内容为基础, 加上指令给出的
一字节补码数 ( 偏移量 ) 形成新的 PC值的寻址方式 。
相对寻址用于修改 PC值, 主要用于实现程序的分支转
移 。
SJMP rel
操作:跳转到的目的地址 = 当前 16位 PC值 + rel
注意,
1), 当前 PC值, 指程序中下一条指令所在的首地址,
是一个 16位数;
2) 符号, rel”表示, 偏移量,,是一个带符号的单字
节数,范围是,-128—+127(80H—7FH),
程序存储器
(2000H)
200AH
SJMP
200AH
08H 2000H+2
08H
PC2000H
例如,SJMP 08H ; PC←PC+2+08H
图 3-5 相对寻址示意图
位寻址
位寻址只能对有位地址的单元作位寻址操作 。
位寻址其实是一种直接寻址方式, 不过其地址
是位地址 。 指令中直接给出了操作数所在的位
地址 。
例如,SETB 10H ;将 10H位置 1若 22H单元中
存放着数据 40H,22H单元的 D0位的位地址为
10H,执行上述指令后 ( 22H) =41H。
又如,MOV 32H,C ; 32H← 进位位 C
ORL C, 32H ; C←C∨ 32H
分类指令
数据传送类指令
算术运算类指令
逻辑运算与循环类指令
程序转移类指令
调用子程序及返回指令
位操作指令
空操作指令
数据传送类指令
数据传送类指令共 28条, 是将源操作数送到目
的操作数 。 指令执行后, 源操作数不变, 目的
操作数被源操作数取代 。 数据传送类指令用到
的助记符有 MOV,MOVX,MOVC,XCH,XCHD、
SWAP,PUSH,POP8种 。
源操作数可采用寄存器, 寄存器间接, 直接,
立即, 变址 5种寻址方式寻址, 目的操作数可
以采用寄存器, 寄存器间接, 直接寻址 3种寻
址方式 。
MCS-51单片机片内数据传送途径如图 3-6所示 。
直接地址
direct
累加器
A
直接地址
direct
间接地址
@Ri
寄存器
Rn
立即数
#data
寄存器
DPTR
图 3-6 MCS-51单片机片内数据传送图
1.以 A为目的操作数
MOV A,Rn ; A← Rn
MOV A,direct; A← ( direct)
MOV A,@Ri ; A← ( Ri)
MOV A,#data; A← #data
例,MOV A,R1
MOV A,10H
MOV A,@R1
MOV A,#30H
2.以 Rn为目的操作数
MOV Rn,A ; Rn← A
MOV Rn,direct; Rn ← ( direct)
MOV Rn,#data; Rn← #data
例,MOV R1,A
MOV R1,10H
MOV R1,#10H
3.以直接地址为目的操作数
MOV direct, A; ( direct) ← A
MOVdirect, Rn; ( direct) ← ( Rn )
MOVdirect 1,direct 2; ( direct1) ← ( direct2)
MOV direct,@Ri; ( direct) ← ( Ri)
MOV direct,#data; ( direct) ← #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单元中数据取出 6FH
送入 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,
执行 MOVCA,@ 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是进栈(或称为压入操作)指令。指令执
行过程如图 3-7所示。
片 内
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指令后
图 3-7 指令 PUSH操作示意图 图 3-8 指令 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
XCH A,40H
MOV 30H,A
SJMP $
方法 4( 堆栈传送法 ),
PUSH 30H
PUSH 40H
POP 30H
POP 40H
SJMP $
算术运算类指令
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 A,B ; BA← A× B
A和 B中各存放一个 8位无符号数, 指令执
行后, 16位乘积的高 8位在 B中, 低 8位存
A中 。
例如, A=30H,B=60H,执行 MUL AB 后,
A=00H,B=12H。
5,除法指令
DIV A,B; 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 $
1., 与, 操作指令
2., 或, 操作指令
3., 异或, 操作指令
4,求反与清除指令
5,移位指令
逻辑运算类指令
逻辑与 (ANL),逻辑或 (ORL),逻辑异或 (XRL):
累加器清零 /取反操作 ( CLR,CPL——2条)
CLR A ——对累加器清零 1 Byte 1 个 Tm
CPL A ——对累加器按位取非 1 Byte 1 个 Tm
指 令 形 式 Byte Tm
ANL(ORL,XRL) direct,A 2 1
ANL(ORL,XRL) direct,#data 3 2
ANL(ORL,XRL) A,#data 2 1
ANL(ORL,XRL) A,direct 2 1
ANL(ORL,XRL) A,@Ri 1 1
ANL(ORL,XRL) A,Rn 1 1
逻辑运算指令的常见用法
逻辑与 ANL用于 清 0或者 保留 某些位:
例, ANL A,#0FH; 则 (A) = 0AH
( 已知累加器 A中已存有数,9AH )
逻辑或 ORL用于 置 1或者 保留 某些位:
例, ORL A,#0FH; 则 (A) = 9FH
逻辑异或 XRL用于 取反 或者 保留 某些位:
例, XRL A,#0FH; 则 (A) = 95H
(A) ? 1001 1010
#0FH ? 0000 1111
95H ? 1001 0101
逻辑运算及移位类指令
累加器移位操作,( RL,RLC,RR,RRC——4条)
RL A 左环移
累加器 A
累加器 ACy
累加器 ACy
累加器 A
RRC A 带进位位 右环移
RR A 右 环移
RLC A 带进位位 左环移
控制转移类指令
无条件转移,LJMP,AJMP,SJMP,JMP——4条
LJMP addr16 长跳转指令
—— 可在 64K范围内跳转
AJMP addr11 绝对跳转指令
—— 可在指令所在的 2K范围内跳转
SJMP rel 相对跳转指令
—— 可在当前 PC-128与 +127范围内跳转
JMP @A+DPTR 间接长跳转指令
—— 可在以 DPTR为基址 + A为偏移量
之和所指向的 64K程序范围内跳转
控制转移类指令
条件转移, JZ,JNZ,CJNE,DJNZ——8条
JZ rel
JNZ rel
—— 根据 Acc的内容是否为 0决定是否跳转
DJNZ direct,rel
DJNZ Rn,rel
—— 将 direct(或 Rn)里的内容减 1,结果不等
于 0就跳转;等于 0则不跳转继续往下走。
条件转移 (续)
CJNE A,#data,rel
CJNE A,direct,rel
CJNE @Ri,#data,rel
CJNE Rn,#data,rel
—— 将 A(或 @Ri,或 Rn)与 #data(或 direct)相比
较,其值不相等就跳转;相等则不跳转,继续往下
走。
调用子程序及返回指令
LCALL addr16 子程序长调用指令
—— 可在 64K范围内调用子程序
LCALL,ACALL,RET,RETI——4条
ACALL addr11 子程序绝对调用指令
—— 可在指令所在的 2K范围内调用子程序
RET 子程序返回指令
—— 子程序结束并返回调用的下一条指令
RETI 中断服务子程序返回指令
—— 中断结束 /返回被打断处的下一条指令
位操作指令
1,位数据传送指令
MOV C,bit ; C← ( bit)
MOV bit,C ; bit← C
2,位状态修改指令
CLR C ; C← 0
CLR bit ; ( bit) ← 0
CPL C ; 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)
注,“/bit” 表示对 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转向指定的目标地址去执行
程序;否则, 顺序执行下条指令 。
空操作指令
NOP ; PC ← PC+1
这是一条单字节指令 。 执行时, 不作任
何操作 ( 即空操作 ), 仅将程序计数器
PC的内容加 1,使 CPU指向下一条指令继
续执行程序 。 这条指令常用来产生一个
机器周期的时间延迟 。
51系列单片机指令集含有 111条指令
每条指令在执行时要花去一定的 时间,以机器
周期为单位。按指令 执行时间 分类:
单周期 (64条 );双周期 (45条 );4周期 (2条 )
按指令的 功能 分类,可分为 5大类:
数据传送类( 28条);算术运算类( 24条)
逻辑运算及移位类( 25条);控制转移类( 17条)
位操作类( 17条)
每条指令在程序存储器 ROM中占据一定的 空间,
以字节为单位。按指令 所占字节数 分类:
单字节 (49条 );双字节 (45条 );3字节 (17条 )
MCS-51单片机指令系统有如下特点:
( 1) 指令执行时间快 。
( 2) 指令短, 约有一半的指令为单字节指令 。
( 3) 用一条指令即可实现 2个一字节的相乘或
相除 。
( 4)具有丰富的位操作指令。
( 5)可直接用传送指令实现端口的输入输出操作。
指令格式
在 MCS-51指令中, 一般指令主要由操作
码, 操作数组成 。
指令应具有以下功能:
( 1) 操作码指明执行什么性质和类型的操
作 。 例如, 数的传送, 加法, 减法等 。
( 2) 操作数指明操作的数本身或者是操作
数所在的地址 。
( 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的直接地址或寄存器 。
( (× )) —— 由 × 寻址的单元中的内容 。
—— 箭头左边的内容被箭头右边的内
容所代替 。
51单片机指令的寻址方式
? 立即寻址
? 直接寻址
? 寄存器寻址
? 寄存器间接寻址
? 变址寻址 (基址寄存器 +变址寄存器间接寻址 )
? 相对寻址
? 位寻址
寻址方式:指令按地址获得操作数的方式
七种寻址方式,一条指令可能含多种寻址方式 。
立即寻址
指令中直接给出操作数的寻址方式 。 立即操作
数用前面加有 #号的 8位或 16位数来表示 。
例如,MOV A,# 60H ; A←# 60H
MOV DPTR,# 3400H ; DPTR←# 3400H
MOV 30H,# 40H; 30H单元 ← #40H
上述三条指令执行完后, 累加器 A中数据为立即
数据 60H,DPTR寄存器中数据为 3400H,30H单元
中数据为立即数 40H。
注意:符号, #”表明其后跟的是立即数,
立即数 ——就是数字量本身 。
直接寻址
指令中直接给出操作数地址的寻址方式, 能进行直接
寻址的存储空间有 SFR寄存器和内部数据 RAM。
例如,MOV R1,1FH ; (R1) ← ( 1FH)
MOV 30H,4AH ; (30H)← ( 4AH)
在本单片机中规定:访问特殊功能寄存器 SFR只能采用直
接寻址方式。例如:
MOV A,SP ; (A) ←(SP)
MOV A,81H ; (A) ←(SP)
MOV P1,#5AH ; (P1)←(#5AH)
MOV 90H,#5AH ; (P1)←(#5AH)
MOV B,30H ; (B) ←(30H)
相同
相同
寄存器寻址
以通用寄存器的内容为操作数的寻址方式 。 通
用寄存器指 A,B, DPTR以及 R0~ R7 。
从寄存器中读取操作数或存放操作数进寄存器
例如,CLR A ; A← 0
INC DPTR ; (DPTR)←(DPTR+ 1)
ADD R5,#20H ; (R5)←(R 5+#20H)
MOV A,B ; ( A) ← ( B)
MOV 30H,R0 ; ( 30H) ← ( R0)
MOV A,R1 ; ( A) ← ( R1)
寄存器间接寻址
寄存器中的内容是一个地址, 由该地址单元
寻址到所需的操作数 。 间接寻址的存储器空
间包括内部数据 RAM和外部数据 RAM。
能用于寄存器间接寻址的寄存器有 R0,R1,
DPTR,SP。 其中 R0,R1必须是工作寄存器组
中的寄存器 。 SP仅用于堆栈操作 。
注意,
1), 间接, 表示某寄存器中的, 内容, 只是一个, 单元地
址,,
这个地址单元中存放的数据才是要找的, 操作数, 。
2)符号, @”表示, 在 …”,其含义与读音皆同, at”。
例如,MOV @R0,A;内部 RAM(R0)←A
其指令操作过程示意图如图 3-1所示 。
又如,MOVX A,@R1; A← 外部 RAM(P2R1)
其指令操作过程示意图如图 3-2所示 。
再如,MOVX @DPTR,A;外部 RAM(DPTR)←A
其指令操作过程示意图如图 3-3所示 。
片内 RAM
30HR0
34HA
30H 34H
图 3-1 MOV @R0,A间接寻址示意图
片 外
RAM
34HP2
45HA
3410H 45H
10HR1
片 外
RAM
2000HDPTR
30HA
2000H 30H
图 3-2 MOVX A,@R1
间接寻址示意图
图 3-3 MOVX @DPTR,A
间接寻址示意图
变址寻址
变址寻址只能对程序存储器中数据进行操作 。 由
于程序存储器是只读的, 因此变址寻址只有读操
作而无写操作, 在指令符号上采用 MOVC的形式
( 如图 3-4所示 ) 。
例如,MOVC A,@A+DPTR ; A← ( A+DPTR)
[设,A中已存有 #10H,DPTR中已存有 #2000H]
操作:将 10H+2000H=2010H单元中的数放进累加器 A
又如, MOVC A,@A+PC ; A← ( A+PC)
这条指令与上条指令不同的是, 基址寄存器是 PC。
图 3-4 变址寻址示意图
程序存储器
2000H
DPTR
64H(10H)
A
2010H 64H
10H 2000H
相对寻址
以当前程序计数器 PC的内容为基础, 加上指令给出的
一字节补码数 ( 偏移量 ) 形成新的 PC值的寻址方式 。
相对寻址用于修改 PC值, 主要用于实现程序的分支转
移 。
SJMP rel
操作:跳转到的目的地址 = 当前 16位 PC值 + rel
注意,
1), 当前 PC值, 指程序中下一条指令所在的首地址,
是一个 16位数;
2) 符号, rel”表示, 偏移量,,是一个带符号的单字
节数,范围是,-128—+127(80H—7FH),
程序存储器
(2000H)
200AH
SJMP
200AH
08H 2000H+2
08H
PC2000H
例如,SJMP 08H ; PC←PC+2+08H
图 3-5 相对寻址示意图
位寻址
位寻址只能对有位地址的单元作位寻址操作 。
位寻址其实是一种直接寻址方式, 不过其地址
是位地址 。 指令中直接给出了操作数所在的位
地址 。
例如,SETB 10H ;将 10H位置 1若 22H单元中
存放着数据 40H,22H单元的 D0位的位地址为
10H,执行上述指令后 ( 22H) =41H。
又如,MOV 32H,C ; 32H← 进位位 C
ORL C, 32H ; C←C∨ 32H
分类指令
数据传送类指令
算术运算类指令
逻辑运算与循环类指令
程序转移类指令
调用子程序及返回指令
位操作指令
空操作指令
数据传送类指令
数据传送类指令共 28条, 是将源操作数送到目
的操作数 。 指令执行后, 源操作数不变, 目的
操作数被源操作数取代 。 数据传送类指令用到
的助记符有 MOV,MOVX,MOVC,XCH,XCHD、
SWAP,PUSH,POP8种 。
源操作数可采用寄存器, 寄存器间接, 直接,
立即, 变址 5种寻址方式寻址, 目的操作数可
以采用寄存器, 寄存器间接, 直接寻址 3种寻
址方式 。
MCS-51单片机片内数据传送途径如图 3-6所示 。
直接地址
direct
累加器
A
直接地址
direct
间接地址
@Ri
寄存器
Rn
立即数
#data
寄存器
DPTR
图 3-6 MCS-51单片机片内数据传送图
1.以 A为目的操作数
MOV A,Rn ; A← Rn
MOV A,direct; A← ( direct)
MOV A,@Ri ; A← ( Ri)
MOV A,#data; A← #data
例,MOV A,R1
MOV A,10H
MOV A,@R1
MOV A,#30H
2.以 Rn为目的操作数
MOV Rn,A ; Rn← A
MOV Rn,direct; Rn ← ( direct)
MOV Rn,#data; Rn← #data
例,MOV R1,A
MOV R1,10H
MOV R1,#10H
3.以直接地址为目的操作数
MOV direct, A; ( direct) ← A
MOVdirect, Rn; ( direct) ← ( Rn )
MOVdirect 1,direct 2; ( direct1) ← ( direct2)
MOV direct,@Ri; ( direct) ← ( Ri)
MOV direct,#data; ( direct) ← #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单元中数据取出 6FH
送入 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,
执行 MOVCA,@ 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是进栈(或称为压入操作)指令。指令执
行过程如图 3-7所示。
片 内
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指令后
图 3-7 指令 PUSH操作示意图 图 3-8 指令 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
XCH A,40H
MOV 30H,A
SJMP $
方法 4( 堆栈传送法 ),
PUSH 30H
PUSH 40H
POP 30H
POP 40H
SJMP $
算术运算类指令
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 A,B ; BA← A× B
A和 B中各存放一个 8位无符号数, 指令执
行后, 16位乘积的高 8位在 B中, 低 8位存
A中 。
例如, A=30H,B=60H,执行 MUL AB 后,
A=00H,B=12H。
5,除法指令
DIV A,B; 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 $
1., 与, 操作指令
2., 或, 操作指令
3., 异或, 操作指令
4,求反与清除指令
5,移位指令
逻辑运算类指令
逻辑与 (ANL),逻辑或 (ORL),逻辑异或 (XRL):
累加器清零 /取反操作 ( CLR,CPL——2条)
CLR A ——对累加器清零 1 Byte 1 个 Tm
CPL A ——对累加器按位取非 1 Byte 1 个 Tm
指 令 形 式 Byte Tm
ANL(ORL,XRL) direct,A 2 1
ANL(ORL,XRL) direct,#data 3 2
ANL(ORL,XRL) A,#data 2 1
ANL(ORL,XRL) A,direct 2 1
ANL(ORL,XRL) A,@Ri 1 1
ANL(ORL,XRL) A,Rn 1 1
逻辑运算指令的常见用法
逻辑与 ANL用于 清 0或者 保留 某些位:
例, ANL A,#0FH; 则 (A) = 0AH
( 已知累加器 A中已存有数,9AH )
逻辑或 ORL用于 置 1或者 保留 某些位:
例, ORL A,#0FH; 则 (A) = 9FH
逻辑异或 XRL用于 取反 或者 保留 某些位:
例, XRL A,#0FH; 则 (A) = 95H
(A) ? 1001 1010
#0FH ? 0000 1111
95H ? 1001 0101
逻辑运算及移位类指令
累加器移位操作,( RL,RLC,RR,RRC——4条)
RL A 左环移
累加器 A
累加器 ACy
累加器 ACy
累加器 A
RRC A 带进位位 右环移
RR A 右 环移
RLC A 带进位位 左环移
控制转移类指令
无条件转移,LJMP,AJMP,SJMP,JMP——4条
LJMP addr16 长跳转指令
—— 可在 64K范围内跳转
AJMP addr11 绝对跳转指令
—— 可在指令所在的 2K范围内跳转
SJMP rel 相对跳转指令
—— 可在当前 PC-128与 +127范围内跳转
JMP @A+DPTR 间接长跳转指令
—— 可在以 DPTR为基址 + A为偏移量
之和所指向的 64K程序范围内跳转
控制转移类指令
条件转移, JZ,JNZ,CJNE,DJNZ——8条
JZ rel
JNZ rel
—— 根据 Acc的内容是否为 0决定是否跳转
DJNZ direct,rel
DJNZ Rn,rel
—— 将 direct(或 Rn)里的内容减 1,结果不等
于 0就跳转;等于 0则不跳转继续往下走。
条件转移 (续)
CJNE A,#data,rel
CJNE A,direct,rel
CJNE @Ri,#data,rel
CJNE Rn,#data,rel
—— 将 A(或 @Ri,或 Rn)与 #data(或 direct)相比
较,其值不相等就跳转;相等则不跳转,继续往下
走。
调用子程序及返回指令
LCALL addr16 子程序长调用指令
—— 可在 64K范围内调用子程序
LCALL,ACALL,RET,RETI——4条
ACALL addr11 子程序绝对调用指令
—— 可在指令所在的 2K范围内调用子程序
RET 子程序返回指令
—— 子程序结束并返回调用的下一条指令
RETI 中断服务子程序返回指令
—— 中断结束 /返回被打断处的下一条指令
位操作指令
1,位数据传送指令
MOV C,bit ; C← ( bit)
MOV bit,C ; bit← C
2,位状态修改指令
CLR C ; C← 0
CLR bit ; ( bit) ← 0
CPL C ; 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)
注,“/bit” 表示对 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转向指定的目标地址去执行
程序;否则, 顺序执行下条指令 。
空操作指令
NOP ; PC ← PC+1
这是一条单字节指令 。 执行时, 不作任
何操作 ( 即空操作 ), 仅将程序计数器
PC的内容加 1,使 CPU指向下一条指令继
续执行程序 。 这条指令常用来产生一个
机器周期的时间延迟 。