Download ppt - 第三章 指令系统

Transcript
Page 1: 第三章 指令系统

第三章 指令系统 3.1 指令系统概述3.2 数据传递类指令 3.3 算术运算类指令 3.4 逻辑操作类指令 3.5 控制转移类指令3.6 位操作类指令

Page 2: 第三章 指令系统

3.1 指令系统概述

3.1.1 指令格式 3.1.2 指令系统的分类及特点 3.1.3 指令中常用的符号说明 3.1.4 指令的寻址方式

Page 3: 第三章 指令系统

3.1.1 指令格式 指令的表示方式称为指令格式,一条指令通

常由两部分组成,即操作码和操作数。具体格式如下:

〔 标号:〕操作码〔,操作数标号:〕操作码〔,操作数 11 ,操作数,操作数 22 ,……〕〔;注,……〕〔;注释〕释〕

其中方括号的部分为任选项,如需要选项时,在程序中并不书写方括号。

Page 4: 第三章 指令系统

3.1.1 指令格式1 、标号 表示该指令所在的地址。 标号以字母开始,由 1~8 个字符(字母、数字 和一些允许的符号)组成,以“:”结尾。 在一个程序中不允许重复定义标号。

Page 5: 第三章 指令系统

3.1.1 指令格式2 、操作码 操作码是用助记符(英语缩写字符串)形式来

表示的,它表示指令进行什么操作,是指令的核心部分,必不可少。

操作码通常为 2~5 个字符组成的字符串。

Page 6: 第三章 指令系统

3.1.1 指令格式3 、操作数 操作数表示参与操作的数据及数据所在的 地址,取决于指令的寻址方式。 操作码与操作数之间必须以空格分隔 操作数与操作数之间必须以逗号分隔

Page 7: 第三章 指令系统

3.1.1 指令格式4 、注释 表示用户对该条指令的解释或说明,它是 为了方便阅读程序的一种标注。 注释以“;”开始。 注释部分不影响指令的执行。

Page 8: 第三章 指令系统

3.1.2 指令系统的分类及特点 MCS-51 单片机的指令按指令的功能分可分为: 数据传送类指令 29 条。 算数运算类指令 24 条。 逻辑操作类指令 24 条。 控制转移类指令 17 条。 位操作类指令 17 条。 MCS-51 单片机的指令按指令字节数分类可分为: 单字节指令 49 条。 双字节指令 45 条。 三字节指令 17 条。 MCS-51 单片机的指令按执行时间分类可分为: 单机器周期指令 64 条。 双机器周期指令 45 条。 四机器周期指令 2 条。

Page 9: 第三章 指令系统

3.1.3 指令中常用的符号说明MCS - 51 单片机指令系统约定了以下的符号: Rn :选定的当前工作寄存器组中 8 个通用寄存器 R0 ~ R7

(n = 0-7) 。 @Ri :选定的当前工作寄存器组的工作寄存器 R0 和 R1 ,

@ 为间接寻址前缀符号。 direct :直接地址,既可以是一个内部 RAM 的低 128B 地

址,也可以是一个特殊功能寄存器的单元地址或名称符号。 #data : 8 位或 16 位立即数,亦称立即数。 # 是立即数的

前缀,也是与直接地址区别的标志。 add16 、 add11 : 16 位、 11 位目标地址。在跳转和子程

序调用指令当中使用。 rel : 8 位带符号偏移量,以二进制补码形式表示,取值范

围是- 128 ~+ 127 ,常用于相对跳转指令。

Page 10: 第三章 指令系统

3.1.3 指令中常用的符号说明 bit :位地址。 / :在位操作中,表示取反。 ( x ):表示 x 地址单元中的内容,

即 x 的内容。 (( x )):表示以 x 地址单元中

的内容作为地址的单元中的内容,即 x 的内容的内容。

$ :当前指令的地址。

Page 11: 第三章 指令系统

3.1.4 指令的寻址方式

