第3章 指令系统及程序设计举例

47
3 3 第 第第第 第第第第第第第 第 第第第 第第第第第第第 1. 指指指指指指指指指指指指 指指指指指指指指指指 ,。 1 ORG ( 指指指指指指 ) 指指ORG 指指指指指指16 指3.1 第第第第 第第第第 第第第第第 第第第第第 第第第第 一、 第第第第 一、 89 89 C51 C51 第第第 第第 第第第 第第 1 1 第第第第2 2 第第第 第第第 3 3 第第第第第第第第1 指指 指指指指指指指指指 指指指指指指指指指 :、。 2 指指1 指指指指指指指指 1 指指指指指指指指指指 指指指3 指指1 指指指指指指指指 2 指指指指指指指指2. 指指指 指指指 指指指指指 指指指指

description

第3章 指令系统及程序设计举例. 3.1 指令格式 与寻址方式. 一、指令格式. 1. 指令. 操作码 目标操作数,源操作数. 89 C51 指令系统中,有1字节、2字节或3字节指令。 1字节:其中既包含操作码、又包含操作数信息。 2字节:1个字节表示操作码,另1个字节表示操作数或操 作数地址。 - PowerPoint PPT Presentation

Transcript of 第3章 指令系统及程序设计举例

Page 1: 第3章 指令系统及程序设计举例

第第 33 章 指令系统及程序设计举例章 指令系统及程序设计举例 1. 指令

只用来对汇编过程进行控制,汇编时不产生机器码。 ( 1) ORG ( 汇编起始命令 )

格式: ORG 汇编起始地址( 16 位)

3.1 指令格式指令格式与寻址方式与寻址方式一、指令格式一、指令格式 8989C51C51 指令系统中,有指令系统中,有 11 字节、字节、 22 字节或字节或 33 字节指令。字节指令。 1 字节:其中既包含操作码、又包含操作数信息。 2 字节: 1 个字节表示操作码,另 1 个字节表示操作数或操 作数地址。 3 字节: 1 个字节表示操作码,另 2 个字节表示操作数。2. 伪指令

操作码 目标操作数,源操作数

Page 2: 第3章 指令系统及程序设计举例

( 3) EQU (赋值命令) 为字符名称赋值 格式: 字符名称 EQU 数或汇编符号

( 4) DATA (数据地址赋值命令,类似于 EQU) 格式: 字符名称 DATA 表达式 将表达式的值赋给字符名称,常用于在程序中定义数据地址。

( 2) END( 汇编结束命令 )

格式: END

例: STRING DATA 21H NUM DATA 20H MOV R0,#STRING MOV NUM, A

( 5) DB/DW (定义字节、字命令) 格式: [[ 标号:标号: ]] DB( DW ) [ 项或项表 ] 注意:① DB 时,项或项表是一个字节或是用逗号隔开的字节串 或是在‘ ’中的 ASCII 字符串。 ② DWDW 时,项或项表的存放方式是 高高 88 位在低地址,低位在低地址,低 88 位在高地址。 见位在高地址。 见 P110P110例。例。

Page 3: 第3章 指令系统及程序设计举例

( 6) DS (定义存储空间命令) 从指定地址开始保留若干单元。 格式: [[ 标号:标号: ]] DS 表达式

例: ORG 1000H DS 08H

DB 30H, 8AH汇编后, (1008H)=30H, (1009H)=8AH

注意注意:以上的 DBDB、、 DWDW、、 DSDS 仅对程序存储器起作用仅对程序存储器起作用,不能对数据存储器初始化。( 7) BIT (位地址符号命令) 将 BIT 后的位地址赋给字符名。 格式: 字符名 BIT 位地址 例: A1 BIT P1.0 ; P1 口第 0 位的位地址

90H 赋给了 A1 —— 寻找指令中操作数或操作数所在的地址,共有 7 种。二、寻址方式二、寻址方式

Page 4: 第3章 指令系统及程序设计举例

3. 立即寻址 MOV A, ##3AH ;; 3AH3AHAA MOV DPTR,# 2000H ; 2000H→DPTR2000H→DPTR

;(;( DPHDPH)) =20H=20H 注:立即数前用‘#’,以区别地址。注:立即数前用‘#’,以区别地址。 ;;(( DPLDPL)) =00H=00H

2. 直接寻址 MOV A, 3AH ;(;( 3A3A)) AA,, 3AH3AH 的内容的内容 AA 操作数部分是操作数所在的存储器单元的地址。存储器单元的地址。

1. Reg 寻址 MOV A, R0 ; R0 A Reg: R0~ R7, A, B, CY, DPTR (对它们也可使用其地址)

在 89C51 中,用直接寻址方式可访问① 片内 RAM 的 128 个存储单元② 所有的 SFR (既可用地址,也可用名字)③ 216 个位地址空间

例 1:MOV A, P1 例 2 : MOV SBUF, A MOV A, 90H MOV 99H, A此种寻址方式一般用于片内此种寻址方式一般用于片内 RAMRAM和和 SFRSFR。。

