1 / 47

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

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

skyla
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 例: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 P1.0 ; P1口第0位的位地址 90H赋给了A1 二、寻址方式 ——寻找指令中操作数或操作数所在的地址,共有7种。

  4. 在89C51中,用直接寻址方式可访问 • Reg寻址 MOV A,R0 ;R0 A • Reg:R0~R7,A,B,CY,DPTR(对它们也可使用其地址) 2. 直接寻址 MOV A,3AH ;(3A)A,3AH的内容A 操作数部分是操作数所在的存储器单元的地址。 ① 片内RAM的128个存储单元 ②所有的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。 操作数地址放在某个REG中,规定: (1) R0、R1为间接REG,寻址片内128字节的低位地址RAM 或片外RAM低地址的256个单元。 (2) DPTR为间接REG,寻址片外RAM 64KB。 @R0, @R1,SP (PUSH、POP) 寻址片内RAM 简言之, 有: @R0, @R1, @ 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,@A+PC ;((A)+(PC))A 6. 相对寻址(ROM) ——只出现在相对转移指令中 相对偏移量的计算(以2字节指令为例): rel=(目标地址—源地址—2)补 相对转移指令执行时,是以当前PC(程序计数器)的值加上指令中规定的偏移量rel而形成实际的转移地址。 例:JC rel ;rel=75H 当指令JC被取出时,PC值已在原地址 上加2,这时程序转移到当前的PC+rel地址去执行,即转去当前PC+75H。

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

  8. 三、寻址空间及符号注释 1. 操作数寻址方式和有关空间

  9. 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)((×))由×指出的地址单元中的内容

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

  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 ;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 ; (direct)(Ri), Reg间接寻址 ⑤ MOV direct,#data ; (direct)data,立即寻址。 注意:将指令译成机器码时,第2、3字节的内容顺序。P59,P60。 (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

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

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

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

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

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

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

  19. (2)半字节交换指令 ①XCHD A,@Ri ;A0~3(Ri)0~3 ,高4位不变。 ② SWAP A ;A0~3 A4~7 ,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 PUSH DPL PUSH DPH PUSH PSW PUSH A … … POP A POP PSW POP DPH POP DPL 3CH 3BH 3AH 39H 38H=SP 54H 63H 12H 34H

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

  21. 3. 增/减量指令 • ① INC A ;A+1A • ② INC Rn ;Rn+1Rn • INC direct ;(direct)+1(direct) • ④INC @Ri ;@Ri+1@Ri • ⑤ INC DPTR ;DPTR+1DPTR ⑥ DEC A ⑦ DEC Rn ⑧ DEC direct ⑨ DEC @Ri 注:这两条指令不影响PSW。 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位 CPL A ;求反 ADDC A,#00H ;加进位 MOV R3,A ;存补码高8位 以上指令编程练习见: P93~P96

  23. (很方便对端口的某位操作: ANL P1,00000001B P1.7~P1.1=0,P1.0不变) 三、逻辑操作指令 1. 简单操作指令 ① 累加器清零 CLR A ② 累加器取反 CPL A 2. 与 ① ANL A , Rn ;A /\ RnA ② ANL A, direct ③ ANL A, @Ri ④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 A,@Ri ④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 A,@Ri ④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 2000H 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 MOV A,20H ;(20H)A SWAP A ;A0~3A4~7 ANL A,#0FH ; A∧#0FH MOV @R0,A ;(A)(R0)

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

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

  28. PC LJMP 64KB PC+3 -128 SJMP 127 ② 绝对长转移指令 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 因此,可用如下形式指令 JMPADR:SJMP JMPADR 来代替HLT,在51单片机中无HLT。

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

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

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

  32. 例:设 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 ,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 ;当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 P1.7 ;P1.7输出变低电平 MOV R2 ,#18H ;1us ;赋循环初值24 HERE: DJNZ R2 ,HERE ;2us ; R2-1R2,R2不为零 循环。 SETB P1.7 ;P1.7输出高电平

  34. 例:多项单字节数求和。 设数组长度放R0中,数组存放首地址在R1中,数组之和则放于20H单元中(设和不超过256)。 CLR A SUMD: ADD A,@R1 INC R1 DJNZ R0,SUMD MOV 20H,A RET R0 数组长度 R1 数组首地址 20H 数组之和 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 NOP NOP 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. 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 为端口中的某一位时,具有“读-改-写” 功能。 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口,每位均可单独进行寻址。) 例:SETB P1.7 ;将P1.7位 置1 CLR 2AH ;2AH为25H单元中的第2位地址 ;设(25H)=00110100B,此指令将 (25H)变为00110000B。

  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. 例:如图示组合逻辑电路 MOV C,P1.0 ORL C,/P1.1 CPL C MOV P1.2,C + P1.1 P1.2 P1.0

  40. 例:设变量X存在VAR单元中,函数值y存放在FUNC中,按下式给y赋值。例:设变量X存在VAR单元中,函数值y存放在FUNC中,按下式给y赋值。 1 X > 0 0 X = 0 -1 X < 0 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. ORG 0000H RESET: AJMP MAIN ORG 003FH MAIN: MOV R0,#40H MOV R2,#10H MOV A,#A0H A1: MOV @R0,A INC R0 INC A DJNZ R2,A1 MOV R0,#40H MOV DPTR,#0800H 地址 机器码 0000 013F 003F 7840 7A10 74A0 0045 F6 08 04 0048 DAFB 7840 900800 在RAM内置初值 例: 在片内RAM 40H~4FH 中置初值 A0H~AFH,再将其内容依次传送到片外RAM 0800H 为起始地址的16个单元中。

  42. 地址 机器码 MOV R2,#10H A2: MOV A,@R0 MOVX @DPTR,A INC R0 INC DPTR DJNZ R2,A2 HERE: SJMP HERE 7A10 0051 E6 F0 08 A3 0055 DAFA 0057 80FE 将内RAM中40H~4FH的内容依次送到外RAM中以0800H为起始地址的16个单元中。 相对偏移量的计算: 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 RL A ;左移4次, 或使用 SWAP A ORL 40H, A ;结果存在40H单元中。

  44. +5v K1 P1.0 P1.1 P1.2 P1.3 K2 LED1 +5v +5v LED2 因为“0”亮, 所以不能用MOV。 例2. LOOP: MOV A,#03H ORL P1,A ; 1 P1 MOV A,P1 ; P1输入 RL A RL A MOV P1,A CALL DELAY AJMP LOOP 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单元中存放着单字节无符号数,求和并存于 27H、26H单元。 CLR C MOV R0,#20H MOV R1,#00H ;高字节和 MOV R2,#05H ;数组长度-1 MOV A, @R0 INC R0 L1: ADD A,@R0 ;求和 JNC L2 INC R1 L2: INC R0 DJNZ R2,L1 MOV 26H,A MOV 27H,R1 RET

  46. 例:搜索最大值。从片内RAM的BLOCK单元开始有一个无符号例:搜索最大值。从片内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 A,@R1 ;用减法做比较 JNC NEXT ;无借位A大 MOV A,@R1 ;否则大者送A SJMP NEXT1 NEXT: ADD A,@R1 ;A大恢复A NEXT1: INC R1 ;修改地址指针 DJNZ R2,LOOP ;未完继续 MOV MAX,A ;完存大数

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

More Related