寻址方式:寻找操作数或操作数所在地址的方式。1. 寄存器寻址方式

由指令指出某一寄存器的内容做为操作数,这种 寻址方式称为寄存器寻址。 MOV A,R0 ; 把所选定的寄存器组中的 R0 寄存器的内容 ; 传送给累加器 A ,其中原操作数就是 R0 的内容。

Page 12: 第三章 指令系统

3.1.4 指令的寻址方式 MCS-51 中规定 具有寄存器寻址功能的寄存器有: A AB( 乘除指令用 ) Rn ( n = 0 ~ 7 ) DPTR ( Data Point Register )

Page 13: 第三章 指令系统

3.1.4 指令的寻址方式MOV A , R5 ; R5 中的内容送入累加器 A ,即 (R5)→(A)

指令把 R5 中的内容送入累加器 A 中。指令的执行过程如图。

Page 14: 第三章 指令系统

3.1.4 指令的寻址方式2. 直接寻址方式 指令中操作数直接以单元地址的形式给出, 就称之为直接寻址。 例如: MOV A, 3AH MOV 0D0H, A (MOV PSW, 3AH ) 直接寻址是访问特殊功能寄存器的唯一方法。

Page 15: 第三章 指令系统

3.1.4 指令的寻址方式 MOV A , 69H ; (69H)→(A) 该指令功能是把 69H单元的内容送入累加器 A 中

Page 16: 第三章 指令系统

3.1.4 指令的寻址方式3. 寄存器间接寻址方式 寄存器间接寻址方式,寄存器中存放的则是操作数的地址,

即操作数是通过寄存器间接得到的,因此称之为寄存器间接寻址。

例: MOV A, @ R0 ;把 R0 寄存器的内容作为地址,

再把该地址单元内容送累加器 A 。

Page 17: 第三章 指令系统

3.1.4 指令的寻址方式MOV A , @R1 ; ((R1))→(A) 指令代码形式为 lll001ll ,十六进制为 E7H。

Page 18: 第三章 指令系统

3.1.4 指令的寻址方式 可用来间接寻址的寄存器有: R0 、 R1 、 DPTR 。 访问片内 RAM 或片外 RAM 的低 256 字节时,

可用 R0 、 R1 作为间接寻址寄存器,访问片外RAM还可用 DPTR 作为 间接寄存器。

Page 19: 第三章 指令系统

3.1.4 指令的寻址方式 4. 立即寻址方式 立即寻址就是操作数在指令中直接给出。 为了与直接寻址指令中的直接地址相区别,在立即数前面加“#”标志。采用立即寻址方式的指令是双字节指令,第一个字节是操作码,第二个字节是立即操作数,该操作数简称为立即数。

例: MOV A, # 3AH   MOV DPTR, # 1234H

Page 20: 第三章 指令系统

3.1.4 指令的寻址方式 MOV A , #0FFH ; FFH→(A) 这条指令是用来把立即数 FFH送入累加器 A 中

Page 21: 第三章 指令系统

3.1.4 指令的寻址方式 5. 变址寻址方式 变址寻址是为了访问程序存储器中的数据和表格。

MCS-51 的变址寻址是以 DPTR 或 PC 作基址寄存器,以累加器 A 作变址寄存器,并以两者内容相加形成的 16� 位地址做为操作数地址,以达到访问数据和表格的目的。注意: A 中的数为无符号数。

例如: MOVC A, @ A+DPTR 应当指出,符号“ @” 是针对( A+DPTR )的,而不仅是针对 A 的。

Page 22: 第三章 指令系统

3.1.4 指令的寻址方式MOVC A , @A+PC ; ((A)+(PC))→(A) 这条指令是把 A 中的内容和 PC 中的内容相加作为 16

位程序存储器地址,然后再把该地址中的内容送入累加器 A 中。

Page 23: 第三章 指令系统

3.1.4 指令的寻址方式 6. 位寻址方式 位寻址是指对片内 RAM 的位寻址区和某些可