Page 5: 第3章 指令系统及程序设计举例

以某个 REG 内容为基地址,然后加上地址偏移量以形成操作数地址。 在 89C51 中,用 DPTR或 PC 作为变址 REG( 基地址 ) ,地址偏移量放在 A 中。 即:操作数地址即:操作数地址 =(=(A)+(DPTR)A)+(DPTR) ,,或或 =(=(A)+A)+(PC)(PC)

操作数地址放在某个 REG 中,规定:(1) R0、 R1 为间接 REG ,寻址片内 128 字节的低位地址RAM 或片外 RAM 低地址的 256 个单元。(2) DPTR 为间接 REG ,寻址片外 RAM 64KB。

4. REG 间接寻址 MOV A, @@R0 ;若 R0 内容为65H , ( 65H ) A。

简言之,有 :

@R0 , @R1, SP (PUSH、 POP) 寻址片内 RAM

@R0 , @R1 , @ DPTR 寻址片外 RAM

此种寻址方式一般用于数据存储器(此种寻址方式一般用于数据存储器( RAMRAM)。)。

5. 变址寻址 只能用于访问程序存储器(只能用于访问程序存储器( ROMROM),),从中取数。从中取数。

Page 6: 第3章 指令系统及程序设计举例

例: MOVC A,@A+DPTR ; ((A)+(DPTR))A MOVC A,@A+PC ; ((A)+(PC))A

相对偏移量的计算 ( 以 2 字节指令为例 ) : rel=( 目标地址—源地址— 2) 补相对转移指令执行时,是以当前当前PCPC ((程序计数器)的值程序计数器)的值加上指令中规定的偏移量偏移量 relrel 而形成实际的转移地址。

6. 相对寻址( ROM)

———— 只出现在相对转移指令中只出现在相对转移指令中

例: JC rel ; rel= 75H 当指令 JC 被取出时, PC 值已在原地址上加 2 ,这时程序转移到当前的当前的 PCPC++ relrel 地址地址去执行,即转去当前当前 PCPC++ 75H75H 。

Page 7: 第3章 指令系统及程序设计举例

7. 位寻址(属于直接寻址)(属于直接寻址)—— 操作数中给出的是位地址,即片内 RAM 某一单元中的一位。

包括① 20H~ 2FH 的 128 个位单元地址 00H~ 07FH

② 地址能被 8 整除的 SFR

位地址常用几种方式表示

① 直接使用位地址: 00H~ 07FH

② 寄存器名 + 位数: PSW.3

③ 位名称例: CLR bit (即: CLR 90H)

Page 8: 第3章 指令系统及程序设计举例

1. 操作数寻址方式和有关空间寻址方式寻址方式 寻址空间寻址空间立即数寻址 程序存储器 ROM

直接寻址 片内 RAM 低 128 字节,特殊功能寄存器 SFR ,位地址空间寄存器寻址 工作寄存器 R0~ R7, A, B, Cy, DPTR

寄存器间接寻址 片内 RAM 低 128 字节 [@R0,@R1, SP(仅PUSH,POP)]片外 RAM [@R0,@R1,@DPTR]

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

相对寻址 程序存储器 256 字节范围( PC+ 偏移量)位寻址 片内 RAM 的 20H~ 2FH 字节地址

部分特殊功能寄存器 SFR

三、寻址空间及符号注释三、寻址空间及符号注释

Page 9: 第3章 指令系统及程序设计举例

2. 寻址方式中常用符号注释( 1) Rn( n= 0~7)( 2) Ri( i= 0, 1)( 3) #data 8 位立即数( 4) #data16 16 位立即数( 5) direct 8 位片内 RAM 单元(包括 SFR )的直接地址( 6) addr11 11 位目标地址( 7) addr16 16 位目标地址( 8) rel 补码形式的 8 位地址偏移量( 9) bit 片内 RAM或 SFR 的直接寻址位地址( 10 ) @ 间接寻址方式中,表示间址寄存器的符号( 11 ) (×) × 中的内容

( 12 ) ((×)) 由 × 指出的地址单元中的内容

Page 10: 第3章 指令系统及程序设计举例

五大类(五大类( 111111 条)条): 1. 数据传送指令: 28 条 2. 算术运算指令: 24 条 3. 逻辑运算及移位: 25 条 4. 控制转移指令: 17 条 5. 位操作指令: 17 条

3.2 8989C51C51 单片机的指令系统单片机的指令系统

一、数据传送指令一、数据传送指令格式: MOV 目标,源 ; 片内片内数据传送

MOVX 目标,源 ; 累加器 A 与片外片外 RAMRAM传送 MOVC 目标,源 ; 累加器与 ROMROM 传送

通用数据通用数据传送指令传送指令 XCH 第一操作数,第二操作数 ; 字节交换 XCHD 第一操作数,第二操作数 ; 半字节交换

