Presentation is loading. Please wait.

Presentation is loading. Please wait.

第3章 指令系统及程序设计举例 3.1 指令格式与寻址方式 一、指令格式 1. 指令 操作码 目标操作数,源操作数

Similar presentations


Presentation on theme: "第3章 指令系统及程序设计举例 3.1 指令格式与寻址方式 一、指令格式 1. 指令 操作码 目标操作数,源操作数"— Presentation transcript:

1 第3章 指令系统及程序设计举例 3.1 指令格式与寻址方式 一、指令格式 1. 指令 操作码 目标操作数,源操作数
3.1 指令格式与寻址方式 一、指令格式 1. 指令 操作码 目标操作数,源操作数 89C51指令系统中,有1字节、2字节或3字节指令。 1字节:其中既包含操作码、又包含操作数信息。 2字节:1个字节表示操作码,另1个字节表示操作数或操 作数地址。 3字节:1个字节表示操作码,另2个字节表示操作数。 2. 伪指令 只用来对汇编过程进行控制,汇编时不产生机器码。 (1)ORG (汇编起始命令) 格式:ORG 汇编起始地址(16位)

2 (4)DATA(数据地址赋值命令,类似于EQU) 格式: 字符名称 DATA 表达式 将表达式的值赋给字符名称,常用于在程序中定义数据地址。
例:STRING DATA 21H NUM DATA 20H MOV R0,#STRING MOV NUM,A (2)END(汇编结束命令) 格式: END (3)EQU(赋值命令) 为字符名称赋值 格式: 字符名称 EQU 数或汇编符号 (4)DATA(数据地址赋值命令,类似于EQU) 格式: 字符名称 DATA 表达式 将表达式的值赋给字符名称,常用于在程序中定义数据地址。 (5)DB/DW(定义字节、字命令) 格式: [标号:] DB(DW) [项或项表] 注意:① DB时,项或项表是一个字节或是用逗号隔开的字节串 或是在‘ ’中的ASCII 字符串。 ② DW时,项或项表的存放方式是 高8位在低地址,低8位在高地址。 见P110例。

3 二、寻址方式 (6)DS(定义存储空间命令) 从指定地址开始保留若干单元。 格式: [标号:] DS 表达式 例: ORG 1000H
DS 08H DB 30H,8AH 汇编后, (1008H)=30H,(1009H)=8AH 注意:以上的DB、DW、DS仅对程序存储器起作用,不能对数据存储器初始化。 (7)BIT(位地址符号命令) 将BIT后的位地址赋给字符名。 格式: 字符名 BIT 位地址 例: A1 BIT P ; P1口第0位的位地址 90H赋给了A1 二、寻址方式 ——寻找指令中操作数或操作数所在的地址,共有7种。

4 Reg寻址 MOV A,R0 ;R0 A Reg:R0~R7,A,B,CY,DPTR(对它们也可使用其地址) 2. 直接寻址 MOV A,3AH ;(3A)A,3AH的内容A 操作数部分是操作数所在的存储器单元的地址。 ① 片内RAM的128个存储单元 在89C51中,用直接寻址方式可访问 ② 所有的SFR(既可用地址,也可用名字) ③ 216个位地址空间 例1:MOV A,P1 例2: MOV SBUF,A MOV A,90H MOV 99H,A 此种寻址方式一般用于片内RAM和SFR。 立即寻址 MOV A,#3AH ;3AHA MOV DPTR,#2000H ; 2000H→DPTR ;(DPH)=20H 注:立即数前用‘#’,以区别地址。 ;(DPL)=00H

5 REG间接寻址 MOV A,@R0 ;若R0内容为65H, (65H) A。
(1) R0、R1为间接REG,寻址片内128字节的低位地址RAM 或片外RAM低地址的256个单元。 (2) DPTR为间接REG,寻址片外RAM 64KB。 (PUSH、POP) 寻址片内RAM 简言之, 有: @R0, DPTR 寻址片外RAM 此种寻址方式一般用于数据存储器(RAM)。 5. 变址寻址 只能用于访问程序存储器(ROM),从中取数。 以某个REG内容为基地址,然后加上地址偏移量以形成操作数地址。 在89C51中,用DPTR或PC作为变址REG(基地址),地址偏移量放在A中。 即:操作数地址=(A)+(DPTR),或=(A)+(PC)