寻址的特殊功能寄存器进行位操作的寻址方式。需要指出,位地址与直接寻址中的字节地址形式相同,主要由操作码来区别。

例如: MOV C,3AH

Page 24: 第三章 指令系统

3.1.4 指令的寻址方式 7. 相对寻址方式 相对寻址方式是为解决程序转移而专门设置的,为转移

指令所采用。在相对寻址的转移指令中,给出了地址偏移量(在 MCS-51 指令系统中以“ rel” 表示),把 PC的当前值加上偏移量就构成了程序转移的目的地址。转移的目的地址可用如下公式表示:

PC 目的=PC 当前+转移指令字节数+ rel 例如: JZ 30H

Page 25: 第三章 指令系统

3.1.4 指令的寻址方式 JC 06H 这条指令表示若进位位 C=0 ,不跳转;若进位位 C=1 ,则以 PC 中的当前值为基地址,加上偏移量 06H后所得到的结果为该转移指令的目的地址。

Page 26: 第三章 指令系统

3.1.4 指令的寻址方式 表 3-1 寻址方式及寻址空间对照表

寻址方式 寻 址 空 间

寄存器寻址 工作寄存器 R0 ~ R7 、 A 、 B 、 DPTR 及 C

直接寻址 片内 RAM 低 128 字节、特殊功能寄存器 SFR 中的可寻址位

寄存器间接寻址 片内 RAM 低 128 字节〔 @R0 、 @R1 、 SP〕片外 RAM 〔 @R0 、 @R1 、 @DPTR〕

立即寻址 程序存储器(指令的常数部分)

变址寻址 程序存储器( @A+DPTR 、 @A+PC )

位寻址 片内 RAM 中的 20H~ 2FH的 128 个位特殊功能寄存器中可位寻址(字节地址能被 8整除的 SFR )的位

相对寻址 程序存储器 256 字节范围( PC+rel )

Page 27: 第三章 指令系统

3.2 数据传递类指令 3.2.1以累加器为目的操作数的指令 3.2.2 以寄存器Rn为目的操作的指令 3.2.3 以直接地址为目的操作数的指令 3.2.4 以间接地址为目的操作数的指令 3.2.5 十六位数的传递指令 3.2.6累加器A与片外RAM之间的数据传递类指令 3.2.7程序存储器向累加器A传送指令 3.2.8堆栈操作类指令 3.2.9 数据交换指令

Page 28: 第三章 指令系统

3.2 数据传递类指令通用格式: MOV <目的操作数 >, < 源操作数 > 传输指令有从右向左传送数据的约定,即指

令的右边操作数为源操作数,表达的是数据的来源;左边操作数为目的操作数,表达的是数据的去向。

Page 29: 第三章 指令系统

3.2.1 以累加器为目的操作数的指令 1 .指令格式 MOV A , Rn ; A← ( Rn ) MOV A , direct ; A← (直接地址) MOV A , @Ri ; A← (( Ri )) MOV A , #data ; A← 立即数 2 .指令解释 3 .举例说明例 3.1 :已知( R1 ) =40H ;( 30H ) =12H ;( 40H )

=34H MOV A , R1 MOV A,30H MOV A,@R1 MOV A,#56H

Page 30: 第三章 指令系统

3.2.2 以寄存器 Rn 为目的操作的指令 1 .指令格式 MOV Rn,A ; Rn← ( A ) MOV Rn,direct ; Rn← (直接地址) MOV Rn,#data ; Rn← 立即数 2 .指令解释 3 .举例说明例 3.2 :已知( A ) =40H ;( 30H ) =12H ;( 40H ) =

34H MOV R1 , A MOV R1,30H MOV R1,#40H

Page 31: 第三章 指令系统