交换指令交换指令PUSH POP

堆栈操作指令堆栈操作指令

Page 11: 第3章 指令系统及程序设计举例

( 2 )以寄存器 Rn 为目的的操作数(见 P44 例) ① MOV Rn, A ; RnA, Rn: R0 ~ R7, 寄存器寻址。 ② MOV Rn , direct ; Rn( direct) ,直接寻址。 ③ MOV Rn, #data ; Rndata ,立即寻址

( 1 )以累加器 A 为目的操作数 ① MOV A, Rn ; ARn, Rn: R0~ R7 ,寄存器寻址。 ② MOV A, direct ; A(direct), direct: 8 位片内RAM 地 址( 256B 范围内),直接寻址。 ③ MOV A,@Ri ; A(Ri), R0或 R1 所指片内RAM ( 128B 范围内),寄存器间接寻址 。 ④ MOV A, #data ; Adata ,立即数 data: 00H~FFH

1. 片内数据传送(片内 RAM 区中的工作寄存器 Rn , A , 片内数据 RAM , SFR 之间)

注:注: ①①无 无 MOV RnMOV Rn,, Rn Rn 指令; 指令; ② ② P58 P58 机器码的构机器码的构成成

Page 12: 第3章 指令系统及程序设计举例

( 3 )以直接地址为目的操作数 ① MOV direct, A ; (direct)A, Reg 寻址 ② MOV direct, Rn ; (direct)Rn, Reg 寻址 ③ MOV direct, direct ; (direct)(direct) ,直接寻址 ④ MOV direct,@Ri ; (direct)(Ri), Reg 间接寻址 ⑤ MOV direct, #data ; (direct)data ,立即寻址。

( 4 )以间接地址为目的的操作数 ① MOV @Ri, A ; (Ri)A, Reg 寻址 ② MOV @Ri, direct ; (Ri)(direct) ,直接寻址 ③ MOV @Ri,# data ; (Ri)data ,立即寻址例: MOV A,# 74H ; A= 74H MOV 74H,# 00H;( 74H)= 00H MOV A, 74H ; A= 00H

注意:将指令译成机器码时,第注意:将指令译成机器码时,第 22 、、 33 字节的内容顺字节的内容顺序。序。 P59P59,, P60P60。。

Page 13: 第3章 指令系统及程序设计举例

例: MOV R0,# 77H ; R0= 77H MOV A,# 03H ; A= 03H MOV @R0, A ; ( R0)= 03H ,即 (77H)=03H.

( 5) 16 位数据传送指令 MOV DPTR, #data ; data 为 16 位立即数。

DPHdataH, DPLdataL

低位字节 dataL

高位字节 dataH

OP CODE

例: MOV DPTR,# 2000H

例: ① MOV R0, #20H MOV @R0, #data  ;MOV 20H,# data

② MOV P1, #80H ;立即寻址 ③ MOV P3, P1 ;直接寻址

Page 14: 第3章 指令系统及程序设计举例

( 2 )利用 DPTR16位 Reg 间接寻址,可以在 64KB 范围内寻址。 ① MOVX A,@DPTR ; A(DPTR) ② MOVX @DPTR, A ; (DPTR)A 注: 每次传送注: 每次传送 88 位数据位数据

④ MOV R1, #82H MOV A,@R1 ;此指令有错,因为 @Ri 间接寻址仅能寻址片内低 128 字节 RAM 区 ( 片内地址不超过 7FH) ,或片外低 256 字节 RAM 区 ( 必须使用 MOVX )。

欲从欲从 8282HH 取数到取数到 AA ,,可使用:可使用: MOV AMOV A,, 82H82H

2. 累加器 A 与片外 RAM 间(或 I/O 口)间的数据传送( 1 )利用 Ri 间接寻址,可以在 256 字节范围内寻址。 ① MOVX A,@Ri ; A(Ri) ② MOVX @Ri, A ; (Ri)A

注:这时,注:这时, RAMRAM 地址地址在在 RiRi 中由中由 P0P0 口送出,口送出, P2P2口仍可用作口仍可用作 I/OI/O 口口。

Page 15: 第3章 指令系统及程序设计举例

例: MOV DPTR, #0650H ;将 0650H 单元的8bit MOVX A,@DPTR ;数据送入 A 。 注: 注: 因为外部的因为外部的 RAMRAM与与 I/OI/O 端口是统一编址的,端口是统一编址的, 889C519C51 指令系指令系统中无单独的统中无单独的 ININ、、 OUTOUT 端口操作指令,所以指令中的端口操作指令,所以指令中的 88 位或位或1616 位地址,可能是位地址,可能是 RAMRAM 地址,也可能是地址,也可能是 I/OI/O 端口地址。端口地址。

3. 累加器 A与 ROM 之间的数据传送 ① MOVC A,@A+DPTR ;A(A+(DPTR)) ,变址寻址方式。 ② MOVC A,@A+PC ; A(A+PC), PC 为新 PC ,变址寻址。其中 :