6 例: MOVC A,@A+DPTR ;((A)+(DPTR))A
MOVC ;((A)+(PC))A 6. 相对寻址(ROM) ——只出现在相对转移指令中 相对偏移量的计算(以2字节指令为例): rel=(目标地址—源地址—2)补 相对转移指令执行时,是以当前PC(程序计数器)的值加上指令中规定的偏移量rel而形成实际的转移地址。 例:JC rel ;rel=75H 当指令JC被取出时,PC值已在原地址 上加2,这时程序转移到当前的PC+rel地址去执行,即转去当前PC+75H。

7 7. 位寻址(属于直接寻址) ——操作数中给出的是位地址,即片内RAM某一单元中的一位。 包括 ① 20H~2FH 的128个位单元地址00H~07FH ② 地址能被8整除的SFR 位地址常用 几种方式表示 ① 直接使用位地址:00H~07FH ② 寄存器名+位数: PSW.3 ③ 位名称 例:CLR bit (即:CLR 90H)

8 三、寻址空间及符号注释 1. 操作数寻址方式和有关空间 寻址方式 寻址空间 立即数寻址 程序存储器ROM 直接寻址
1. 操作数寻址方式和有关空间 寻址方式 寻址空间 立即数寻址 程序存储器ROM 直接寻址 片内RAM低128字节,特殊功能寄存器SFR,位地址空间 寄存器寻址 工作寄存器R0~R7,A,B,Cy,DPTR 寄存器间接寻址 片内RAM低128字节 片外RAM 变址寻址 程序存储器 相对寻址 程序存储器256字节范围(PC+偏移量) 位寻址 片内RAM的20H~2FH字节地址 部分特殊功能寄存器SFR

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

10 3.2 89C51单片机的指令系统 五大类(111条): 1. 数据传送指令: 28条 2. 算术运算指令:24条
1. 数据传送指令: 28条 算术运算指令:24条 3. 逻辑运算及移位:25条 控制转移指令:17条 5. 位操作指令: 条 一、数据传送指令 格式:MOV 目标,源 ;片内数据传送 MOVX 目标,源 ;累加器A与片外RAM传送 MOVC 目标,源 ;累加器与ROM传送 通用数据 传送指令 XCH 第一操作数,第二操作数 ;字节交换 XCHD 第一操作数,第二操作数 ;半字节交换 交换指令 PUSH POP 堆栈操作指令

11 片内数据传送(片内RAM区中的工作寄存器 Rn, A ,
片内数据RAM, SFR之间) (1)以累加器A为目的操作数 ① MOV A,Rn ;ARn,Rn:R0~R7,寄存器寻址。 ② MOV A,direct ;A(direct),direct:8位片内RAM地 址(256B范围内),直接寻址。 ③ MOV ;A(Ri),R0或R1所指片内RAM (128B范围内),寄存器间接寻址 。 ④ MOV A,#data ;Adata,立即数data:00H~FFH (2)以寄存器Rn为目的的操作数(见P44 例) ① MOV Rn,A ; RnA,Rn:R0 ~R7,寄存器寻址。 ② MOV Rn, direct ; Rn( direct),直接寻址。 ③ MOV Rn,#data ;Rndata,立即寻址 注: ①无 MOV Rn,Rn 指令; ② P58 机器码的构成