3.2.3 以直接地址为目的操作数的指令 1 .指令格式 MOV direct,A ;(直接地址)←( A ) MOV direct,Rn ;(直接地址)←( Rn ) MOV direct1,direct2 ;(直接地址 1 )←(直接地址 2 ) MOV direct,@Ri ;(直接地址)←(( Ri )) MOV direct,#data ;(直接地址)← 立即数 2 .指令解释 3 .举例说明例 3.3 已 知 ( R1 ) = 40H ; ( 30H ) =12H ; ( 40H ) =34H ;

( A ) =78H 。 MOV 50H,A MOV 50H,R1 MOV 50H,30H MOV 50H,@R1 MOV 50H,#56H

Page 32: 第三章 指令系统

3.2.4 以间接地址为目的操作数的指令 1 .指令格式 MOV @Ri,A ;( Ri )← ( A ) MOV @Ri,direct ;( Ri )←(直接地址) MOV @Ri,#data ;( Ri )← 立即数 2 .指令解释 3 .举例说明例 3.4 已知( R0 )= 40H ;( 30H )= 12H ;( A )= 78H 。 MOV @R0 , A MOV @R0 , 30H MOV @R0 , #56H

Page 33: 第三章 指令系统

3.2.5 十六位数的传递指令 1 .指令格式 MOV DPTR , #data16 ; DPTR←16 位立即数 2 .指令解释 3 .举例说明例 3.5 MOV DPTR , #1234H 例 3.6 MOV DPH , #12H MOV DPL , #34H

Page 34: 第三章 指令系统

3.2.6 累加器 A 与片外 RAM 之间的 数据传递类指令

1 .指令格式 MOVX A,@Ri ; A ← (( Ri )) MOVX @Ri,A ;( Ri )← A MOVX A,@DPTR ; A ← (( DPTR )) MOVX @DPTR,A ;( DPTR )← A 2 .指令解释 (1)从外部 RAM 的寄存器 Ri 的内容作为地址的地址单元内容传送至 A

中。 (2)将 A 中的内容传送至寄存器 Ri 的内容作为地址的外部 RAM 单元中。

Page 35: 第三章 指令系统

3.2.6 累加器 A 与片外 RAM 之间的 数据传递类指令

说明: 1 、 MCS-51 中,与外部存储器 RAM打交道的只可以是 A 累加

器。所有需要送入外部 RAM 的数据必须通过 A 送去,而所有要读入的外部 RAM 中的数据也必须通过 A 读入。

2 、使用时应当首先将要读或写的地址送入 DPTR 或 Ri 中,然后再使用读写命令。

3 .举例说明 将外部 RAM 中 100H 单元中的内容送入外部 RAM 中 200H 单

元中。已知( 0100H ) =12H ,( 0200H ) =34H MOV DPTR , #0100H MOVX A , @DPTR MOV DPTR,#0200H

MOVX @DPTR,A

Page 36: 第三章 指令系统

3.2.7 程序存储器向累加器 A 传送指令 1 .指令格式MOVC A , @A+DPTR ; A ← (( A )+( DPTR )) 2 .指令解释 3 .举例说明例 3.8 有一个数在 R0 中,要求用查表的方法确定它的平方值(此数的取值

范围是 0-5 ) MOV DPTR , #TABLE MOV A , R0 MOVC A , @A+DPTR

…… TABLE: DB 0,1,4,9,16,25

Page 37: 第三章 指令系统

3.2.8堆栈操作类指令 1 .指令格式 PUSH direct ;① PC←(PC)+2,②SP←(SP)+1 ,③ (SP)←( 直接地址 ) POP direct ;① PC←(PC)+2,②( 直接地址 )←((SP)),③SP←(SP)-1 2 .指令解释 3 .举例说明例 3.9 已知( SP) =5FH,( A) =#64H,( B)= 20H PUSH ACC PUSH B ………… POP B POP ACC

Page 38: 第三章 指令系统