① 以 (DPTR) 为基址 Reg, A 为偏移量,可以查找到 (DPTR)以后的 256 个字节范围内的代码或常数。因为 (DPTR) 的内容可在 64 K 范围内变化,故此种查表称为远程查表远程查表。 ② 以当前 PC 为基址, A 为偏移量,可以查找当前指令所在地址以后的 256 个字节范围内的代码或常数,称近程查表近程查表。

无符号数相加无符号数相加

Page 16: 第3章 指令系统及程序设计举例

例: MOV A, #06H MOV DPTR, #2000H MOVC A,@A+DPTR

XXH

2000H

2006H

……

A

例: (2 字节 ) 1000H:MOV A, #30H(1 字节 ) 1002H:MOVC A,@A+PC

XXHA

XXH

//////////

/////////// 1000H

1003H

1033H

(1003(1003H)H)

///////////

///////////1001H1002H

Page 17: 第3章 指令系统及程序设计举例

例:对 A 中的 BCD 码,用查表法查得相应的 ASCII 码。 1. 用 PC 作为基址

TAB: DB 30HDB 31HDB 32H

DB 33H …DB 39H

; ASCII 码表

MOV A, #03H ;查 3的 ASCII 码INC A ;考虑 RET 的存在,修正偏移量MOVC A,@A+PC ;此指令取出后, PC 指向

RET 单元RET ; (1 字节 )

Page 18: 第3章 指令系统及程序设计举例

2. 用 DPTR 作为基址 MOV A, #03H

MOV DPTR, #TAB#TAB ;不需要修正偏移量MOVC A,@A+DPTRRET

; ASCII 码表TAB: DB 30H

DB 31H……DB 39H

( 1 )字节交换指令 ① XCH A, Rn ; ARn reg 寻址 ② XCH A, direct ; A(direct)直接寻址 ③ XCH A,@Ri ; A(Ri) 间接寻址

4. 交换指令(分字节交换、半字节交换两种)

Page 19: 第3章 指令系统及程序设计举例

( 2 )半字节交换指令 ① XCHD A,@Ri ; A0 ~ 3(Ri)0 ~ 3 ,高 4 位不变。 ② SWAP A ; A0 ~ 3 A4 ~ 7 , A 的高低 4 位互换。

例:中断服务程序中保护现场 现场: DPTR=1234H, PSW=63H, A=54H, SP=38H

3CH3BH3AH39H38H=SP

PUSH DPLPUSH DPHPUSH PSWPUSH A…

… POP APOP PSWPOP DPHPOP DPL

34H12H63H54H

5. 堆栈操作指令( 1) PUSH direct ; SP+1SP ,直接地址寻址的单元内容 (SP)( 2) POP direct ;将 (SP)(direct), SP - 1 SP

注: 注: ①单元内容为单元内容为 88 位的;位的; ②堆栈只能设在内堆栈只能设在内 RAMRAM 区;区; ③889C519C51 的堆栈是向上生长的。的堆栈是向上生长的。

(direct)

Page 20: 第3章 指令系统及程序设计举例

A±CY ±Rn A,常用于多字节加、减法。 89C51 系列中没有没有不带借位的减法指令,需要的话,在 SUBB 前用 CLR C 指令清CY。

2. 带进(借)位加法 / 减法 ① ADDC/SUBB A , Rn ② ADDC/SUBB A , direct ③ ADDC/SUBB A , @Ri ④ ADDC/SUBB A , #data

二、算术运算指令二、算术运算指令1. 加法 ① ADD A, Rn ; AA+Rn ② ADD A, direct ; AA+(direct) ③ ADD A,@Ri ; AA+(Ri) ④ ADD A, #data ; AA+data

注:加减运算中,目标操作数只能是注:加减运算中,目标操作数只能是AA。。

影响标志位:影响标志位:进位标志 CY ,半进位 AC ,溢出 OV(OV=C7 + C6),奇偶 P(A 中 1 的个数为奇时 P= 1)。

Page 21: 第3章 指令系统及程序设计举例

5. 乘法指令 (8 位无符号数 ) MUL AB ; BAA×B

;若结果 >0FFH( B 中有值 ), OV=1, CY= 0。

;否则( B 中为 0) , OV= 0, CY= 0。

3. 增 / 减量指令 ① INC A ; A+1A

② INC Rn ; Rn+1Rn③ INC direct ; (direct)+1(direct) ④ INC @Ri ;@Ri+1@Ri⑤ INC DPTR ; DPTR+1DPTR 注:这两条指令不影响注:这两条指令不影响 PSWPSW。。

⑥ DEC A ⑦ DEC Rn ⑧ DEC direct ⑨ DEC @Ri

4. 十进制调整指令——完成 BCD 码加法运算。 DA A ;跟在 ADD或 ADDC 后,将 A 中结果进行十进制调整。注: ①必须是压缩型注: ①必须是压缩型 BCDBCD 码运算; ②只能用于码运算; ②只能用于 BCDBCD 码加法。码加法。

