You are on page 1of 80

基于机器人项目驱动的嵌入式教学讲义

第三讲 指令集

河海大学计算机与信息学院
目录

本讲重点:
寻址方式;
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 条

一个字节表示操作码,两个字节表示操作数
或操作数所在的地址。

操 作 码 直接地址 立即数或地址

例如: MOV 30H , #40H


75H 30H 40H
3.2 寻址方式
寻址方式:寻找(或确定)操作数所在单元地址的方式。
寻址方式越多,计算机寻址能力越强,但指令 系统也越复杂

3.2.1 七种寻址方式 , 一条指令可能含多种寻址方
 寄存器寻址

 立即寻址
 直接寻址
 寄存器间接寻址
 变址寻址 ( 基址寄存器 + 变址寄存器间接寻址 )
 相对寻址
 位寻址
1 、寄存器寻址
寄存器寻址 : 由指令指出寄存器组 R0 ~ R
7的
某一个或其他寄存器( A , B , DPTR 等)的内

作为操作数。而寄存器组则由 PSW 中寄存器组

择控制位( RS1 、 RS0 )来确定。
操作数在寄存器中 ,如 R0-R7 , A 、 B
、 Cy
(位)、 DPTR 等
例: MOV A,B ; ( A ) ←( B )
2 、立即数寻址
在立即数寻址方式中,跟在操作码后面的
是一字节或两字节的操作数,用#号表示,以区
别直接地址。因此,操作数就是放在程序存储器
中的常数。
操作数在指令中直接给出
例: MOV A , #64H ; (A)← 立即数 64H
ADD A , #05H ; (A)←(A)+ 立即数 05H
MOV DPTR , #2000H ; DPTR ← 2000H
注意:符号“ #” 表明其后跟的是立即数 ,
立即数——就是数字量本身。
3 、 直接寻址

直接寻址方式:在指令直接给出操作数所
在存储单元的地址。此时,指令中操作数的部分是
操作数所在的地址。采用直接寻址方式的指令是双
字节指令。只有内部的 RAM 的低 128 字节和特殊
功能寄存器( SFR )才能采用直接寻址方式。由于
RAM 高 128 字节的地址与专用寄存器的地址是重
叠的,故直接寻址方式就不能用于内部 RAM 的高
128 字节。
直接寻址
指令中直接给出了操作数所在单元的地址或名称

例: 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)←相同
#5A
H
MOV 90H,#5AH ; (P1)←#5AH
MOV B, 30H ; (B) ←(30H)
4 、寄存器间接寻址
在间接寻址方式中,指令指定某个寄存器
来存放操作数的地址,由该地址所指定的单元
内容作为操作数。内部和外部 RAM 都可采用这
种寻址方式,但不能用这种寻址方式对专用寄
存器进行访问。
可采用工作寄存器 R0 或 R1 作为间址寄存
器,可对 256 字节的 RAM 单元进行寻址。采用
工作寄存器 R0 或 R1 、 16 位的数据指针寄存
器( DPTR )作为间址寄存器,这时可对 64KB
的外部数据存储器空间(包括 I/O )寻址。
寄存器间接寻址
寄存器中的内容是一个地址,该地址单元的内
容是所需的操作数。操作数是通过寄存器间接得到的

例: [ MOV R1 , #30H ;(R1)← 立即数


30H ]
MOV @R1 , #0FH ;(30H)← 立即数 0FH
MOV A , @R1 ;(A)←((30H))=#0F
注意:H
1 )“间接”表示某寄存器中的“内容”只是一个“单
元地址”,这个地址单元中存放的数据才是要找
的“操作数”。
2 )符号“ @” 表示“间接,其含义与读音皆同“ at”

“@”--- 指针
MOV A , @R0
MOV A , @R1
MOVX A , @DPTR
MOV A , @R0 ; (R0) = 65H , (65H) = 47H

R0 65H
47H 65H

A 47H
在本单片机中访问特殊功能寄存器 SFR 只能采用
直接寻址方式的原因: SFR 分布在 80H ~ 0FFH 范
围内,而 52 系列单片机有 256 字节的片内 RAM,
其中的 80H ~ 0FFH 的 RAM 与 SFR 所占地址重叠