3.2.9 数据交换指令 1 .指令格式 XCH A , direct ;( A ) ←→ (直接地址) XCH A , Rn ;( A ) ←→ ( Rn ) XCH A , @Ri ;( A ) ←→ ( Ri ) XCHD A ;( A ) 3 ~ 0 ←→ (( Ri )) 3 ~ 0 2 .指令解释 3 .举例说明例 3.10 已知( A ) =20H ,( R1 ) =30H ,( 20H ) =12H ,( 30H ) =

54H 。 XCH A , R1 XCH A , @R1

XCH A , 30H XCHD A , @R1

Page 39: 第三章 指令系统

3.3 算术运算类指令 3.3.1 不带进位加法指令 3.3.2 带进位的加法指令 3.3.3 加1指令 3.3.4 十进制调整指令 3.3.5 带进位的减法指令 3.3.6减1指令 3.3.7 乘法指令 3.3.8 除法指令

Page 40: 第三章 指令系统

3.3.1 不带进位加法指令 1 .指令格式 ADD A , #data ; A←(A)+ 立即数 ADD A , direct ; A←(A)+( 直接地址 ) ADD A , @Ri ; A←(A)+((Ri)) ADD A , Rn ; A←(A)+(Rn) 2 .指令解释 3 .举例说明

例 3.11 设 (A) = 0C3H , (R0) = 0AAH ,执行指令: ADD A , R0

Page 41: 第三章 指令系统

3.3.2 带进位的加法指令 1 .指令格式 ADDC A , #data ; A←(A)+ 立即数 +CY ADDC A , direct ; A←(A)+( 直接地址 ) +CY ADDC A , @Ri ; A←(A)+((Ri)) +CY ADDC A , Rn ; A←(A)+(Rn) +CY 2 .指令解释 3 .举例说明

例 3.13 设 (A) = 85H , (20H)=0FFH , CY=1 。 . 执行指令: ADDC A , 20H

Page 42: 第三章 指令系统

3.3.3 加 1 指令 1 .指令格式 INC A ; A←(A)+1 INC Rn ; Rn←(Rn)+1 INC direct ; ( 直接地址 )←( 直接地址 )+1 INC @Ri ; (Ri)←((Ri))+1 INC DPTR ; DPTR← (DPTR)+1 2 .指令解释 3 .举例说明

例 3.14 设 (A) = 0FFH , (R3)=0FH , (R0)=40H , (30H)=0F0H , (40H)=00H 。 . 执行指令:

INC A INC R3 INC 30H INC @R0

Page 43: 第三章 指令系统

3.3.4 十进制调整指令 1 .指令格式 DA A 2 .指令解释这条指令是在进行 BCD 码运算时,跟在 ADD 和 ADDC 指令之后,将相加后存放在累

加器 A 中的结果进行修正。修正的条件和方法:若 (A) > 9 或 (AC) = 1 ,则 (A)+6H→(A) ;若 (A) > 9 或 (CY) = 1 ,则 (A)+6H→(A) 。若以上两条同时发生,或高 4 位虽等于 9 ,但低 4 位修正后有进位,则应加 66H 修正。

3 .举例说明

例 3.15 设 (A) = 56H , (R5)=67H 。 . 执行指令: ADD A , R5 DA A

结果为: (A) = 23H , CY=1 。

Page 44: 第三章 指令系统

3.3.5 带进位的减法指令 1 .指令格式 SUBB A , #data ; A←(A)- 立即数 -CY SUBB A , direct ; A←(A)-( 直接地址 ) -CY SUBBA , @Ri ; A←(A)-((Ri)) -CY SUBB A , Rn ; A←(A)-(Rn) -CY 2 .指令解释 3 .举例说明

例 3.17 设 (A) = 0C9H , (R2)=54H , CY=1 。 . 执行指令: SUBB A , R2

Page 45: 第三章 指令系统

3.3.6减 1 指令 1 .指令格式 DEC A ; A←(A)+1 DEC direct ; ( 直接地址 )←( 直接地址 )+1 DEC @Ri ; (Ri)←((Ri))+1 DEC Rn ; Rn←(Rn)+1 2 .指令解释 3 .举例说明