Page 22: 第3章 指令系统及程序设计举例

6. 除法指令 (8 位无符号数 ) DIV AB ; A/B 的商 A, A/B 的余数 B

例: 16 位数求补(求反+ 1 )。 设 16位二进制数在 R1R0 中,求补结果存于 R3R2 中。

MOV A, R0 ; 16 位数低 8 位送 ACPL A ;求反ADD A, #01H ;加 1 (不用不用 INCINC ,,因为它不因为它不影影

响标志位)响标志位)MOV R2, A ;存补码低 8 位MOV A, R1 ;取 16 位数高 8 位CPL A ;求反ADDC A,# 00H ;加进位MOV R3, A ;存补码高 8 位

以上指令编程练习见:P93~P96

Page 23: 第3章 指令系统及程序设计举例

1. 简单操作指令 ① 累加器清零 CLR A ② 累加器取反 CPL A

例: MOV A, #35H ANL A, #0FH ;屏蔽高 4 位,保留低 4 位。

2. 与 ① ANL A , Rn ; A /\ RnA ② ANL A, direct ③ ANL A, @Ri ④ ANL A, #data ⑤ ANL direct, A ; (direct) /\ A(direct) ⑥ ANL direct,# data ; (direct) /\ # data(direct)注: 注: ⑤ ⑥⑤ ⑥中若直接地址为 中若直接地址为 I/O I/O 口口 , , 则为 “读-改-写”操作。则为 “读-改-写”操作。

三、逻辑操作指令三、逻辑操作指令 (很方便对端口的某位操作:(很方便对端口的某位操作: ANL P1ANL P1,, 00000001B00000001B P1.7P1.7~~ P1.1P1.1== 00,, P1.0P1.0 不变)不变)

Page 24: 第3章 指令系统及程序设计举例

3. 或 ① ORL A, Rn ② ORL A,, direct ③ ORL A,@Ri ④ ORL A , #data ⑤ ORL direct, A ⑥ ORL direct,# data 注: 注: ⑤⑤ ⑥⑥中若直接地址为中若直接地址为 I/O I/O 口,则为“读-改-写”操作。口,则为“读-改-写”操作。例: MOV A , #05H ORL A , #30H ;添加 30H, 变成 ASCII码 4. 异或

① XRL A, Rn ② XRL A, direct ③ XRL A,@Ri ④ XRL A, #data

⑤ XRL direct, A ⑥ XRL direct, #direct注:若注:若⑤⑤ ⑥⑥中中 directdirect为为 I/OI/O 口,为“读—改—写”操作。口,为“读—改—写”操作。例: MOV A , #55H XRL A , #F0H ;高 4 位取反,低 4 位不变。

Page 25: 第3章 指令系统及程序设计举例

5. 移位指令(仅对累加器 A ,见 P.69) ① 循环左移: RL A ② 带进位循环左移: RLC A ③ 循环右移: RR A ④ 带进位循环右移: RR C A

例 : 拆字。将片内 RAM 20H 单元的内容拆成两段,每段 4 位。 并将它们分别存入 21H 与 22H 单元中。程序如下: ORG 2000H

START: MOV R0, #21H ; 21HR0 ,用用 R0R0 间接寻间接寻址址 MOV A, 20H ; (20H)A ANL A, #0FH ; A #0FH∧ A MOV @R0, A ; (A)(R0) INC R0 ; R0+1R0 MOV A, 20H ; (20H)A SWAP A ; A0~3A4~7

ANL A, #0FH ; A #0FH∧ MOV @R0, A ; (A)(R0)

Page 26: 第3章 指令系统及程序设计举例

1. 无条件转移 ① 绝对短转移 AJMP addr11; PC+2 PC, addr11PC10 ~ 0 , PC15 ~ 11不变。 转移的目标地址在 AJMP 指令后面指令的第一字节开始的同一 2K 字节范围内。如下图所示:例: AJMP 1123H

AJMP K0

四、 控制转移类指令四、 控制转移类指令

AJMP2KB

PC

PC+21123H 0001 0001 0010 0011 a15 a10 a8 a7 a0

001 0010 0011 0000100001所以, AJMP 1123H 对应的机器码是 2123H。 ( AJMP 为双字节指令 )

该指令操作码的形成:

Page 27: 第3章 指令系统及程序设计举例

本指令对应 8 种操作码:定义每 256 字节为一个页面, 2K 的跳转范围 可分为 8页( 211= 2 3× 28 = 8×256 ),每个页面一个操作码。 AA10 10 A A99 A A88 0 0 地址页

0 0 0 10 0 0 1 操作码操作码