12 (3)以直接地址为目的操作数 ① MOV direct,A ; (direct)A, Reg寻址 ② MOV direct,Rn ; (direct)Rn, Reg寻址 ③ MOV direct, direct ; (direct)(direct),直接寻址 ④ MOV ; (direct)(Ri), Reg间接寻址 ⑤ MOV direct,#data ; (direct)data,立即寻址。 注意:将指令译成机器码时,第2、3字节的内容顺序。P59,P60。 (4)以间接地址为目的的操作数 ① ;(Ri)A, Reg 寻址 ② ;(Ri)(direct),直接寻址 ③ ;(Ri)data,立即寻址 例:MOV A,#74H ;A=74H MOV 74H,#00H ;(74H)=00H MOV A,74H ; A=00H

13 例:MOV R0,#77H ;R0=77H MOV A,#03H ; A=03H ;( R0)=03H,即(77H)=03H. (5)16位数据传送指令 MOV DPTR,#data ;data为16位立即数。 DPHdataH, DPLdataL 低位字节dataL 高位字节dataH OP CODE 例:MOV DPTR,#2000H 例: ① MOV R0,#20H MOV @R0,#data  ;MOV 20H,#data ② MOV P1,#80H ;立即寻址 ③ MOV P3,P1 ;直接寻址

14 ④ MOV R1,#82H MOV )。 欲从82H取数到A,可使用:MOV A,82H 2. 累加器A与片外RAM间(或I/O口)间的数据传送 (1)利用Ri间接寻址,可以在256字节范围内寻址。 ① MOVX ;A(Ri) ② MOVX @Ri,A ;(Ri)A 注:这时,RAM地址 在Ri中由P0口送出,P2 口仍可用作I/O口。 (2)利用DPTR16位Reg间接寻址,可以在64KB范围内寻址。 ① MOVX ;A(DPTR) ② MOVX @DPTR,A ;(DPTR)A 注: 每次传送8位数据

15 例: MOV DPTR,#0650H ;将0650H单元的8bit
MOVX ;数据送入A。 注: 因为外部的RAM与I/O端口是统一编址的,89C51指令系统中无单独的IN、OUT端口操作指令,所以指令中的8位或16位地址,可能是RAM地址,也可能是I/O端口地址。 无符号数相加 3. 累加器A与ROM之间的数据传送 ① MOVC ;A(A+(DPTR)),变址寻址方式。 ② MOVC ; A(A+PC), PC为新PC,变址寻址。 其中: ① 以(DPTR)为基址Reg,A为偏移量,可以查找到(DPTR)以后的256个字节范围内的代码或常数。因为(DPTR)的内容可在64 K范围内变化,故此种查表称为远程查表。 ② 以当前PC为基址,A为偏移量,可以查找当前指令所在地址以后的256个字节范围内的代码或常数,称近程查表。

16 例: MOV A,#06H MOV DPTR,#2000H MOVC A,@A+DPTR …… A 例:
XXH 2000H 2006H …… A 例: (2字节) 1000H:MOV A,#30H (1字节) 1002H:MOVC XXH A ////////// /////////// 1000H 1003H 1033H (1003H) 1001H 1002H

17 例:对A中的BCD码,用查表法查得相应的ASCII码。
1. 用PC作为基址 MOV A,#03H ;查3的ASCII码 INC A ;考虑RET的存在,修正偏移量 MOVC ;此指令取出后,PC指向RET单元 RET ;(1字节) TAB:DB 30H DB 31H DB 32H DB 33H DB 39H ;ASCII码表

18 2. 用DPTR作为基址 MOV A,#03H MOV DPTR,#TAB ;不需要修正偏移量 MOVC RET ;ASCII码表 TAB:DB 30H DB 31H DB 39H 4. 交换指令(分字节交换、半字节交换两种) (1)字节交换指令 ① XCH A,Rn ;ARn reg寻址 ② XCH A,direct ;A(direct) 直接寻址 ③ XCH ;A(Ri) 间接寻址

