Professional Documents
Culture Documents
第三讲 指令集
河海大学计算机与信息学院
目录
本讲重点:
寻址方式;
CIP-51 指令集;
CIP-51 指令系统
简介
CIP-51 系统控制器的指令集与标准
MCS-51TM 指令集完全兼容,可以使用标准
8051 的开发工具开发 CIP-51 的软件。所有
的 CIP-51 指令在二进制码和功能上与同类
的 MCS-51TM 产品完全等价,包括操作码、
寻址方式和对 PSW 标志的影响,但是指令
时序与标准 8051 不同。
ASM-51 指令的格式
[ 标号 :] 操作码 [ 目的操作数 ][, 源操作数 ][;
注释
] [ ] 表示可选项
方括符
标号代表指令所在地址 , 1-8 个字母 / 数字 , 以
字母开始,“ :” 结尾
操作码就是指令功能助记符,指令实体
目的操作数
源操作数
注释,以“ ;” 开头
3 . 1 汇编语言
3.1.1 指令和程序设计语言
◆ 指令:是 CPU 根据人的意图来执行某种操作的命令;
◆ 指令系统:一台计算机所能执行的全部指令的集合;
◆ 程序:按人的要求编写的指令操作序列;
◆ 程序设计:编写程序的过程。
◆ 机器语言:用二进制编码表示每条指令,是计算机能直接识别和执
行的语言。
◆ 汇编语言:用助记符、符号和数字来表示指令的程序语言。
◆ 机器语言程序:用机器语言编写的程序;也叫指令程序,目标程序
。
◆ 汇编语言程序:用汇编语言编写的程序。
例如: 10 + 20 汇编语言程序 机器语言程序
MOV A , #0AH ; 74H 0AH
ADD A , #14H ; 24H 14H
3.1.2 指令格式
例如:
LOOP: MOV A, R0 ; 将 R0 的内容
送A
[ 标号 ] 操作码 第一操作数 第二操作数
[ 注释 ]
(目的操作数) (源操作数)
● 操作码部分:规定指令所实现的操作功能,由 2 ~ 5 个字母组成
;
● 操作数部分:指出了参与操作的数据来源和操作结果存放的目的
单元。
操作数可以直接是一个数(立即数),或是一个数据所在的
空间地址;
● 指令类型:按字节长度分为:
单字节指令、双字节指令和三字节指令。
1 、单字节指令 49 条
指令中的 8 位二进制代码既包含操作码
的信息,也包含操作数的信息。
1 0 1 0 0 0 1 1
( 1 )指令码中隐含着对某一个寄存器的操作
例如: INC DPTR
( 2 )由指令码中的 rrr 三位的不同编码指定某
一个寄存器 1 1 1 0 1 r r r
例如: MOV A , Rn
rrr:0 ~ 7 R0 ~
2 、双字节指令 45 条
用一个字节表示操作码,另一个
字
节表示操作数或操作数所在的地址。
操 作 码 立即数或地址
74H 30H
例如: MOV A , #30H
0E5H 30H
MOV A , 30H
3 、三字节指令 17 条
一个字节表示操作码,两个字节表示操作数
或操作数所在的地址。
操 作 码 直接地址 立即数或地址
直接寻址方式:在指令直接给出操作数所
在存储单元的地址。此时,指令中操作数的部分是
操作数所在的地址。采用直接寻址方式的指令是双
字节指令。只有内部的 RAM 的低 128 字节和特殊
功能寄存器( SFR )才能采用直接寻址方式。由于
RAM 高 128 字节的地址与专用寄存器的地址是重
叠的,故直接寻址方式就不能用于内部 RAM 的高
128 字节。
直接寻址
指令中直接给出了操作数所在单元的地址或名称
R0 65H
47H 65H
A 47H
在本单片机中访问特殊功能寄存器 SFR 只能采用
直接寻址方式的原因: SFR 分布在 80H ~ 0FFH 范
围内,而 52 系列单片机有 256 字节的片内 RAM,
其中的 80H ~ 0FFH 的 RAM 与 SFR 所占地址重叠
。
于是规定: 80H ~ 0FFH 范围内的 RAM 只能用寄
存器间接寻址方式,而 SFR 只能用直接寻址方式。
从而解决了地址冲突的问题。例如:
只能寄存器间接寻址
FFH FFH
SFR 分布在
52 子系列才有 80H-FFH
的 RAM 区 其中 92 个
位可位寻址
80H 80H
89C52 7FH
256 字节
普通 RAM 区
89C51 30H 只能直接寻址
128 字节 2FH
位寻址区
20H
1FH 工作寄存器区
00H
5 、变址寻址
也称为 : 基址寄存器 + 变址寄存器间接寻址
变址寻址是以某个寄存器的内容为基地址
,然后在基地址的基础上加上地址偏移量,形
成真正的操作数地址。这种寻址方式用于访问
程序存储器,尤其适用于查表访问。
用数据指针 DPTR 或程序计数器 PC 作为变
址寄存器,以累加器 A 作为基址寄存器,以 DP
TR 或 PC 的内容与加累加器 A 的内容之和,作
为操作数的 16 位程序存储器地址。
MOVC A , @A+DPTR ; A ← ((A)+(DPTR))
MOVC A , @A+PC ; A ← ((A)+(PC))
DPTR
02F1 A
+ 0302H 1EH 1EH
A
11H
变址寻址方式的另一种情况是用在条件
转移指令中。在这种情况下,转移指令的目
标地址就是基址寄存器加上变址寄存器的和。
例如:
JMP @A+DPTR ; 跳转到地址 (A)+(DPTR)
6 、相对寻址
相对寻址只用在相对转移指令中。相对转移指
令执行时,是以当前的 PC 值加上指令中规定的偏移
量 rel 而形成实际的转移地址。
PC 的当前值:执行完相对转移指令后的 PC 值;
源地址:相对转移指令操作码所在的地址;
目的地址:转移后的地址;
目的地址=源地址+ 2 (相对转移指令字节数)+ rel
rel 范围:- 128 ~+ 127
例如: JC rel 设 CY=1 , rel=75H
实际使用时,用标号:
JC LABLE
┆
LABLE: MOV A , #30H
6 、位寻址
采用位寻址方式指令的操作数是 8 位二进制数
中
的某一位。指令中给出的是位地址,即片内 RAM
(包括 SFR )某一单元中的一位,用 bit 表示。用两
种方式表示:
● 直接使用地址: 20H ~ 2FH 的 16 个单元的位
地
址: 00H ~ 7FH;
如: CLR 00H
SETB 7FH
● 使用 “ .” 运算符。对于特殊功能寄存器,可以
直
接用寄存器名加位数表示。
片内 RAM 中有 128 个
位可按位寻址的位,位 D7 D6 D5 D4 D3 D2 D1 D0
地址: 00H—7FH 分布
2FH 7F 7E 7D 7C 7B 7A 79 78
在: 20H—2FH 单元;
另外,在 SFR 中还有 92 位地址
个位可按位寻址
28H 47 46 45 44 43 42 41 40
FFH 总共
27H 3F 3E 3D 3C 3B 3A 39 38 128
52 子系列才有 26H 37 36 35 34 33 32 31 30 个可
的 RAM 区 按位
25H 2F 2E 2D 2C 2B 2A 29 28
寻址
80H 24H 27 26 25 24 23 22 21 20 的位
7FH
23H 1F 1E 1D 1C 1B 1A 19 18
普通 RAM 区
30H 22H 17 16 15 14 13 12 11 10
2FH
位寻址区 21H 0F 0E 0D 0C 0B 0A 09 08
20H
1FH 工作寄存器区 20H 07 06 05 04 03 02 01 00
00H
单元地址
3.2.2 寻址空间及符号注释
1 、寻址空间
寻 址 方 式 寻 址 空 间
立即数寻址 程序存储器
直接寻址 片内低 128BRAM ,特殊功能寄存器
寄存器寻址 工作寄存器 R0 ~ R7, A,B,DPTR
寄存器间接寻址 片内 256RAM, 片外 RAM 或 I/O 端口
变址寻址 程序存储器 (@A+PC,@A+DPTR)
相对寻址 程序存储器 256B 范围( PC+ 偏移)
位寻址 片内 RAM 的 20H ~ 2FH 字节地址部
分特殊功能寄存器
2 、寻址方式中常用符号注释
注:
MOV A, @Ri ;以 Ri 的内容为地址 ,把该地址中
;的内容送到 A 中去。 A← ((Ri))
MOV A, R0 ;将 R0 的内容送到 A 去。 A← (R0))
注意以上两组指令的不同点
2. 以 Rn 为目的操作数的指令
MOV Rn , A ; Rn ← (A) , n
=0~7
MOV Rn , direct ; Rn ← (direct)
MOV Rn ,# data ; Rn ← # data
3. 以直接地址为目的操作数的指令
MOV direct, A ; direct← (A)
MOV direct, Rn ; direct← (Rn) , n=0
~7
MOV direct, @Ri ; direct← (( Ri ) ) , i=0,1
MOV direct, direct ; direct← (direct)
MOV direct, #data ; direct← # data
4. 以寄存器间接地址为目的操作数指令
MOV @Ri , A ; ((Ri) )← (A) , i=
0,1
MOV @Ri , direct ; ((Ri) )← (direc
t)
MOV @Ri ,# data ; ((Ri) )← # dat
a
Acc 累加器
Rn : R0—R7
@Ri : @R0 , @R1
#data : 8 位立即数
#data16 : 16 位立即数
direct :直接地址
rel : 8 位带符号偏移量
5 、十六位数据传送指令( 1 条)
MOV DPTR , #data16 ; 16 位立即数寻址
例如:
MOV DPTR , #2000H ; DPH ← dataH ,
; DPL← dataL
也可以写成:
MOV DPH , #20H
MOV DPL , #00H
6 、查表指令
MOVC A , @A+DPTR
MOVC A , @A+PC
—— 寻址方式属 :
“ 基址寄存器 + 变址寄存器间接寻址”
堆栈的存储原则:先进后出
例如:设 (A)=7BH; (35H)=11H
并且知道( SP )= 60H
PUSH ACC ;(61H) #7BH
PUSH 35H ;(62H) (35H)
即: (62H) #11
H
POP ACC ;(A) (62H)
即: (A) #11H
POP 5AH ;(5AH) (61H)
即: (5AH) #7BH
9 、数据交换指令 (5 条 ):
( 1 )字节交换指令
XCH A , direct
XCH A , @Ri
XCH A , Rn
( A ) ( direct ) [ 或 ((Ri)) ,或 (Rn)]
( 2 )字节交换指令
XCHD A , @Ri
累加器 Acc 的低 4 位与 ((Ri)) 的低 4 位
互换,各自的高 4 位不变
SWAP A
累加器 Acc 的低 4 位与自身的高 4 位互换
3.3.2 算术运算类指令( 6 种 /24 条)
加法运算: (ADD——4
条)
带进位加法运算 : (ADDC——4
条)
带借位减法运算 : (SUBB——4
条)
加 1/ 减 1 操作: (INC , DEC——9
条)
单字节乘 / 除法运算 : (MUL , DIV——2
条)
算术运算类指令
加法运算: ( ADD——4
条)
带进位加法运算 : ( ADDC——4
条)
所有的加法 (ADD) 、带进位加法 (ADDC) 、带借
带借位减法运算 : ( SUBB——4
位减法 (SUBB) 运算都是以 A 为一个加数或被减 条 )
数 , 最终结果也存进 A 。
加法 (ADD) 、带进位加法 (ADDC) 以及带借位
减法 (SUBB) 运算中 , 如果产生了进位或借位 ,
将自动对 PSW 中的 Cy 标志位置“ 1” 。
带进位加法 (ADDC):(A)(A)+(Cy)+( 第二操
作数 ) 带借位减法 (SUBB):(A)(A)-(Cy)-
( 第二操作数 )
1 、不带进位加法指令( Addtion )
ADD A, Rn ; A← ( A ) + ( Rn )
ADD A, @Ri ; A← ( A ) + ( (Ri) )
ADD A, direct ; A← ( A)+(direct)
ADD A, # data ; A← ( A)+#data
对标志位的影响
C ------ 进位位
y
AC ------ 半进位位
OV ------ 溢出位
2. 带进位加法指令
ADDC A, Rn ; A←(A)+(Rn)+(Cy)
ADDC A, @Ri ; A←(A)+((Ri )) +(Cy)
ADDC A, direct ; A← ( A)+(direct) +(C
y)
ADDC A, # data ; A← ( A)+#data +(Cy)
对标志位的影响与 ADD 相同
3 、带借位减法指令( Subtraction )
SUBB A, Rn ; A← ( A)-(Rn)-(C
y)
SUBB A, @Ri ; A← ( A)-((Ri) ) -(C
y)
SUBB A, direct ; A← ( A)-(direct) -
(Cy )
SUBB A, # data ; A← ( A)-#data -
(Cy )
对标志位的影响
Cy ------ 进位位
AC ------ 半进位位
4 、乘法指令( Multiplication )
MUL AB ; (A)×(B) 低 8 位→ A
高 8 位→ B
A 、 B 中都是无符号整数
如果积大于 255 , OV = 1 ,否则 OV = 0 ;
进位标志总是清零 Cy = 0
5 、 除法指令( Division )
DIV AB ; (A)÷(B) 商 →
A
余数→ B
A 、 B 中都是无符号整数
如果除数 B 为“ 0” , OV = 1 ,否则 OV = 0
;
进位标志总是清零 Cy = 0
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
对标志位不产生影响
若: ( A )= 0FFH , (Cy)=0
执行: INC A
结果:( A )= 00H , (Cy)=0
7 、 减 1 指令( Decrease )
DEC A ; A←(A) - 1
DEC Rn ; Rn← ( Rn )- 1
DEC direct ; direct← ( direc
t) - 1
DEC @Ri ; (Ri)←((Ri)) - 1
对标志位不产生影响
若: ( A )= 00H , (Cy)=0
执行: DEC A
结果:( A )= 0FFH , (Cy)=0
无 DEC DPTR 指令
8 、十进制调整 ( 1 条)
DA A
用于两个 BCD 码之间的相加,这条指令只能跟在
ADD 或 ADDC 之后
BCD 码是指“用二进制表达的十进制数”。如:
十进制数 20 可以用二进制数 00010100B 表
示; 也可以用十六进制数 14H 表示;
还可以用 BCD 码
00100000B
4 或 20H
个二进制位就可以表示一位 表示。
BCD 码:
0000 ~ 1001 可表示十进制数 (BCD 数 ) 0 ~ 9
; 8 个二进
制位就可以表示两位压缩的 BCD 码: 0000000
0 ~ 10011001 表示 00 ~ 99 。
指令 “ DA A” 完成的操作:
若 (A)3 ~ 09 或 (AC)=1 则 (A)3 ~ 0(A)3 ~ 0 + 6
; 若 (A)7 ~ 49 或 (CY)=1
则例 (A)7 ~ 4(A)7 ~ 4 +65”
5 :两个十进制数“ 6 ; 与“ 58” 相加,根据常
识,显然其和应当为“ 123” 。
6 5 0110 0101
MOV A,#65H
ADD A,#58H 5 8 0101 1000
DA A + B>9 D>9
6 6 0110 0110
结果 :(A)= 23H
18 19
(CY)= 1
1 2 3
指令 “ DA A” 完成的操作:
若 (A)3 ~ 09 或 (AC)=1 则 (A)3 ~ 0(A)3 ~ 0 + 6
; 若 (A)7 ~ 49 或 (CY)=1 则 (A)7 ~ 4
(A) 7 ~ 4 + 6 ;
又如:两个十进制数“ 39” 与“ 58” 相加,根据
常识,显然其和应当为“ 97” 。
3 9 0011 1001
MOV A,#39H
ADD A,#58H 5 8 0101 1000
DA A 9 1
AC=1
结果 :(A)= 97H + 6 0110
(CY)= 0 23
0 9 7
3.3.3 逻辑运算及移位类指令( 5 种 /24
条)
逻辑与运算: ( ANL——6 条)
逻辑或运算: ( ORL——6 条)
逻辑异或运算: ( XRL——6 条)
累加器移位操作 : ( RL,RLC,RR,RRC—4 条)
1 、简单操作指令
( 1 )累加器 A 清 0 指令 只影响 P
CLR A ; A← “0”
RLC A 带进位位循环左
累加器 A
移
RL A 累加器 A 循环左移
RR A
Cy 累加器 A
循环右移
RRC A 累加器 A
带进位位循环右移
Cy
SWAP A ;
A0~3 A4~
7
累加器 A 的高低半字节交换
例: (A)=3AH,
SWAP A
(A)=0A3H
4 、逻辑与 (ANL)
指 令 形 式 Byte Tm
ANL direct , A 2 1
ANL direct , #data 3 2
ANL A, #data 2 1
ANL A, direct 2 1
ANL A, @Ri 1 1
ANL A, Rn 1 1
∧ -- “与” , “有 0 即 0 ,全 1 为 1”
0000 0111
∧ ) 1111 1101
0000 0101 B = 05H
5 、逻辑或 (ORL)
指 令 形 式 Byte Tm
ORL direct , A 2 1
ORL direct , #data 3 2
ORL A, #data 2 1
ORL A, direct 2 1
ORL A, @Ri 1 1
ORL A, Rn 1 1
∨ -- “或” , “有 1 即 1 ,
全 0 为 0”
0000 0110
∨ ) 0110 1101
0110 1111 B = 6FH
逻辑异或 (XR
L)
指 令 形 式 Byte Tm
XRL direct , A 2 1
XRL direct , #data 3 2
XRL A, #data 2 1
XRL A, direct 2 1
XRL A, @Ri 1 1
XRL A, Rn 1 1
“异或”
-- , “相异为 1 ,相同为 0”
0000 0110
) 0110 1101
0110 1011 B = 6BH
例 ( A ) =01××××××B , × 表示随机状态,为 1 或 0 ,执
行下述一组指令执行后 A 的值如何 ?
0 1××××××
XRL A , #0C0H ;将累加器 A 的内容 D7 、 D6 取反 110 0 0 0 0 0
1 0××××××
ORL A , #03H 将累加器 A 的内容 D1 、 D0 置 1 000 0 0 0 1 1
1 0 ×××× 1 1
ANL A , #0E7H ;将累加器 A 的内容 D4 、 D3 清 0 11 1 0 0 1 1 1
10×0 0×1 1
解 :执行上述指令后,( A ) =10×00×11B 。
逻辑运算指令的常见用法
( 已知累加器 A 中已存有数: 9AH )
逻辑与 ANL 用于清 0 或者保留某些位:
例 : ANL A, #0FH; 则 (A) = 0A
H
逻辑或 ORL 用于置 1 或者保留某些位:
例 : ORL A, #0FH; 则 (A) = 9F
H
逻辑异或 XRL 用于取反或者保留某些位:
例 : XRL A, #0FH; 则 (A) = 9
5H
(A) 1001 1010
#0FH 0000 1111
95H 1001 0101
3 . 3 . 4 控制转移类指令( 4 种 /17
条)
此类指令改变程序的执行顺序——改变当前 PC 值
无条件转移:
( LJMP,AJMP,SJMP,JMP——4
条)
条件转移(判断跳转):
( JZ,JNZ,CJNE,DJNZ——8
条)
子程序调用及返回:
( LCALL,ACALL,RET,RETI——4
条)
1 、无条件转移: LJMP,AJMP,SJMP,JMP——4
条
LJMP addr16 长跳转指令
—— 可在 64K 范围内跳转
AJMP addr11 绝对跳转指令
—— 可在指令所在的 2K 范围内跳转
SJMP rel 相对跳转指令
—— 可在当前 PC-128 与 +127 范围内跳
转
NOP ; PC ← (PC) + 1
作用:
产生一个机器周期的延时、调整转向。
3、条件转移: JZ,JNZ,CJNE,DJNZ—8 条
判零转移指令
JZ rel
JNZ rel
—— 根据 Acc 的内容是否为 0 决定是否跳转
JB bit , rel
—— ( bit ) =“1” 就跳转;否则不跳转
JNB bit , rel
—— ( bit )“ 1” 就跳转;否则不跳转
JBC bit , rel
—— ( bit ) =“1” 就先将其清零 再跳转;
否则,不动此位也不跳
转。
比较转移指令
CJNE A, #data, rel (A)=#data ,继续 C←
CJNE A, direct,rel 0
(A) > #data , 转
CJNE @Ri,#data, rel C←0
CJNE Rn, #data, rel (A) < #data
, 转 C←1
—— 将 A( 或 @Ri, 或 Rn) 与 #data( 特点:只 或 direc
t) 相比较,其值不相等就跳转 ;相等则不跳转 ,
有<时, C←1
继续往下走。 例:延时子程序
delay : MOV R7, #03H
循环转移指令 delay0 : MOV R6, #19H
delay1 : DJNZ R6, delay
DJNZ direct , rel 1
DJNZ R7, delay0
DJNZ Rn , rel RET
—— 将 direct( 或 Rn) 里的内容减 1 ,结果不
等于 0 就跳转;等于 0 则不跳转继续往下走。
4、子程序调用及返回:
( LCALL,ACALL,RET,RETI——
4 条)
LCALL addr16 子程序长调用指令
—— 可在 64K 范围内调用子程序 ( 入栈 )
ACALL addr11 子程序绝对调用指
令
— 可在指令所在的 2K 范围内调用子程序 ( 入
RET 子程序返回指令
栈)
— 子程序结束并返回调用的下一条指令 ( 出
栈)
RETI 中断服务子程序返回指令
中断结束 / 返回被打断处的下一条指令 ( 出栈
清除中断状态 )
3.3.5 位操作类指令( 17 条)
位操作类指令 以位为单位进行逻辑运算及操作 , 可
分为 4 种:
位传送: ( MOV——2
条)
位清零 / 置位: ( CLR,SETB——4
条)
位逻辑与 / 或 / 非运算:( ANL,ORL,CPL——6
条)
1 、位传送指令( 2 条):
MOV C , bit ;( C )( bit )
MOV bit , C ;( bit )( C )
注: bit 表示位地址
2 、位修改指令( 4 条):
( 1 )位清零指令
CLR C ; ( C )“ 0”
CLR bit ;( bit )“ 0”
( 2 )位置 1 指令
SETB C ; ( C )“ 1”
SETB bit ;( bit )“ 1”
( 3 )位取反指令
CPL C ; ( C ) ( C )
CPL bit ;( bit )( bit )
3 、位逻辑运算指令( 6 条):
( 1 )位逻辑与指令
ANL C , bit
ANL C , /bit
( 2 )位逻辑或指令
ORL C , bit
ORL C , /bit
注 :“/bit” 表示对 bit 位的反参加运算, bit 本身
不变
4 、位条件转移指令
( 1 )判布尔累加器 C 转移指令
JC rel—— ( Cy ) =“1” 就跳转;否则不跳转
JNC rel—— ( Cy )“ 1” 就跳转;否则不跳转
( 2 )判位变量转移指令
JB bit , rel
—— ( bit ) =“1” 就跳转;否则不跳转
JNB bit , rel
—— ( bit )“ 1” 就跳转;否则不跳转
JBC bit , rel
—— ( bit ) =“1” 就先将其清零 再跳转;
否则,不动此位也不跳
转。