A7~ A0 页内0 0 0 00 0 1 H 0页 0~ 255 单元0 0 1 0 21H 1 页 0~ 255 单元0 1 0 0 41H 2 页 0~ 255 单元0 1 1 0 61H 3页 0~ 255 单元1 0 0 0 81H 4页 0~ 255 单元1 0 1 0 A1H 5页 0~ 255 单元1 1 0 0 C1H 6页 0~ 255 单元1 1 1 0 E1H 7页 0~ 255 单元

Page 28: 第3章 指令系统及程序设计举例

② 绝对长转移指令 LJMP addr16 ;在 64KB 内转移, addr16 PC例: LJMP 2030H ;放在 0000H 中时, 上电后自动转移到 2030H 单元。

③ 相对转移指令 (短转移 ) SJMP rel ; PC+2 PC

; PC+rel PC rel=(终地址—始地址— 2 ) 补注:注:当 rel=FE 时,导致无限循环。 因为 终地址 = 始地址 +2+FE =PC+2-2 =PC因此,可用如下形式指令 JMPADRJMPADR:: SJMP SJMP JMPADRJMPADR 来代替 HLTHLT ,在 51 单片机中无HLT。

SJMP

- 128

127

LJMP 64KBPC

PC+3

Page 29: 第3章 指令系统及程序设计举例

④ 间接转移指令 (散转指令 )—— 单字节指令JMP @A+DPTR ; A+DPTR PC

通常以 DPTR 为基地址, A 为偏移量,则可实现散转功能 。

双字节的命令键跳转表TAB: AJMP SUB1 AJMP SUB2 ……

AJMP SUBn

例: P75 例 3-11 根据 A 中命令键的值,设计命令键操作程序入口跳转表。

CLR C ;清进位位 RLC A ;键值乘以 2

MOV DPTR, #TAB ; DPTR 指向表首址 JMP @ A + DPTR ;散转到命令键入口

Page 30: 第3章 指令系统及程序设计举例

例: 128 种分支转移程序。程序框图如右:功能功能 : : 根据入口条件转移到 128 个目的地址入口入口 ::(R3)= 转移目标地址的序号 00H~7FH出口出口 : : 转移到相应的子程序入口JMP_128: MOV A, R3

RL A

MOV DPTR, #JMPTAB

JMP @A+DPTR

JMPTAB: AJMP ROUT00

AJMP ROUT01

…… ……

AJMP ROUT7F

128 个子程序首址

Page 31: 第3章 指令系统及程序设计举例

② 比较转移指令 (对无符号数)(对无符号数) CJNE 目的,源 , rel ; 3 字节指令 源与目的字节进行比较 ( 目的-源 ) ,若它们的值不等,则转移,同时将 Cy 清 0 或置 1 。比较操作不影响原有操作数。比较操作不影响原有操作数。 rel = (终地址—始地址— 3 ) 补

i) CJNE A, direct ,rel ; A ≠ (direct) ,转移 A>direct, Cy =0

A<direct,Cy = 1ii) CJNE A , #data, rel ; A ≠ data ,转移同上。iii) CJNE Rn, #data, rel ; Rn ≠ data ,转移同上。iv) CJNE @Ri,# data, rel ; (Ri) ≠ data ,转移同上。

2. 条件转移类指令 —— 若条件满足,则程序转向指定的目标地址。 ① 累加器累加器 AA判零转移指令 JZ rel ; A=0 转移 JNZ rel ; A ≠ 0 转移

Page 32: 第3章 指令系统及程序设计举例

例:例:设 R7=56H , 执行指令 CJNE R7 , #60H , K1 ; R7<60H, K1 且Cy=1 … K1 : JC K3 ; Cy=1 ,判出 R7<60H k3 …K3:例:例:片内 RAM ONE 和 TWO 两个单元中存有两个无符号数,将两个数中小的存入 30H 单元。

MOV A , ONECJNE

A, TWO , BIGSJMP STORE

BIG: JC STOREMOV A, TWO

STORE: MOV 30H, A

Page 33: 第3章 指令系统及程序设计举例

③ 循环转移指令 i) DJNZ Rn, rel ; PC+2 PC, Rn- 1Rn, ;当 Rn≠0 时, PC + relPC

;当 Rn=0 时,则结束循环,程序向下执行。 功能: (功能: ( Rn Rn - - 11 ))不为零时转移,否则继续执行不为零时转移,否则继续执行。 ii) DJNZ direct, rel ; (direct)-1 ,不为零时转移,否则继续执行。例:软件延时。(在 P1.7引脚上输出一个 50us 的脉冲)

利用 DJNZ 指令可在一程序中插入某些指令来实现软件延时。DJNZ 执行时间为 2 个机器周期,这样循环 1次可产生 2 个机器周期延时。 (12M晶振时, 1 个机器周期 =1us 。 2×24+1=49us)

CLR P1.7 ; P1.7输出变低电平MOV R2 ,# 18H ; 1us ;赋循环初值 24

HERE: DJNZ R2 ,HERE ; 2us ; R2-1R2, R2 不为零 循环。 SETB P1.7 ; P1.7输出高电平