例 3.18 设 (A) = 0FH , (R7)=19H , (30H)=00H , (R1)=40H , (40H)=0FFH 。 . 执行指令:

DEC A DEC R7DEC 30H DEC @R1

Page 46: 第三章 指令系统

3.3.7 乘法指令 1 .指令格式 MUL AB ; BA←(A)×(B) 2 .指令解释 3 .举例说明

例 3.19 设 (A) = 50H , (B)=0A0H 。 . 执行指令: MUL AB

结果为: (B)=32H , (A) = 00H ,即积为 3200H ,标志位 OV=1 ,CY=0 。

Page 47: 第三章 指令系统

3.3.8 除法指令 1 .指令格式 DIV AB ; (A)÷(B)=A……B 2 .指令解释 3 .举例说明

例 3.20 设 (A) = 0FBH , (B)=12H 。 . 执行指令: DIV AB

结 果 为 : (A) = 0DH , (B)=11H , 标 志 位 OV=0 , CY=0 。

Page 48: 第三章 指令系统

3.4 逻辑操作类指令 3.4.1 循环移位指令 3.4.2 累加器半字节交换指令 3.4.3 求反指令 3.4.4 清0指令 3.4.5 逻辑与指令 3.4.6逻辑或指令 3.4.7 逻辑异或指令

Page 49: 第三章 指令系统

3.4.1 循环移位指令 1 .指令格式

2 .指令解释 3 .举例说明

例 3.21 设 (A) = 01H , CY=1 。 . 执行指令: RL A RLC A

(A)

(A)

(A) CY

(A) CY

RL A

RR A

RLC A

RRC A

;

;

;

;

Page 50: 第三章 指令系统

3.4.2 累加器半字节交换指令 1 .指令格式 SWAP A 2 .指令解释 指令的功能是将累加器 A 的高半字节( A.7 ~ A.4 )

和低半字节( A.3 ~ A.0 )交换。 3 .举例说明

例 3.22 设 (A) = 56H 。 . 执行指令: SWAP A

结果为: (A) = 65H 。

Page 51: 第三章 指令系统

3.4.3 求反指令 1 .指令格式 CPL A ; A←/(A ) 2 .指令解释 指令的功能是将累加器 A 的内容逐位逻辑求反,不影响标志。 3 .举例说明

例 3.23 设 (A) = 55H 。 . 执行指令: CPL A

结果为: (A) = 0AAH 。

Page 52: 第三章 指令系统

3.4.4 清 0 指令 1 .指令格式 CLR A ; A←0 2 .指令解释 指令的功能分别是将累加器 A 的内容清“ 0” ,不影响 CY 、 AC 、

OV 等标志。 3 .举例说明

例 3.23 设 (A) = 55H 。 . 执行指令: CLR A

结果为: (A) = 00H 。

Page 53: 第三章 指令系统

3.4.5 逻辑与指令 1 .指令格式 ANL A , #data ; A←(A)∧立即数 ANL A , Rn ; A←(A)∧(Rn) ANL A , direct ; A←(A)∧( 直接地址 ) ANL A , @Ri ; A←(A)∧((Ri)) ANL direct , #data ; ( 直接地址 )←( 直接地址 )∧立即数 ANL direct , A ; ( 直接地址 )←( 直接地址 )∧(A) 2 .指令解释 3 .举例说明

例 3.25 设 (A) = 07H , (R0)=0FDH 。 . 执行指令: ANL A , R0

结果为: (A) = 05H

Page 54: 第三章 指令系统

3.4.6 逻辑或指令 1 .指令格式 ORL A , #data ; A←(A)∨立即数 ORL A , Rn ; A←(A)∨(Rn) ORL A , direct ; A←(A)∨( 直接地址 ) ORL A , @Ri ; A←(A)∨((Ri)) ORL direct , #data ; ( 直接地址 )←( 直接地址 )∨立即数 ORL direct , A ; ( 直接地址 )←( 直接地址 )∨(A) 2 .指令解释 3 .举例说明