19 ① XCHD A,@Ri ;A0~3(Ri)0~3 ,高4位不变。 ② SWAP A ;A0~3 A4~7 ,A的高低4位互换。
(2)半字节交换指令 ① XCHD ;A0~3(Ri)0~3 ,高4位不变。 ② SWAP A ;A0~3 A4~ ,A的高低4位互换。 5. 堆栈操作指令 (1)PUSH direct ;SP+1SP,直接地址寻址的单元内容(SP) (2)POP direct ;将(SP)(direct),SP - 1 SP 注: ①单元内容为8位的; ②堆栈只能设在内RAM区; ③89C51的堆栈是向上生长的。 (direct) 例:中断服务程序中保护现场 现场:DPTR=1234H,PSW=63H,A=54H,SP=38H 3CH 3BH 3AH 39H 38H=SP PUSH DPL PUSH DPH PUSH PSW PUSH A POP A POP PSW POP DPH POP DPL 34H 12H 63H 54H

20 二、算术运算指令 1. 加法 ① ADD A,Rn ;AA+Rn ② ADD A,direct ;AA+(direct)
1. 加法 ① ADD A,Rn ;AA+Rn ② ADD A,direct ;AA+(direct) ③ ADD ;AA+(Ri) ④ ADD A,#data ;AA+data 影响标志位:进位标志CY,半进位AC,溢出OV(OV=C7 + C6), 奇偶P(A中1的个数为奇时P=1)。 A±CY ±Rn  A, 常用于多字节加、减法。 89C51 系列中没有不带借位的减法指令,需要的话,在SUBB前用CLR C指令清CY。 2. 带进(借)位加法/减法 ① ADDC/SUBB A , Rn ② ADDC/SUBB A , direct ③ ADDC/SUBB A ④ ADDC/SUBB A , #data 注:加减运算中,目标操作数只能是A。

21 3. 增/减量指令 ① INC A ;A+1A ② INC Rn ;Rn+1Rn INC direct ;(direct)+1(direct) ④ INC @Ri ⑤ INC DPTR ;DPTR+1DPTR 注:这两条指令不影响PSW。 ⑥ DEC A ⑦ DEC Rn ⑧ DEC direct ⑨ DEC @Ri 4. 十进制调整指令——完成BCD码加法运算。 DA A ;跟在ADD或ADDC后,将A中结果进行十进制调整。 注: ①必须是压缩型BCD码运算; ②只能用于BCD码加法。 5. 乘法指令(8位无符号数) MUL AB ;BAA×B ;若结果>0FFH(B中有值),OV=1,CY=0。 ;否则(B中为0) , OV=0,CY=0。

22 6. 除法指令 (8位无符号数) DIV AB ;A/B的商A,A/B的余数B 例:16位数求补(求反+1)。 设16位二进制数在R1R0中,求补结果存于R3R2中。 MOV A,R0 ;16位数低8位送A CPL A ;求反 ADD A,#01H ;加1(不用INC,因为它不影 响标志位) MOV R2,A ;存补码低8位 MOV A,R1 ;取16位数高8位 ADDC A,#00H ;加进位 MOV R3,A ;存补码高8位 以上指令编程练习见: P93~P96

23 三、逻辑操作指令 (很方便对端口的某位操作: ANL P1,00000001B P1.7~P1.1=0,P1.0不变) 1. 简单操作指令
1. 简单操作指令 ① 累加器清零 CLR A ② 累加器取反 CPL A 2. 与 ① ANL A , Rn ;A /\ RnA ② ANL A, direct ③ ANL ④ ANL A, #data ⑤ ANL direct, A ;(direct) /\ A(direct) ⑥ ANL direct,#data ;(direct) /\ # data(direct) 注: ⑤ ⑥中若直接地址为 I/O 口, 则为 “读-改-写”操作。 例: MOV A,#35H ANL A,#0FH ;屏蔽高4位,保留低4位。

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

25 5. 移位指令(仅对累加器A,见P.69) ① 循环左移: RL A ② 带进位循环左移: RLC A ③ 循环右移: RR A ④ 带进位循环右移: RR C A 例 : 拆字。将片内RAM 20H单元的内容拆成两段,每段4位。 并将它们分别存入21H与22H单元中。程序如下: ORG H START: MOV R0,#21H ;21HR0,用R0间接寻址 MOV A,20H ;(20H)A ANL A,#0FH ;A∧#0FHA MOV @R0,A ;(A)(R0) INC R0 ;R0+1R0 SWAP A ;A0~3A4~7 ANL A,#0FH ; A∧#0FH

