- 25
- 0
- 约1.63万字
- 约 47页
- 2017-02-06 发布于天津
- 举报
直接寻址
第3章 指令系统及程序设计举例 ② 比较转移指令 (对无符号数) CJNE 目的,源 ,rel ;3字节指令 源与目的字节进行比较 (目的-源),若它们的值不等,则转移,同时将Cy清0或置 1。比较操作不影响原有操作数。 rel = (终地址—始地址—3 )补 i) CJNE A,direct ,rel ;A ≠ (direct),转移 Adirect, Cy =0 Adirect,Cy = 1 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 转移 例:设 R7=56H, 执行指令 CJNE R7, #60H, K1 ;R760H,?K1 且Cy=1 … K1: JC K3 ;Cy=1,判出R760H ? 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-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输出高电平 3. 调用和返回指令 ① 短调用指令 ACALL addrll ;在2K范围内调用,与AJMP相似. ;断点保护: PC+2 ? PC,SP+2 ? SP,PC进堆栈。 ;addr0~10 ? PC0~10 注:子程序首地址必须在ACALL指令后第一字节为起始的 2K字节范围内ROM中。 例:多项单字节数求和。 设数组长度放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) RET ii) RETI (从中断返回) ;恢复断点? PC 4. 空操作指令 NOP ;除PC+1外,不作其它操作。 例:利用NOP产生方波; CLR P2.7 NOP NOP NOP NOP SEPB
原创力文档

文档评论(0)