例 3.26 设 (A) = 33H , (P1)=05H 。 . 执行指令: ORL P1 , A

结果为: (A) = 37H 。

Page 55: 第三章 指令系统

3.4.7 逻辑异或指令 1 .指令格式 XRL A , #data ; A←(A) ⊕ 立即数 XRL A , Rn ; A←(A) ⊕ (Rn) XRL A , direct ; A←(A) ⊕ ( 直接地址 ) XRL A , @Ri ; A←(A) ⊕ ((Ri)) XRL direct , #data ; ( 直接地址 )←( 直接地址 ) ⊕ 立即数 XRL direct , A ; ( 直接地址 )←( 直接地址 ) ⊕ (A) 2 .指令解释 3 .举例说明

例 3.27 设 (A) = 90H , (R3)=73H 。 . 执行指令: XRL A , R3

结果为: (A) = 0E3H 。

Page 56: 第三章 指令系统

3.5 控制转移类指令

3.5.1 无条件转移指令 3.5.2 条件转移指令 3.5.3 调用子程序及返回指令 3.5.4 空操作指令

Page 57: 第三章 指令系统

3.5.1 无条件转移指令 1 .指令格式 LJMP addr16 ;① PC←(PC)+3,②PC←addr16 AJMP addr11 ;① PC←(PC)+2,②PC←addr11 SJMP rel ;① PC←(PC)+2,②PC←(PC)+rel JMP @A+DPTR ;① PC←(PC)+1, ,② PC←((A)+(DPTR)) 2 .指令解释 3 .举例说明

例 3.27 设 (A) = 90H , (R3)=73H 。 . 执行指令: XRL A , R3

结果为: (A) = 0E3H 。

Page 58: 第三章 指令系统

3.5.2 条件转移指令 1 .指令格式 JZ rel ;( A ) =0 则转移, PC 目标 =PC 源+ 02H + rel JNZ rel ;( A )≠ 0 则转移, PC 目标 =PC 源+ 02H + rel CJNE A , direct , rel ;( A )≠(直接地址)则转移, PC 目标 =PC 源+ 03H + rel CJNE A , #data , rel ;( A )≠立即数, PC 目标 =PC 源+ 03H + rel CJNE Rn , #data , rel ;( Rn )≠立即数则转移, PC 目标 =PC 源+ 03H + rel CJNE @Ri , #data , rel ;(( Ri ))≠立即数则转移, PC 目标 =PC 源+ 03H + rel DJNZ Rn , rel ;( Rn )- 1→ ( Rn ),( Rn )≠ 0 则转移, PC 目标 =PC 源+ 02H + rel DJNZ direct , rel ;(直接地址)- 1→ (直接地址), (直接地址)≠ 0 则转移, PC 目标 =PC 源+ 02H + rel

Page 59: 第三章 指令系统

3.5.2 条件转移指令 2 .指令解释 3 .举例说明

例 3.28 指令 0100H:AJMP 0210H 是如何形成新的目标地址的?转移到达新的目标地址是否允许?

解:( 1 )因为 PC 源= 0100H ,该指令是 2 字节指令,所以 PC 当前 =PC 源

+ 02H=0102H=0000 0001 0000 0010B 。( 2 )   指令中给出的 0210H=0000 0010 0001 0000B ( 3) PC 目标 =0000 0010 0001 0000B=0210H 。 即形成新的目标地址为 0210H, 程序随即转移到该地址处。

Page 60: 第三章 指令系统

