第3章 指令系统及程序设计举例
description
Transcript of 第3章 指令系统及程序设计举例
第第 33 章 指令系统及程序设计举例章 指令系统及程序设计举例 1. 指令
只用来对汇编过程进行控制,汇编时不产生机器码。 ( 1) ORG ( 汇编起始命令 )
格式: ORG 汇编起始地址( 16 位)
3.1 指令格式指令格式与寻址方式与寻址方式一、指令格式一、指令格式 8989C51C51 指令系统中,有指令系统中,有 11 字节、字节、 22 字节或字节或 33 字节指令。字节指令。 1 字节:其中既包含操作码、又包含操作数信息。 2 字节: 1 个字节表示操作码,另 1 个字节表示操作数或操 作数地址。 3 字节: 1 个字节表示操作码,另 2 个字节表示操作数。2. 伪指令
操作码 目标操作数,源操作数
( 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例。例。
( 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 种。二、寻址方式二、寻址方式
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。。
以某个 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),),从中取数。从中取数。
例: 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 。
7. 位寻址(属于直接寻址)(属于直接寻址)—— 操作数中给出的是位地址,即片内 RAM 某一单元中的一位。
包括① 20H~ 2FH 的 128 个位单元地址 00H~ 07FH
② 地址能被 8 整除的 SFR
位地址常用几种方式表示
① 直接使用位地址: 00H~ 07FH
② 寄存器名 + 位数: PSW.3
③ 位名称例: CLR bit (即: CLR 90H)
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
三、寻址空间及符号注释三、寻址空间及符号注释
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 ) ((×)) 由 × 指出的地址单元中的内容
五大类(五大类( 111111 条)条): 1. 数据传送指令: 28 条 2. 算术运算指令: 24 条 3. 逻辑运算及移位: 25 条 4. 控制转移指令: 17 条 5. 位操作指令: 17 条
3.2 8989C51C51 单片机的指令系统单片机的指令系统
一、数据传送指令一、数据传送指令格式: MOV 目标,源 ; 片内片内数据传送
MOVX 目标,源 ; 累加器 A 与片外片外 RAMRAM传送 MOVC 目标,源 ; 累加器与 ROMROM 传送
通用数据通用数据传送指令传送指令 XCH 第一操作数,第二操作数 ; 字节交换 XCHD 第一操作数,第二操作数 ; 半字节交换
交换指令交换指令PUSH POP
堆栈操作指令堆栈操作指令
( 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 机器码的构机器码的构成成
( 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。。
例: 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 ;直接寻址
( 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 口口。
例: 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 个字节范围内的代码或常数,称近程查表近程查表。
无符号数相加无符号数相加
例: 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
例:对 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 字节 )
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. 交换指令(分字节交换、半字节交换两种)
( 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)
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)。
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 码加法。码加法。
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
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 不变)不变)
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 位不变。
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)
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 为双字节指令 )
该指令操作码的形成:
本指令对应 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 单元
② 绝对长转移指令 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
④ 间接转移指令 (散转指令 )—— 单字节指令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 ;散转到命令键入口
例: 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 个子程序首址
② 比较转移指令 (对无符号数)(对无符号数) 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 转移
例:例:设 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
③ 循环转移指令 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输出高电平
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
② 长调用指令 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
位操作包括:位操作包括:位传送、位状态控制、位逻辑操作、位条件转移等 .进行位操作时:进行位操作时: 位累加器 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 中的第四位。中的第四位。
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 为端为端口中的某一位时,具口中的某一位时,具有“读-改-写” 功有“读-改-写” 功能。能。
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
例:例:如图示组合逻辑电路+
P1.0P1.1 P1.2
MOVC, P1.0
ORL C, /P1.1
CPL CMOV
P1.2, C
例:例:设变量 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
例例 :: 在片内 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
地址 机器码
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 )补
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 单元中。程序:
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。
例例 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
例:搜索最大值。例:搜索最大值。从片内 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 ;完存大数
例: 排序。例: 排序。将片内 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