26 四、 控制转移类指令 AJMP 1. 无条件转移 ① 绝对短转移
1. 无条件转移 ① 绝对短转移 AJMP addr11; PC+2  PC,addr11PC10~0, PC15~11不变。 转移的目标地址在AJMP指令后面指令的第一字节开始的同一2K字节范围内。如下图所示: AJMP 2KB PC PC+2 例:AJMP H AJMP K0 该指令操作码的形成: 1123H a15 a10 a8 a a0 00001 所以,AJMP 1123H 对应的机器码是2123H。( AJMP为双字节指令)

27 本指令对应8种操作码:定义每256字节为一个页面,2K的跳转范围 可分为8页(211= 2 3× 28 = 8×256),每个页面一个操作码。
A10 A9 A8 0 地址页 操作码 A7~A0 页内 0 1 H 0页 0~255单元 21H 1 页 0~255单元 41H 2 页 0~255单元 61H 3页 0~255单元 81H 4页 0~255单元 A1H 5页 0~255单元 C1H 6页 0~255单元 E1H 7页 0~255单元

28 SJMP rel ;PC+2  PC ;PC+rel  PC rel=(终地址—始地址—2 )补 注:当rel=FE时,导致无限循环。
LJMP 64KB PC PC+3 ② 绝对长转移指令 LJMP addr16 ;在64KB内转移, addr16 PC 例:LJMP H ;放在0000H中时, 上电后自动转移到2030H单元。 ③ 相对转移指令(短转移) SJMP rel ;PC+2  PC ;PC+rel  PC rel=(终地址—始地址—2 )补 注:当rel=FE时,导致无限循环。 因为 终地址 = 始地址+2+FE =PC+2-2 =PC 因此,可用如下形式指令 JMPADR:SJMP JMPADR 来代替HLT,在51单片机中无HLT。 SJMP -128 127

29 ④ 间接转移指令(散转指令)——单字节指令
;A+DPTR  PC 通常以DPTR为基地址,A为偏移量,则可实现散转功能 。 例: P75 例3-11 根据A中命令键的值,设计命令键操作程序入口跳转表。 CLR C ;清进位位 RLC A ;键值乘以2 MOV DPTR,#TAB ;DPTR指向表首址 JMP @ A + DPTR ;散转到命令键入口 双字节的命令键跳转表 TAB:AJMP SUB1 AJMP SUB2 …… AJMP SUBn

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

31 2. 条件转移类指令 ——若条件满足,则程序转向指定的目标地址。 ① 累加器A判零转移指令 JZ rel ; A=0 转移 JNZ rel ; A ≠ 0 转移 ② 比较转移指令 (对无符号数) CJNE 目的,源 ,rel ;3字节指令 源与目的字节进行比较 (目的-源),若它们的值不等,则转移,同时将Cy清0或置 1。比较操作不影响原有操作数。 rel = (终地址—始地址—3 )补 i) CJNE A,direct ,rel ;A ≠ (direct),转移 A>direct, Cy =0 A<direct,Cy = 1 ii) CJNE A ,#data,rel ;A ≠ data,转移同上。 iii) CJNE Rn,#data,rel ; Rn ≠ data,转移同上。 iv) CJNE @Ri,#data,rel ;(Ri) ≠ data,转移同上。

32 CJNE R7, #60H, K1 ;R7<60H,K1 且Cy=1 …
K1: JC K ;Cy=1,判出R7<60H  k3 K3: 例:片内RAM ONE 和 TWO 两个单元中存有两个无符号数,将两个数中小的存入30H单元。 MOV A ,ONE CJNE A,TWO ,BIG SJMP STORE BIG: JC STORE MOV A,TWO STORE: MOV 30H,A