3.5.3 调用子程序及返回指令 1 .指令格式 LCALL addr16 ;① (PC) + 3→PC ,② (SP) + 1→SP , ③(PC)L→((SP)),④(SP)+1→SP , ⑤(PC)H→((SP))⑥addr16→PC ACALL addr11 ;① (PC) + 2→PC ,② (SP) + 1→SP , ③(PC)L→((SP)),④(SP)+1→SP , ⑤(PC)H→((SP)) ⑥addr16→PC RET ;① ((SP))→(PC)H ,② (SP) - 1→SP , ③((SP))→(PC)L ,④ (SP) - 1→SP RETI ;① ((SP))→(PC)H ,② (SP) - 1→SP , ③((SP))→(PC)L ,④ (SP) - 1→SP

Page 61: 第三章 指令系统

3.5.3 调用子程序及返回指令 2 .指令解释 3 .举例说明

例 3.30 如图 3-2 所示,若 (SP)=60H ,执行 START: LCALL 3456H 之后 SP 和堆栈的内容有何变化?设标号 START 为 2345H 。若上诉指令改为短调用,能否可行?

解: (1) 因为 PC 源 =2345H ,所以 PC 当前 =PC 源+ 03H=2345H+03H=2348H (断点地址入栈保护,即把 PC 当前空出来)

(2)(SP)+1=61H,(PC)L→((SP) 即 ((SP))=(61H)=48H

(3)(SP)+1=62H, (PC)H→((SP) 即 ((SP))=(62H)=23H

(4)addr16=3456H , addr16→ ( PC )即( PC ) =3456H结果: (SP)=62H,(61H)=48H,(62H)=23H,(PC)=3456H 。

Page 62: 第三章 指令系统

3.5.4 空操作指令 1 .指令格式 NOP 2 .指令解释 空操作令除了 PC 加 l 外, CPU 不进行任何操作,而转向下一条

指令去执行。 3 .举例说明

Page 63: 第三章 指令系统

3.6 位操作类指令

3.6.1 位数据传送指令 3.6.2 位状态控制指令 3.6.3 位逻辑运算指令 3.6.4 位条件转移指令

Page 64: 第三章 指令系统

3.6.1 位数据传送指令 1 .指令格式 MOV C , bit ; CY← ( bit ) MOV bit , C ; bit←CY 2 .指令解释 3 .举例说明

例 3.31 设( CY ) =0 , (20H).6=1 ,执行指令: MOV C , 06H

结果为: CY=1 。 注意,这里的 06H 是位地址, 20H 是内部 RAM 的字节地址

Page 65: 第三章 指令系统

3.6.2 位状态控制指令 1 .指令格式 CLR C ; CY ← 0 CLR bit ; bit ← 0 CPL C ; CY ← /CY CPL bit ; bit ← / bit SETB C ; CY ← 1 SETB bit ; bit ← 1 2 .指令解释 3 .举例说明

例 3.29 设 CY=1 , (24H).7=1 , (21H).0=0 , P1.7=0 ,执行指令:CLR C CLR 27HCPL 08H SETB P1.7

结果分别为: CY=0 , (24H).7=0 , (21H).0=1 , P1.7=1 。

Page 66: 第三章 指令系统

3.6.3 位逻辑运算指令 1 .指令格式 ANL C , bit ; CY←CY∧(bit) ANL C , /bit ; CY←CY∧(/bit) ORL C , bit ; CY←CY∨(bit) ORL C , /bit ; CY←CY∨(/bit) 2 .指令解释 3 .举例说明

Page 67: 第三章 指令系统

3.6.4 位条件转移指令 1 .指令格式 JC rel ;若 CY=1 则转移, PC 目标 =PC 源+ 02H + rel JNC rel ;若 CY=0 则转移, PC 目标 =PC 源+ 02H + rel

JB bit , rel ;若 bit=1 则转移, PC 目标 =PC 源+ 03H + rel JNB bit , rel ;若 bit=0 则转移, PC 目标 =PC 源+ 03H + rel JBC bit , rel ;若 bit=1 则转移同时 bit←0 ,

PC 目标 =PC 源+ 03H + rel 2 .指令解释 3 .举例说明