于是规定: 80H ~ 0FFH 范围内的 RAM 只能用寄
存器间接寻址方式,而 SFR 只能用直接寻址方式。
从而解决了地址冲突的问题。例如:

MOV A, 90H 等效于 MOV A, P1 属直接


寻址  MOV A, @R0 ;
[ 事先已知 (R0) = #90H ]
执行的操作: A ←(90H) 属寄存器间
接寻址 ,  随意写的指令如: MOV A, 85H
存储器配置(片内 RAM )
 89C51 片内 RAM 128 字节( 00H—7FH )
 89C52 片内 RAM 256 字节( 00H—0FFH )

只能寄存器间接寻址
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 、寻址方式中常用符号注释

(1) Rn (n=0 ~ 7) 工作寄存器组 R0 ~ R7


(2) Ri (i=0,1 ) 寄存器组 R0,R1
(3) #data
(4) #data16
(5) direct
(6) addr11
(7) addr16
(8) rel 偏移量- 128 ~ +127
(9) bit
(10) @ 间址符号
(11) /
(12) (×)
(13) ((×))
(14) ← →
3.3 MCS-51 指令系

功能分五类,共 111 条指令
51 系列单片机指令集含有 111 条指令

每条指令在程序存储器 ROM 中占据一定的空间,


以字节为单位。按指令所占字节数分类:
单字节 (49 条 ); 双字节 (46 条 );3 字节 (16
条)
每条指令在执行时要花去一定的时间,以机器周
期为单位。按指令执行时间分类:
单周期 (64 条 ); 双周期 (45 条 );4 周期 (2
条)
按指令的功能分类,可分为 5 大类:
数据传送类( 29 条);算术运算类( 24 条)
逻辑运算及移位类( 24 );控制转移类( 17 条)
位操作类( 17 条)
3.3.1 数据传送类指令( 5 种 /29 条)
内部存储器间传送: ( MOV——16 条)
外部数据存储器与累加器间传送 :
( MOVX——
4 条)
程序存储器向累加器传送:
( MOVC——
2 条)
数据交换:( XCH , XCHD , SWAP——5
条)
堆栈操作: ( PUSH , POP——2
1. 以累加器 A 为目的操作数的指令
MOV A, Rn ; n=0~7 , A← (Rn)
MOV A, direct ; A← (Rn) direct 为内部 RAM 或 SFR 地址
MOV A, @Ri ; i=0,1 , A← ((Ri))
MOV A, # data ; A← # data

注:
MOV A, @Ri ;以 Ri 的内容为地址 ,把该地址中
;的内容送到 A 中去。 A← ((Ri))
MOV A, R0 ;将 R0 的内容送到 A 去。 A← (R0))

MOV A, #20H ; (A) = 20H A 的内容为 20H


MOV A, 20H ; (A) = (20H) A 的内容为 20H 中的内容

注意以上两组指令的不同点
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 累加器

Direct 直接寻 @Ri 间接寻址


Rn 寄存器 #data 立即数

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+DPTR 或 @A+PC 指向程序存储器中的某单元。


拟传送给累加器 ACC 的数据就是程序中事先写
进去的表格数据。这些表格数据往往用伪指令 D
B,DW 等定义在程序中。
1000H: MOV A , #0DH ; A ← 0DH
1002H: MOVC A , @A+PC ; A ← (0DH+1000H)
1003H: MOV R0 , A ; R0 ← (A)

1010H: 02H
1011H: 04H
1012H: 06H
1013H: 08H

(A)= 02H , (R0) = 02H , (PC) = 1004H 。


尽量用 DPTR
1000H: MOV A , #00H ; A ← 00H
1002H: MOV DPTR,#1010H ; DPTR ← 1010H
1005H: MOVC A , @A+DPTR ; A ←(00H+1010H)
1006H: MOV R0 , A ; R0 ← (A)

1010H: 02H
1011H: 04H
1012H: 06H
1013H: 08H
7 、累加器 A 与片外 RAM 数据传送指令 (4
条 ):

MOVX 类指令可在累加器与以 @DPTR 或 @Ri


所代表的外部 RAM 之间进行数据传送。
用寄存器间接寻址的方式访问片外 RAM 或 I/
O 端口。
例如 :
MOVX A , @DPTR ——(A) ((DPTR))
MOVX A , @Ri ——(A) ((Ri))
MOVX @DPTR, A ——((DPTR)) 
(A) MOVX @Ri, A ——((Ri))
(A)
8 、堆栈操作指令 (2 条 ):
PUSH direct—— 压栈指

POP direct—— 弹栈指令
√ 堆栈区由特殊功能寄存器堆栈指针 SP 管理
√ 堆栈区可以安排在 RAM 区任意位置,一般不安
排在工作寄存器区和可按位寻址的 RAM 区 , 而是
放在 RAM 区的靠后的位置
√ 堆栈总是指向栈顶
√ 通常 PUSH 与 POP 两条指令成对使用
8 、堆栈操作指令
进栈指令 PUSH direct
如 : (SP)=60H, (A)=30H ,(B)=70H 时,执行

PUSH Acc ; (SP)+1=61H→SP, (A) → 61H


PUSH B ; (SP)+1=62H→SP, (B) → 62H 62H 70H
结果 : (61H)=30H, (62H)=70H, (SP)=62H (SP)
61H 30H

退栈指令 POP direct 60H


如 : (SP)=62H, (62H)=70H ,(61H)=30H 时,执行
POP DPH ; ((SP)) →DPH, (SP) - 1=61H→SP
POP DPHL ; ((SP)) →DPL, (SP) - 1=60H→SP
结果 : (DPTR)=7030H, (SP)=60H
注意: (61H)=30H, (62H)=70H

堆栈的存储原则:先进后出
例如:设 (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 ~ 09 或 (AC)=1 则 (A)3 ~ 0(A)3 ~ 0 + 6
; 若 (A)7 ~ 49 或 (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 ~ 09 或 (AC)=1 则 (A)3 ~ 0(A)3 ~ 0 + 6
; 若 (A)7 ~ 49 或 (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 条)

累加器清零 / 取反: ( CLR , CPL——2 条)

累加器移位操作 : ( RL,RLC,RR,RRC—4 条)
1 、简单操作指令

( 1 )累加器 A 清 0 指令 只影响 P
CLR A ; A← “0”

( 2 )累加器 A 取反指令 不影响 PSW


CPL A ; A←0- A

例 : (A)=3AH, CPL A, (A)=0C5H


0011 1010B → 1100 010
1B
2 、累加器移位操作 : ( RL,RLC,RR,RRC——4 条)

RLC A 带进位位循环左
累加器 A

RL A 累加器 A 循环左移

RR A               
Cy 累加器 A
循环右移

RRC A 累加器 A
带进位位循环右移
Cy

例( A )= 6CH =0110 1100B , (C)=1


RLC A
(A)=1101 1001B=0D9H
3、累加器半字节交换指令( 1 条)

   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 范围内跳

在程序中 addr16 addr16 rel 等可用标号代替,表示


要转移目的地址
程序中标号与地址之间的关系
地址 机器码 源程序
注释
ORG 0000H ; 整个程序起始地

0000 20 00 30 LJMP MAIN ; 跳向主程序

ORG 0030H ; 主程序起始地址


0030 C3 MAIN: CLR C ; MAIN 为程序标

0031 E6 LOOP: MOV A , @R0
0032 37 ADDC A, @R1
0033 08 INC R0
0034 DA FB DJNZ R1, LOOP ;相对转移
0036 80 02 SJMP NEXT
0038 78 03 MOV R0, #03H
原地踏步指令的指令
003A 18 :
NEXT: HERER0: SJMP HERE
DEC
003B 80FE
常写成: SJMP $ SJMP $ ; HERE: SJMP HERE
END ; 结束标记
JMP @A+DPTR 散转指令(间接长跳转指令)
—— 可在以 DPTR 为基址 + A 为偏移量
之和所指向的 64K 程序范围内跳

PM: MOV R1,A ;A=A*3 02
RL A PM0L
ADD A,R1 PM0H
MOV DPTR,#PMTB 02
JMP @A+DPTR
PM1L
PMTB:LJMP PM0 ; 命令 0 处理入口 ,3 字节
LJMP PM1 PM1H
LJMP PM2

LJMP PM7
2、空操作指令( 1 条) 不影响标志位

   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” 就先将其清零 再跳转;
否则,不动此位也不跳
转。

You might also like