Page 34: 第3章 指令系统及程序设计举例

3. 调用和返回指令① 短调用指令 ACALL addrll ; 在 2K 范围内调用,与 AJMP相似 . ;断点保护: PC+2 PC, SP+ 2 SP, PC 进堆栈。

; addr0~10 PC0~10

注:子程序首地址必须在注:子程序首地址必须在 ACALLACALL 指令后第一字节为起始的指令后第一字节为起始的 22KK 字节范围内字节范围内 ROMROM 中。中。

例:例:多项单字节数求和。 设数组长度放 R0 中,数组存放首地址在 R1 中,数组之和则放于 20H 单元中(设和不超过 256 )。 CLR A SUMD: ADD A,@R1 INC R1 DJNZ R0, SUMD MOV 20H, A RET

数组之和20H

数组首地址R1

数组长度R0

Page 35: 第3章 指令系统及程序设计举例

② 长调用指令 LCALL addr16 ;在 64K 范围内调用;断点保护: PC+3 PC, SP+ 2 SP, PC 进堆栈。; addr0~15 PC

③ 返回指令 i) RETii) RETI (从中断返

回)

;恢复断点 PC

4. 空操作指令 NOP ;除 PC+1 外,不作其它操作。 例:利用 NOP 产生方波;

CLR P2.7NOP NOP NOP NOP SEPB P2.7

Page 36: 第3章 指令系统及程序设计举例

位操作包括:位操作包括:位传送、位状态控制、位逻辑操作、位条件转移等 .进行位操作时:进行位操作时: 位累加器 C—— 进位标志 Cy 位地址——①片内 RAM 字节地址 20H~ 2FH 中连续 128 个位, 地址从 00H~7FH 。

② 部分 SFR 地址可以被 8 整除。

五、位操作指令五、位操作指令

在汇编语言中,位的表达方式有多种: ① 直接给出位地址 如: MOV C, D4H (位地址) ② 点操作符方式 如: MOV C, PSW.4( PSW 的第 4位) ③ 位名称方式 如: MOV C, RS1 ④ 用户定义名方式 如: SUB.REG BIT RS1 (用SUB.REG

表示 RS1) 这四种方式都可表达这四种方式都可表达 PSWPSW 中的第四位。中的第四位。

Page 37: 第3章 指令系统及程序设计举例

1. 位传递 ①MOV C, bit ; C ( bit ), bitbit 是位地址,直接寻是位地址,直接寻址址 ②MOV bit, C ; ( bit ) C 当 bit 为 00H~ 7FH ,位地址在片内 RAM 中共 128 位;

bit 为 80H~ FFH ,位地址在 11个 SFR 中。(如: 4 个 8 位的并行 I/O 口,每位均可单独进行寻址。)

例: SETB P1.7 ;将 P1.7 位 置 1 CLR 2AH ; 2AH 为 25H 单元中的第 2 位地址 ;设( 25H)= 00110100B ,此指令将( 25H )变为 00110000B。

2. 位状态控制指令 ① 位清 0 CLR C ;0C

CLR bit ; 0(bit) ② 位置 1 SETB C ; 1C SETB bit ; l(bit) ③ 位取反 CPL C ; /CC CPL bit ; /bitbit

当直接地址 当直接地址 bit bit 为端为端口中的某一位时,具口中的某一位时,具有“读-改-写” 功有“读-改-写” 功能。能。

Page 38: 第3章 指令系统及程序设计举例

3. 位逻辑运算指令 ① 与 ANL C , bit ; C (bit) ∧ C ANL C, /bit ; C (/bit) ∧ C( /bit并不改变 bit 的值) ② 或 ORL C, bit ; C (bit ) ∨ C ORL C, /bit ; C (/bit) ∨ C4. 位条件转移指令(相对转移) ① 判 C 转移指令 JC rel ; C=1 转移 JNC rel ; C≠1 转移 ②判位变量转移指令 JB bit, rel ; bit =1 转移 JNB bit, rel ; bit ≠1 转移 ③判位变量并清 0 JBC bit, rel

;若 bit =1, 0 bit ,转移 ;若 bit =0 , 则顺序执行 偏移量=(目标地址-源地址-指令字节数)偏移量=(目标地址-源地址-指令字节数)补补

P82P82

Page 39: 第3章 指令系统及程序设计举例

例:例:如图示组合逻辑电路+

P1.0P1.1 P1.2

MOVC, P1.0

ORL C, /P1.1

CPL CMOV

P1.2, C

Page 40: 第3章 指令系统及程序设计举例

例:例:设变量 X 存在 VAR 单元中,函数值 y 存放在 FUNC 中,按下式给 y 赋值。y =

1 X > 00 X = 0-1 X < 0

VAR DATA,30H ;VAR 地址 30H FUNC DATA,31H ;FUNC 地址 31H

START: MOV A,VAR ;取 X JZ COMP ;A 为 0转 COMP JNB ACC.7,POSI ;X>0转 POSI

