470 likes | 681 Views
第3章 指令系统及程序设计举例. 3.1 指令格式 与寻址方式. 一、指令格式. 1. 指令. 操作码 目标操作数,源操作数. 89 C51 指令系统中,有1字节、2字节或3字节指令。 1字节:其中既包含操作码、又包含操作数信息。 2字节:1个字节表示操作码,另1个字节表示操作数或操 作数地址。
E N D
第3章 指令系统及程序设计举例 3.1 指令格式与寻址方式 一、指令格式 1. 指令 操作码 目标操作数,源操作数 89C51指令系统中,有1字节、2字节或3字节指令。 1字节:其中既包含操作码、又包含操作数信息。 2字节:1个字节表示操作码,另1个字节表示操作数或操 作数地址。 3字节:1个字节表示操作码,另2个字节表示操作数。 2. 伪指令 只用来对汇编过程进行控制,汇编时不产生机器码。 (1)ORG (汇编起始命令) 格式:ORG 汇编起始地址(16位)
例: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例。
(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种。
在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 ;3AHA • MOV DPTR,#2000H ; 2000H→DPTR • ;(DPH)=20H • 注:立即数前用‘#’,以区别地址。;(DPL)=00H
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)
例: 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。
① 20H~2FH 的128个位单元地址00H~07FH 包括 ② 地址能被8整除的SFR ① 直接使用位地址:00H~07FH ② 寄存器名+位数: PSW.3 ③ 位名称 位地址常用 几种方式表示 7. 位寻址(属于直接寻址) ——操作数中给出的是位地址,即片内RAM某一单元中的一位。 例:CLR bit (即:CLR 90H)
三、寻址空间及符号注释 1. 操作数寻址方式和有关空间
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)((×))由×指出的地址单元中的内容
格式:MOV 目标,源 ;片内数据传送 MOVX 目标,源 ;累加器A与片外RAM传送 MOVC 目标,源 ;累加器与ROM传送 通用数据 传送指令 XCH 第一操作数,第二操作数 ;字节交换 XCHD 第一操作数,第二操作数 ;半字节交换 交换指令 PUSH POP 堆栈操作指令 3.289C51单片机的指令系统 五大类(111条): 1. 数据传送指令: 28条 2. 算术运算指令:24条 3. 逻辑运算及移位:25条 4. 控制转移指令:17条 5. 位操作指令: 17条 一、数据传送指令
片内数据传送(片内RAM区中的工作寄存器 Rn, A , • 片内数据RAM, SFR之间) (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 (2)以寄存器Rn为目的的操作数(见P44 例) ① MOV Rn,A ; RnA,Rn:R0 ~R7,寄存器寻址。 ② MOV Rn, direct ; Rn( direct),直接寻址。 ③ MOV Rn,#data ;Rndata,立即寻址 注:①无 MOV Rn,Rn 指令; ② 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,立即寻址。 注意:将指令译成机器码时,第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
(5)16位数据传送指令 MOV DPTR,#data ;data为16位立即数。 DPHdataH, DPLdataL 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 ;直接寻址
④ 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位数据
无符号数相加 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个字节范围内的代码或常数,称近程查表。
例: 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
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字节)
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 ;ARn reg寻址 ②XCH A,direct ;A(direct) 直接寻址 ③ XCH A,@Ri ;A(Ri) 间接寻址
(2)半字节交换指令 ①XCHD A,@Ri ;A0~3(Ri)0~3 ,高4位不变。 ② SWAP A ;A0~3 A4~7 ,A的高低4位互换。 5. 堆栈操作指令 (1)PUSH direct ;SP+1SP,直接地址寻址的单元内容(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
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 ;AA+Rn ② ADD A,direct ;AA+(direct) ③ ADD A,@Ri ;AA+(Ri) ④ADD A,#data ;AA+data 注:加减运算中,目标操作数只能是A。
3. 增/减量指令 • ① INC A ;A+1A • ② INC Rn ;Rn+1Rn • INC direct ;(direct)+1(direct) • ④INC @Ri ;@Ri+1@Ri • ⑤ INC DPTR ;DPTR+1DPTR ⑥ DEC A ⑦ DEC Rn ⑧ DEC direct ⑨ DEC @Ri 注:这两条指令不影响PSW。 4. 十进制调整指令——完成BCD码加法运算。 DA A ;跟在ADD或ADDC后,将A中结果进行十进制调整。 注: ①必须是压缩型BCD码运算; ②只能用于BCD码加法。 5. 乘法指令(8位无符号数) MUL AB ;BAA×B ;若结果>0FFH(B中有值),OV=1,CY=0。 ;否则(B中为0) , OV=0,CY=0。
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
(很方便对端口的某位操作: ANL P1,00000001B P1.7~P1.1=0,P1.0不变) 三、逻辑操作指令 1. 简单操作指令 ① 累加器清零 CLR A ② 累加器取反 CPL A 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 口, 则为 “读-改-写”操作。 例: MOV A,#35H ANL A,#0FH ;屏蔽高4位,保留低4位。
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位不变。
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,用R0间接寻址 MOV A,20H ;(20H)A ANL A,#0FH ;A∧#0FHA 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)
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,addr11PC10~0, PC15~11不变。 转移的目标地址在AJMP指令后面指令的第一字节开始的同一2K字节范围内。如下图所示: 例:AJMP 1123H AJMP K0 该指令操作码的形成:
本指令对应8种操作码:定义每256字节为一个页面,2K的跳转范围 可分为8页(211= 2 3× 28 = 8×256),每个页面一个操作码。
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。
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 ;散转到命令键入口
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 出口: 转移到相应的子程序入口
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 )补
例:设 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
③ 循环转移指令 i) DJNZ Rn,rel ;PC+2 PC, Rn-1Rn, ;当Rn≠0时,PC + relPC ;当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-1R2,R2不为零 循环。 SETB P1.7 ;P1.7输出高电平
例:多项单字节数求和。 设数组长度放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中。
② 长调用指令 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
五、位操作指令 位操作包括:位传送、位状态控制、位逻辑操作、位条件转移等. 进行位操作时: 位累加器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中的第四位。
2. 位状态控制指令 ① 位清0 CLR C ;0C CLR bit ;0(bit) ② 位置1 SETB C ;1C SETB bit ;l(bit) ③ 位取反 CPL C ;/CC CPL bit ;/bitbit 当直接地址 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。
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
例:如图示组合逻辑电路 MOV C,P1.0 ORL C,/P1.1 CPL C MOV P1.2,C + P1.1 P1.2 P1.0
例:设变量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,-1A SJMP COMP POSI: MOV A,#01H COMP: MOV FUNC,A
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个单元中。
地址 机器码 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)补
指令系统举例: 例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单元中。
+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中为大数
例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
例:搜索最大值。从片内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 ;完存大数
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 中的数据按 从小到大的 次序排列。