33 i) DJNZ Rn,rel ;PC+2  PC, Rn-1Rn, ;当Rn≠0时,PC + relPC
③ 循环转移指令 i) DJNZ Rn,rel ;PC+2  PC, Rn-1Rn, ;当Rn≠0时,PC + relPC ;当Rn=0时,则结束循环,程序向下执行。 功能: (Rn - 1)不为零时转移,否则继续执行。 ii) DJNZ direct,rel ;(direct)-1,不为零时转移,否则继续执行。 例:软件延时。(在P1.7引脚上输出一个50us的脉冲) 利用DJNZ指令可在一程序中插入某些指令来实现软件延时。DJNZ执行时间为2个机器周期,这样循环1次可产生2个机器周期延时。(12M晶振时, 1个机器周期=1us。2×24+1=49us) CLR P ;P1.7输出变低电平 MOV R2 ,#18H ;1us ;赋循环初值24 HERE: DJNZ R2 ,HERE ;2us ; R2-1R2,R2不为零 循环。 SETB P ;P1.7输出高电平

34 设数组长度放R0中,数组存放首地址在R1中,数组之和则放于20H单元中(设和不超过256)。 CLR A SUMD: ADD A,@R1
例:多项单字节数求和。 设数组长度放R0中,数组存放首地址在R1中,数组之和则放于20H单元中(设和不超过256)。 CLR A SUMD: ADD INC R1 DJNZ R0,SUMD MOV 20H,A RET 数组之和 20H 数组首地址 R1 数组长度 R0 3. 调用和返回指令 ① 短调用指令 ACALL addrll ;在2K范围内调用,与AJMP相似. ;断点保护: PC+2  PC,SP+2  SP,PC进堆栈。 ;addr0~10  PC0~10 注:子程序首地址必须在ACALL指令后第一字节为起始的 2K字节范围内ROM中。

35 ② 长调用指令 LCALL addr16 ;在64K范围内调用
;断点保护: PC+3  PC,SP+2  SP,PC进堆栈。 ;addr0~15  PC ③ 返回指令 i) RET ii) RETI (从中断返回) ;恢复断点 PC 4. 空操作指令 NOP ;除PC+1外,不作其它操作。 例:利用NOP产生方波; CLR P2.7 NOP SEPB P2.7

36 五、位操作指令 位操作包括:位传送、位状态控制、位逻辑操作、位条件转移等. 进行位操作时: 位累加器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) 这四种方式都可表达PSW中的第四位。

37 1. 位传递 ① MOV C,bit ; C ( bit ),bit是位地址,直接寻址 ② MOV bit,C ; ( bit )  C 当 bit 为00H~7FH,位地址在片内RAM中共128位; bit 为80H~FFH,位地址在11个SFR中。 (如:4个8位的并行I/O口,每位均可单独进行寻址。) 2. 位状态控制指令 ① 位清0 CLR C ;0C CLR bit ;0(bit) ② 位置1 SETB C ;1C SETB bit ;l(bit) ③ 位取反 CPL C ;/CC CPL bit ;/bitbit 当直接地址 bit 为端口中的某一位时,具有“读-改-写” 功能。 例:SETB P1.7 ;将P1.7位 置1 CLR 2AH ;2AH为25H单元中的第2位地址 ;设(25H)= B,此指令将 (25H)变为 B。

38 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) C 4. 位条件转移指令(相对转移) ① 判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, 则顺序执行 偏移量=(目标地址-源地址-指令字节数)补 P82

39 例:如图示组合逻辑电路 + P1.0 P1.1 P1.2 MOV C,P1.0 ORL C,/P1.1 CPL C MOV P1.2,C

40 例:设变量X存在VAR单元中,函数值y存放在FUNC中,按下式给y赋值。
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,-1A SJMP COMP POSI: MOV A,#01H COMP: MOV FUNC,A

