《指令系统控制程序转移类指令new下.ppt》由会员分享,可在线阅读,更多相关《指令系统控制程序转移类指令new下.ppt(34页珍藏版)》请在三一文库上搜索。
1、3.3.4 控制程序转移类指令,包括以下类型: 无条件转移和条件转移 相对转移和绝对转移 长转移和短转移 调用与返回指令,重点、难点:“JMP、CJNE、DJNZ”指令。,3.3.4 控制程序转移类指令,1.无条件转移指令 短转移类指令: AJMP addr11 ;先(PC)+2PC,后addr11 PC100,( PC1511 )不变 程序转移范围:2KB的程序存储器地址空间。 2字节指令,例:1030H:AJMP 0010000 0000B 问:转移的地址是多少?,解: addr = 001 00 00 0000 B 先(PC)+2=1030H+2=1032H= 0001 0 000 00
2、11 0010 B 后: ( PC1511 )不变,PC100= 0001 0 001 00 00 0000 B=1100H 即执行该指令后,将转至地址为:1100H处。,3.3.4 控制程序转移类指令,长转移指令 LJMP addr16 ;addr16PC。 3字节指令 指令中:第二字节装入PC的高8位,第三字节装入PC的低8位。 程序转移范围:64KB的程序存储器地址空间。,例: 1023H: LJMP 212AH (PCH)=21H,(PCL)=2AH。 机器码为:02 21 2AH。,3.3.4 控制程序转移类指令,相对转移指令 SJMP rel ;先(PC)+2PC,后(PC)+re
3、l PC ;2字节指令 程序转移范围:256B.,手工编程时,需计算偏移量rel: rel机器码的相对偏移量,为8位补码。 转移范围:-128+127字节。,即:rel为正数时,范围为:0+127 (00H7FH)。 rel为负数时,范围为:-128-1(80HFFH)。,相对转移指令“SJMP rel”,例如: 0100H:SJMP rel 设转移的地址为0157H,则: rel=0157H-0100H-2=55H。故该指令可写成: 0100H:SJMP 55H 其机器码为: 80H 55H,正向跳转时: rel目的地址源地址-2 =地址差-2。,0157H,反向跳转时: rel目的地址源地
4、址-2补 = -2补-|地址差| =FEH-|地址差|,例如: 0100H:SJMP rel 设程序转移的地址为:00F8H, 则地址偏移量rel为: rel=FEH - | 0100H-00F8H| =FEH-0008H =F6H。 故该指令可写成: 0100H:SJMP F6H 其机器码为: 80H F6H,00F8H,编程时,可用标号代替转移目的地址, rel 交给编译程序计算。 例如: SJMP NEXT NEXT: ,原地踏步指令的指令: HERE: SJMP HERE 常写成: SJMP $,总结 短转移类指令:AJMP addr11 长转移类指令:LJMP addr16 相对转移
5、指令:SJMP rel 这三条指令,可理解成:PC值改变,即跳转到一个标号处。 它们的区别: 跳转的范围不同(2KB;64KB ;-128+127 )。 指令构成不同。 AJMP、LJMP后跟的是绝对地址, 而SJMP后跟的是相对地址。 指令长度不同(2字节;3字节;2字节)。 原则上,所有用SJMP或AJMP的地方都可以用LJMP来替代。,均可用标号表示,3.3.4 控制程序转移类指令,间接转移指令(散转指令) JMP A+DPTR ;(A)+(DPTR)PC。 1字节指令 使用该指令前,应先给DPTR赋值,A中的内容为无符号数。 转移范围:256B. 该指令多用于多分支程序结构中。,P75
6、.例3-11根据累加器A中命令键的键值,设计命令健操作程序入口跳转表。,例如:当(A)=2时,程序跳转到标号为“XX2”的程序中。,3.3.4 控制程序转移类指令,2. 空操作 NOP ;(PC)+1PC。 1字节指令,3. 条件转移类指令 条件转移指令是指在满足一定条件时进行相对转移,否则程序 继续执行本指令的下一条指令。,3.3.4 控制程序转移类指令,判A内容是否为0转移指令 JZ rel ;(PC)+2PC。若A=0,则转移到(PC)=(PC)+rel; ; 否则顺序执行。 JNZ rel ;(PC)+2PC。若A0,则转移到(PC)=(PC)+rel ; ;否则顺序执行。 在编写汇编
7、语言源程序时,可以直接写成: JZ 标号 ;即转移到标号处。例如: JZ LOOP,以上两条指令均为:2字节指令,判A内容是否为0转移指令,例: MOV A,R0 JZ L1 MOV R1,#00H AJMP L2 L1: MOV R1,#0FFH L2: SJMP L2 END 问:如果执行程序前(R0)=0,执行上述程序后,(R1)=?;若执行程序前(R0)0,则(R1)=?。,解:如果(R0)=0,结果(R1)=0FFH; 而若(R0)0,则结果是(R1)=00H。,3.3.4 控制程序转移类指令,比较(不相等)转移指令 CJNE (目的字节),(源字节),rel ;3字节指令 CJNE
8、 A,#data,rel CJNE A,direct,rel CJNE Rn,#data,rel CJNE Ri,#data,rel,同样地,使用时,可以将rel理解成标号,即: CJNE A,#data, 标号 CJNE A,direct,标号 CJNE Rn,#data,标号 CJNE Ri,#data,标号,比较(不相等)转移指令, CJNE A,#data,rel ;先(PC)+3PC 若(A)#data,则(PC)+relPC,且0CY; 若(A)#data,则(PC)+relPC,且1CY; 若(A)=#data,则顺序执行,且0CY。, CJNE A,direct,rel ;先(
9、PC)+3PC 若(A)(direct),则(PC)+relPC,且0CY; 若(A)(direct),则(PC)+relPC,且1CY; 若(A)= (direct),则顺序执行,且0CY。, CJNE Rn,#data,rel ;先(PC)+3PC 若(Rn) #data,则(PC)+relPC,且0CY; 若(Rn) #data,则(PC)+relPC,且1CY; 若(Rn)= #data,则顺序执行,且0CY。,比较(不相等)转移指令, CJNE Ri ,#data,rel ;先(PC)+3PC 若(Ri) #data,则(PC)+relPC,且0CY; 若(Ri) #data,则(P
10、C)+relPC,且1CY; 若(Ri)= #data,则顺序执行,且0CY。,比较(不相等)转移指令,利用这些指令,可以判断两数是否相等。 但有时还想得知两数比较之后哪个大,哪个小,本条指令也 具有这样的功能: 如果两数不相等,则CPU还会用CY(进位位)来反映哪个数 大,哪个数小。如果前面的数大,则CY=0,否则CY=1。 因此在程序转移后再次利用CY就可判断出哪个数大,哪个数小 了。,循环转移指令(减1不为0转移指令),DJNZ Rn,rel ;先(PC)+2PC,(Rn)-1Rn, 若(Rn) 0,则(PC)+relPC, 若(Rn)=0,则结束循环,程序往下执行。 DJNZ dire
11、ct,rel ;先(PC)+3PC,(direct)-1 direct ; 若(direct) 0,则(PC)+relPC; 若(direct)=0,则结束循环,程序往下执行。,例: MOV 23H,#0AH CLR A LOOP: ADD A,23H DJNZ 23H,LOOP SJMP $ 问:上述程序段的执行过程是怎样的?,执行过程是: 将23H单元中的数连续相加,保存至A中,每加一次,23H单元中的数值减1,直至减到0,共加0AH次。,调用和返回指令,主程序,A,第1次调用,RET,子程序ADM1,B,返回1,第2次调用,返回2,C,D,主程序调用子程序返回过程示意图,断点,断点,调用
12、和返回指令,短调用指令 ACALL addr11 ; 2字节指令 操作: 先:(PC)+2PC,(SP)+1 SP 后:(PC70) (SP) (SP)+1 SP (PC158) (SP) addr 100 (PC100) (PC1511)不变,断点值压入堆栈,编程时,可用标号代替转移目的地址,addr11,addr16交给编译程序计算。,长调用指令 LCALL addr16 ;3字节指令 操作: 先:(PC)+3PC,(SP)+1 SP 后:(PC70) (SP) (SP)+1 SP (PC158) (SP) addr 150 (PC),断点值压入堆栈,目的地址,目的地址,进栈: 先压入低8
13、位地址, 后压入高8位地址。,调用和返回指令,子程序返回指令 RET ;1字节指令 操作: 先: (SP) PC158 ,弹出断点的高8位。 后: (SP)-1 SP (SP) PC70 ,弹出断点的低8位。 (SP)-1 SP。,出栈: 先弹出高8位地址, 后弹出低8位地址。,中断返回指令 RETI ;1字节指令 操作: 先: (SP) PC158 ,弹出断点的高8位。 后: (SP)-1 SP (SP) PC70 ,弹出断点的低8位。 (SP)-1 SP。,RETI指令除了具有RET指令的功能实现程序返回外,还有对中断优先级状态触发器的清零。,例3-12,设(SP)=40H,符号地址“SU
14、BRTN”指向ROM的5678H,执行指令: 0123H: LCALL SUBRTNS 执行完指令后(PC)+3=0123H+3=0126H。将该PC的内容压入堆栈: 向(SP)+1=40H+1=41H中压入26H,向(SP)+1=41H+1=42H压入01H, 此时(SP)=42H。而地址SUBRTN=5678H送入PC,程序转去执行以 5678H为首地址的子程序。,3.3.5 位操作(布尔处理)类指令,MCS-51单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集,包括位变量传送、逻辑运算、控制程序转移等指令。 在进行位处理时, CY用作“位累加器”。 在MC
15、S-51 中,有一部份RAM和一部份SFR是具有位寻址功能的。 位操作区:内部RAM的20H-2FH这16个字节单元,即128个位单元(位地址空间位007FH); 可以位寻址的特殊功能寄存器:89C51中有一些SFR是可以进行位寻址的,这些SFR的特点是其字节地址均可被8整除, 如A累加器,B寄存器、PSW、IP(中断优先级控制寄存器)、 IE(中断允许控制寄存器)、SCON(串行口控制寄存器)、TCON(定时器/计数器控制寄存器)、P0P3(I/O端口锁存器)。,位地址表达方式,以PSW中位4( RS1 )为例。 直接(位)地址方式:如 D4H; 点操作符号方式:如 PSW.4,D0H.4;
16、 位名称方式:如 RS1; 用户定义名方式:如用伪指令 bit SUB.REG bit RS1 定义后,可用SUB.REG代替RS1。,1. 位传送指令,MOV C,bit ;(bit) C。 2字节指令 MOV bit,C ;(C) bit。 2字节指令,例:MOV C,P1.0 ;将P1.0的状态送给C。 MOV P2.0,C ;将C中的状态送到P2.0,引脚上去。,2. 位修正指令,位清0指令 CLR C ;使CY=0。 1字节指令 CLR bit ;0bit。 2字节指令,例:CLR P1.0 ;即使P1.0变为0,位置1指令 SETB C ; 1 CY。 1字节指令 SETB bit
17、 ;1bit 。 2字节指令,2. 位修正指令,位取反指令 CPL C ;(C)C, 1字节指令 CPL bit ;(bit) bit。 2字节指令,3. 位逻辑运算指令 位逻辑“与”指令 ANL C, bit ;(C) (bit)C。 2字节指令 ANL C, /bit ;(C) (bit) C。 2字节指令,注意:指定的位地址中的值本身并不发生变化。,例:ANL C,/P1.0,3. 位逻辑运算指令,位逻辑“或”指令 ORL C, bit ;(C) (bit)C。 2字节指令 ORL C, /bit ;(C) (bit)C。 2字节指令,4.位条件转移类指令 判Cy转移指令 JC rel
18、;先(PC)+2PC;后:若(CY)=1,则转移。否则顺序执行 JNC rel ;先(PC)+2PC;后:若(CY)=0,则转移。否则顺序执行,(PC)+relPC,(PC)+relPC,上面两条指令均为:2字节指令。,4.位条件转移类指令,判位变量转移指令 JB bit,rel ;(PC)+3PC; 若(bit)=1,则(PC)+rel PC;否则顺序执行。 JNB bit,rel ; (PC)+3PC; 若(bit)=0,则(PC)+rel PC;否则顺序执行。 JBC bit,rel ; (PC)+3PC; 若(bit)=1,则(PC)+rel PC,且0bit; 否则顺序执行。,上面三
19、条指令均为:3字节指令。,例: MOV A,R0 CJNE A,#10H,L1 MOV R1,#0 AJMP L3 L1: JC L2 MOV R1,#0AAH AJMP L3 L2: MOV R1,#0FFH L3: SJMP L3 问:本程序执行前,如果R0的内容分别为:=10H,10H,10H,则执行上 述程序后,R1的内容是什么?,解:如果R0=10H,则R1=00H; 如果R010H,则R1=0AAH; 如果R010H,则R1=0FFH。,;如R0=10H,则不转移R1=00H; ;如CY=1即 R010H,则转移,例:,如图所示:P3.2和P3.3上各接有一只按键,要求它们分别按 下时(P3.2=0或P3.3=0),分别使P1口为0或FFH。试编写程序。,思考题:,如图所示,开关K1和K2未按下 时,两只发光二极管均不亮。当 按下K1时,使发光二极管LED1 亮,而发光二极管LED2不亮;当 按下K2时,LED2亮而LED1不亮。 试编写程序实现上述功能。,本 章 完,
链接地址:https://www.31doc.com/p-2716776.html