; 符号位为 0 MOV A,#0FFH ;X<0,-1A SJMP COMP

POSI: MOV A,#01HCOMP: MOV FUNC,A

Page 41: 第3章 指令系统及程序设计举例

例例 :: 在片内 RAM 40H~4FH 中置初值 A0H~AFH ,再将其内容依次传送到片外 RAM 0800H 为起始地址的 16 个单元中。0000

013F

003F 7840 7A10 74A00045 F6 08 040048 DAFB 7840 900800

在 RAM 内置初值

ORG 0000HRESET: AJMP MAIN

ORG 003FHMAIN: MOV R0, #40H

MOV R2, #10HMOV A, #A0H

A1: MOV @R0, AINC R0INC ADJNZ R2, A1MOV R0, #40HMOV DPTR, #0800H

地址 机器码

Page 42: 第3章 指令系统及程序设计举例

MOV R2, #10HA2: MOV A,@R0

MOVX @DPTR, A

INC R0 INC DPTRDJNZ R2, A2

HERE: SJMP HERE

将内 RAM 中40H~4FH 的内容依次送到外 RAM中以 0800H 为起始地址的 16 个单元中。

7A10

0051 E6 F0 08 A30055 DAFA0057 80FE

地址 机器码

相对偏移量的计算:FBH=( 0045H- 0048H- 2 )补=(- 5 )补FAH=( 0051H- 0055H- 2 )补=(- 6 )

补FEH=( 0057H- 0057H- 2 )补=(- 2 )补

Page 43: 第3章 指令系统及程序设计举例

ANL 40H,#0FH ; 40H的 ASCII 码变为 BCD 码。MOV A, 41HANL A, #0FH ; 41H的 ASCII 码变为 BCD 码。RL A ; A 的内容左移 4次RL ARL ARL A ;左移 4次, 或使用 SWAP AORL 40H,A ;结果存在 40H 单元中。

指令系统举例:指令系统举例: 例例 1. 1. 设两位用 ASCII 码表示的数分别保存在 40H、 41H单元中,将其转换为两位 BCD 数,并以压缩形式存入 40H 单元中。程序:

Page 44: 第3章 指令系统及程序设计举例

P1.0

P1.1

P1.2

P1.3

LED1

LED2 +5v

+5v

+5vK1

K2

LOOP: MOV A, #03H ORL P1, A ; 1

P1 MOV A, P1 ; P1输入 RL A

RL A MOV P1, A

CALL DELAY AJMP LOOP

例例 2.2.

Ki闭合 LEDi亮 例例 3.3. 两个无符号数存于 20H、 21H 单元中,比较他们的大小, 将大数 A。

MOV A, 20HCJNE A, 21H, L1SJMP L2

L1: JNC L2MOV A, 21H

L2: RET ; A 中为大数

因为“ 0”亮,所以不能用 MOV。

Page 45: 第3章 指令系统及程序设计举例

例例 4.4. 20H~ 25H 单元中存放着单字节无符号数,求和并存于 27H、 26H 单元。CLR CMOV R0, #20HMOV R1, #00H ;高字节和MOV R2, #05H ;数组长度- 1MOV A , @R0INC R0

L1 : ADD A,@R0 ;求和JNC L2INC R1

L2 : INC R0DJNZ R2, L1MOV 26H, AMOV 27H, R1RET

Page 46: 第3章 指令系统及程序设计举例

例:搜索最大值。例:搜索最大值。从片内 RAM的 BLOCK 单元开始有一个无符号 数据块,其长度存于 LEN 单元中,试求出其中最大的。LEN DATA 20HMAX DATA 21HBLOCK DATA 22H

CLR A MOV R2, LEN ;数据块长度 R2 MOV R1, #BLOCK ;置地址指针

LOOP : CLR C SUBB A,@R1 ;用减法做比较 JNC NEXT ;无借位 A大 MOV A,@R1 ;否则大者送 A SJMP NEXT1

NEXT: ADD A,@R1 ; A 大恢复 ANEXT1 : INC R1 ;修改地址指针

DJNZ R2, LOOP ;未完继续 MOV MAX, A ;完存大数

Page 47: 第3章 指令系统及程序设计举例

例: 排序。例: 排序。将片内 RAM区 50H~ 59H中的数据按从小到大的次序排列。

QUE: CLR 00H :清除交换标志MOV R3,# 9H ;循环次数MOV R0,# 50H ;存放区首址MOV A,@R0 ;取前数

L2: INC R0MOV R2, A ;保存前数SUBB A,@R0 ;前数减后数MOV A, R2 ;恢复前数JC L1 ;顺序 ,继续比较SETB 00H ;逆序 ,建立标志XCH A ,@R0 ;前后数交换DEC R0XCH A ,@R0INC R0 ;指向后数单元

L1 : MOV A,@R0 DJNZ R3, L2 ;依次重复比较

JB 00H, QUE ;交换后重比较RET