41 例: 在片内RAM 40H~4FH 中置初值 A0H~AFH,再将其内容依次传送到片外RAM 0800H 为起始地址的16个单元中。
04 DAFB 7840 900800 在RAM内置初值 ORG 0000H RESET: AJMP MAIN ORG 003FH MAIN: MOV R0,#40H MOV R2,#10H MOV A,#A0H A1: INC R0 INC A DJNZ R2,A1 MOV R0,#40H MOV DPTR,#0800H 地址 机器码

42 将内RAM中40H~4FH的内容依次送到外RAM中以0800H为起始地址的16个单元中。 7A10 0051 E6 F0 08 A3
MOV R2,#10H A2: MOV MOVX @DPTR,A INC R0 INC DPTR DJNZ R2,A2 HERE: SJMP HERE 将内RAM中40H~4FH的内容依次送到外RAM中以0800H为起始地址的16个单元中。 7A10 E6 F0 08 A3 DAFA FE 地址 机器码 相对偏移量的计算: FBH=(0045H-0048H-2)补=(-5)补 FAH=(0051H-0055H-2)补=(-6)补 FEH=(0057H-0057H-2)补=(-2)补

43 指令系统举例: 例1. 设两位用ASCII码表示的数分别保存在40H、41H单元中,将其转换为两位BCD数,并以压缩形式存入40H单元中。
程序: ANL 40H, #0FH ;40H的ASCII码变为BCD码。 MOV A, 41H ANL A, #0FH ;41H的ASCII码变为BCD码。 RL A ;A的内容左移4次 RL A RL A ;左移4次, 或使用 SWAP A ORL 40H, A ;结果存在40H单元中。

44 例3. 两个无符号数存于20H、21H单元中,比较他们的大小, 将大数A。
例2. P1.0 P1.1 P1.2 P1.3 LED1 LED2 +5v K1 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 因为“0”亮, 所以不能用MOV。 Ki闭合  LEDi亮 例3. 两个无符号数存于20H、21H单元中,比较他们的大小, 将大数A。 MOV A,20H CJNE A,21H,L1 SJMP L2 L1: JNC L2 MOV A,21H L2: RET ;A中为大数

45 例4. 20H~25H单元中存放着单字节无符号数,求和并存于
CLR C MOV R0,#20H MOV R1,#00H ;高字节和 MOV R2,#05H ;数组长度-1 MOV A, @R0 INC R0 L1: ADD ;求和 JNC L2 INC R1 L2: INC R0 DJNZ R2,L1 MOV 26H,A MOV 27H,R1 RET

46 例:搜索最大值。从片内RAM的BLOCK单元开始有一个无符号
数据块,其长度存于LEN单元中,试求出其中最大的。 LEN DATA 20H MAX DATA 21H BLOCK DATA 22H CLR A MOV R2,LEN ;数据块长度R2 MOV R1,#BLOCK ;置地址指针 LOOP: CLR C SUBB ;用减法做比较 JNC NEXT ;无借位A大 MOV ;否则大者送A SJMP NEXT1 NEXT: ADD ;A大恢复A NEXT1: INC R1 ;修改地址指针 DJNZ R2,LOOP ;未完继续 MOV MAX,A ;完存大数

47 QUE: CLR 00H :清除交换标志 MOV R3,#9H ;循环次数 MOV R0,#50H ;存放区首址 MOV ;取前数 L2: INC R0 MOV R2,A ;保存前数 SUBB ;前数减后数 MOV A,R2 ;恢复前数 JC L1 ;顺序,继续比较 SETB 00H ;逆序,建立标志 XCH A ;前后数交换 DEC R0 XCH A INC R0 ;指向后数单元 L1: MOV DJNZ R3,L2 ;依次重复比较 JB 00H,QUE ;交换后重比较 RET 例: 排序。 将片内RAM 区50H~59H 中的数据按 从小到大的 次序排列。


Download ppt "第3章 指令系统及程序设计举例 3.1 指令格式与寻址方式 一、指令格式 1. 指令 操作码 目标操作数,源操作数"

Similar presentations


Ads by Google