第3章指令系统控制程序转移类指令new(下)_第1页
第3章指令系统控制程序转移类指令new(下)_第2页
第3章指令系统控制程序转移类指令new(下)_第3页
第3章指令系统控制程序转移类指令new(下)_第4页
第3章指令系统控制程序转移类指令new(下)_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.3.4控制程序转移类指令包括以下类型:无条件转移和条件转移相对转移和绝对转移长转移和短转移调用与返回指令重点、难点:“JMP、CJNE、DJNZ”指令。3.3.4控制程序转移类指令1.无条件转移指令

①短转移类指令:

AJMPaddr11程序转移范围:2KB的程序存储器地址空间。

2字节指令

可用标号表示例:AJMPLOOP

…………

…………LOOP:MOVA,R2

…………但是:“LOOP”不是“addr11(11位地址)值”!!指令:”AJMPaddr11“是2字节指令

。例:1030H:AJMP00100000000B问:转移的地址是多少?解:addr11=00100000000B先(PC)+2=1030H+2=1032H=0001000000110010B

后:(PC15~11)不变,PC10~0=00010

00100000000

B=1100H即执行该指令后,将转至地址为:1100H处。3.3.4控制程序转移类指令②长转移指令

LJMPaddr16

;addr16→PC。3字节指令

指令中:第二字节装入PC的高8位,第三字节装入PC的低8位。程序转移范围:64KB的程序存储器地址空间。例:1023H:LJMP212AH(PCH)=21H,(PCL)=2AH。机器码为:02212AH。可用标号表示3.3.4控制程序转移类指令③相对转移指令SJMPrel

;先(PC)+2→PC,后(PC)+rel→PC

;2字节指令

程序转移范围:256B。★手工编程时,需计算偏移量rel:rel--机器码的相对偏移量,为8位补码。

转移范围:-128~+127字节。即:①rel为正数时,rel的范围为:0~+127(00H~7FH)。称为“正向跳转”,即往ROM中地址大的方向跳转。

rel为负数时,rel的范围为:-128~-1(80H~FFH)。称为“反向跳转”,即往ROM中地址小的方向跳转。可用标号表示③相对转移指令“SJMPrel”例如:

0100H:SJMPrel设转移的地址为0157H,则:rel=0157H-0100H-2=55H。故该指令可写成:

0100H:SJMP55H其机器码为:80H55H★正向跳转时:rel=目的地址-源地址-2

=地址差-2。0157H★反向跳转时:rel=[目的地址-源地址-2]补

=[-2]补-|地址差|

=FEH-|地址差|例如:

0100H:SJMPrel设程序转移的地址为:00F8H,则地址偏移量rel为:rel=FEH-|0100H-00F8H|

=FEH-0008H=F6H。故该指令可写成:

0100H:SJMPF6H其机器码为:80HF6H00F8H编程时,可用标号代替转移目的地址,rel交给编译程序计算。例如:SJMPNEXT

NEXT:…原地踏步指令的指令:

HERE:SJMP

HERE常写成:SJMP$总结短转移类指令:AJMPaddr11

长转移类指令:LJMPaddr16

相对转移指令:SJMPrel这三条指令,可理解成: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.☺该指令多用于多分支程序结构中。[P72.例3-11]根据累加器A中命令键的键值,设计命令健操作程序入口跳转表。例如:当(A)=2时,程序跳转到标号为“XX2”的程序中。复习:程序计数器PC程序计数器PC是16位的寄存器。PC变化的轨迹(即其地址的改变)决定程序的流向,PC的宽度(即地址值的位数)决定了程序存储器可以寻址的范围。PC的基本工作方式有:1、PC自动加1。这是最基本的工作方式,也就是这个专用寄存器被称为计数器的原因;2、执行条件或无条件指令(第3章P72-P77,P83)时,PC将被置入新的数值(地址),程序的流向发生变化。变化的方式有:1)带符号的相对转移指令“SJMP”;2)短跳转指令“AJMP”,长跳转指令“LJMP”;3)散转指令“JMP@A+DPTR”;3、在执行调用指令(第3章P79)或响应中断(第5章P113)时:硬件自动将PC的当前值,即下一条将要执行的指令的地址被送入堆栈,加以保护;同时将子程序的入口地址或者中断入口矢量地址送给PC,程序流向发生改变,程序转向去执行子程序或者中断服务程序。当子程序或中断服务程序执行完毕,遇到子程序中的最后一条返回指令“RET”或中断服务程序的最后一条指令“RETI”时,硬件自动将保护在堆栈中的内容(地址)送到PC中,程序又返回到原来的地方继续执行。3.3.4控制程序转移类指令2.空操作

NOP;(PC)+1→PC。1字节指令

3.条件转移类指令条件转移指令是指在满足一定条件时进行相对转移,否则程序继续执行本指令的下一条指令。3.3.4控制程序转移类指令⑴判A内容是否为0转移指令①

JZrel

;(PC)+2→PC。若A=0,则转移到(PC)=(PC)+rel;

;否则顺序执行。

JNZrel

;(PC)+2→PC。若A≠0,则转移到(PC)=(PC)+rel;

;否则顺序执行。在编写汇编语言源程序时,rel用“标号”来代替。如:

JZLD12354以上两条指令均为:2字节指令

均可用标号表示⑴判A内容是否为0转移指令例:MOVA,R0

JZL1

MOVR1,#00H

AJMP

L2

L1:

MOVR1,#0FFH

L2:

SJMP

L2

问:如果执行程序前(R0)=0,执行上述程序后,(R1)=?;若执行程序前(R0)0,则(R1)=?。解:如果(R0)=0,结果(R1)=0FFH;而若(R0)0,则结果是(R1)=00H。

3.3.4控制程序转移类指令⑵比较(不相等)转移指令

CJNE(目的字节),(源字节),rel;3字节指令①

CJNEA,#data,rel②

CJNEA,direct,rel③CJNERn,#data,rel④

CJNE@Ri,#data,rel同样地,使用时,可以将rel用“标号”代替,即:

CJNEA,#data,LOOP

CJNEA,direct,LQ123

CJNERn,#data,D168

CJNE@Ri,#data,RT_101⑵比较(不相等)转移指令①

CJNEA,#data,rel

;先(PC)+3→PC

若(A)>#data,则(PC)+rel→PC,且0→CY;若(A)<#data,则(PC)+rel→PC,且1→CY;若(A)=#data,则顺序执行,且0→CY。②

CJNEA,direct,rel

;先(PC)+3→PC

若(A)>(direct),则(PC)+rel→PC,且0→CY;若(A)<(direct),则(PC)+rel→PC,且1→CY;若(A)=(direct),则顺序执行,且0→CY。③

CJNERn,#data,rel

;先(PC)+3→PC

若(Rn)>#data,则(PC)+rel→PC,且0→CY;若(Rn)<#data,则(PC)+rel→PC,且1→CY;若(Rn)=#data,则顺序执行,且0→CY。⑵比较(不相等)转移指令④

CJNE@Ri,#data,rel

;先(PC)+3→PC

若((Ri))>#data,则(PC)+rel→PC,且0→CY;若((Ri))<#data,则(PC)+rel→PC,且1→CY;若((Ri))=#data,则顺序执行,且0→CY。不能写成:CJNEA,Rn,LOOP×⑵比较(不相等)转移指令利用这些指令,可以判断两数是否相等。但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能:如果两数不相等,则CPU还会用CY(进位位)来反映哪个数大,哪个数小。如果前面的数大,则CY=0,否则CY=1。因此在程序转移后再次利用CY就可判断出哪个数大(JC或JNC指令P83),哪个数小了。⑶循环转移指令(减1不为0转移指令)①

DJNZRn,rel

;先(PC)+2→PC,(Rn)-1→Rn,

若(Rn)≠0,则(PC)+rel→PC,

若(Rn)=0,则结束循环,程序往下执行。②DJNZdirect,rel

;先(PC)+3→PC,(direct)-1→direct;

若(direct)≠0,则(PC)+rel→PC;

若(direct)=0,则结束循环,程序往下执行。

rel可用“标号”代替。不能写成:DJNZA,LOOP×例:

MOV23H,#0AHCLRALOOP:ADDA,23HDJNZ23H,LOOPSJMP$问:上述程序段的执行过程是怎样的?执行过程是:将23H单元中的数连续相加,保存至A中,每加一次,23H单元中的数值减1,直至减到0,共加0AH次。在“上机实验指导书”的实验一,也使用了“DJNZ”指令,请同学仔细阅读。利用“DJNZ”指令,可进行软件延时。见教材P94【例4-8】。⑷调用和返回指令主程序A第1次调用RET子程序ADM1B返回1第2次调用返回2CD主程序调用子程序返回过程示意图断点(调用指令的下一条指令的地址)断点(调用指令的下一条指令的地址)调用指令“ACALL”或“LCALL”(第1次)调用指令“ACALL”或“LCALL”(第2次)子程序返回指令断点(地址值)由硬件自动压入堆栈保存。当主程序执行到A调用指令时,硬件自动把B指令的地址(称为断点地址)压入堆栈保存,然后把子程序的地址交给PC,从而去执行子程序。当执行到子程序的“RET”指令后,硬件又自动将堆栈的断点地址(即B地址值)弹给PC,则CPU又回到主程序去执行指令。执行子程序的“RET”指令后,硬件自动将堆栈的断点值弹出给PC。⑷调用和返回指令①短调用指令

ACALLaddr11;2字节指令

操作:先:(PC)+2→PC,(SP)+1→SP后:(PC7~0)→(SP)(SP)+1→SP

(PC15~8)→(SP)

addr10~0→(PC10~0)(PC15~11)不变断点值压入堆栈编程时,可用标号代替转移目的地址,addr11,addr16交给编译程序计算。②长调用指令LCALLaddr16

;3字节指令

操作:先:(PC)+3→PC,(SP)+1→SP

后:(PC7~0)→(SP)(SP)+1→SP

(PC15~8)→(SP)

addr15~0→(PC)断点值压入堆栈目的地址目的地址

进栈:先压入低8位地址,后压入高8位地址。⑷调用和返回指令①子程序返回指令

RET;1字节指令

操作:先:

((SP))

→PC15~8,弹出断点的高8位。

后:

(SP)-1→SP

((SP))

→PC7~0

,弹出断点的低8位。(SP)-1→SP。

出栈:先弹出高8位地址,后弹出低8位地址。②中断返回指令

RETI;1字节指令

操作:先:

((SP))

→PC15~8,弹出断点的高8位。后:

(SP)-1→SP

((SP))

→PC7~0

,弹出断点的低8位。

(SP)-1→SP。RETI指令除了具有RET指令的功能实现程序返回外,还有对中断优先级状态触发器的清零。执行返回指令(RET/RETI),退出子(或中断服务)程序,则其返回的地址来自堆栈区

复习:程序计数器PC程序计数器PC是16位的寄存器。PC变化的轨迹(即其地址的改变)决定程序的流向,PC的宽度(即地址值的位数)决定了程序存储器可以寻址的范围。PC的基本工作方式有:1、PC自动加1。这是最基本的工作方式,也就是这个专用寄存器被称为计数器的原因;2、执行条件或无条件指令(第3章P72-P77,P83)时,PC将被置入新的数值(地址),程序的流向发生变化。变化的方式有:1)带符号的相对转移指令“SJMP”;2)短跳转指令“AJMP”,长跳转指令“LJMP”;3)散转指令“JMP@A+DPTR”;3、在执行调用指令(第3章P79)或响应中断(第5章P113)时:硬件自动将PC的当前值,即下一条将要执行的指令的地址被送入堆栈,加以保护;同时将子程序的入口地址或者中断入口矢量地址送给PC,程序流向发生改变,程序转向去执行子程序或者中断服务程序。当子程序或中断服务程序执行完毕,遇到子程序中的最后一条返回指令“RET”或中断服务程序的最后一条指令“RETI”时,硬件自动将保护在堆栈中的内容(地址)送到PC中,程序又返回到原来的地方继续执行。例3-12设(SP)=40H,符号地址“SUBRTN”指向ROM的5678H,执行指令:0123H:LCALLSUBRTNS执行完指令后(PC)+3=0123H+3=0126H。将该PC的内容压入堆栈:向(SP)+1=40H+1=41H中压入26H,向(SP)+1=41H+1=42H压入01H,此时(SP)=42H。而地址SUBRTN=5678H送入PC,程序转去执行以5678H为首地址的子程序。例:如右图所示,使LED亮10ms,灭10ms,如此反复。试编写程序。软件延时时间的计算请参阅教材P94请同学们回去再做“上机实验指导书”实验二的实例。在KELL或伟福上执行“单步跟踪”操作,仔细观察当执行到“ACALL”和“RET”指令时光标是如何变化的!ABCD程序的流向:当主程序执行到A指令时,硬件自动将B指令的地址压入堆栈,然后CPU去执行标号为“DELY_10MS”的子程序,当执行到RET指令时,硬件将堆栈的断点地址值交给PC,则CPU回到主程序的B指令,再执行C指令。C指令又是一条调用指令,则CPU把D指令的地址压入堆栈,去执行子程序,执行到子程序的RET指令后CPU又回到主程序去执行D指令。请思考:如右图所示。若执行下列程序,LED1~LED8如何变化?…………L1:MOVA,#55HMOVP1,AACALLDELAY_50MS;50ms延时

CPLA;A中的内容取反后送回A中

MOVP1,AACALLDELAY_50MSAJMPL1DELAY_50MS:…………RET3.3.5位操作(布尔处理)类指令☺MCS-51单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集,包括位变量传送、逻辑运算、控制程序转移等指令。☺在进行位处理时,

CY用作“位累加器”。☺在MCS-51中,有一部份RAM和一部份SFR是具有位寻址功能的。位操作区:内部RAM的20H-2FH这16个字节单元,即128个位单元(位地址空间位00~7FH);可以位寻址的特殊功能寄存器:89C51中有一些SFR是可以进行位寻址的,这些SFR的特点是其字节地址均可被8整除,如A累加器,B寄存器、PSW、IP(中断优先级控制寄存器)、IE(中断允许控制寄存器)、SCON(串行口控制寄存器)、TCON(定时器/计数器控制寄存器)、P0~P3(I/O端口锁存器)。位地址表达方式以PSW中位4(RS1)为例。直接(位)地址方式:如D4H;点操作符号方式:如PSW.4,D0H.4;位名称方式:如RS1;用户定义名方式:如用伪指令bit

SUB.REGbitRS1定义后,可用SUB.REG代替RS1。1.位传送指令MOVC,bit ;(bit)→C。2字节指令

MOVbit,C

;(C)→bit。2字节指令

例:MOVC,P1.0 ;将P1.0的状态送给C。MOVP2.0,C;将C中的状态送到P2.0,引脚上去。

2.位修正指令⑴位清0指令①

CLR

C

;使CY=0。1字节指令

CLRbit

;0→bit。2字节指令

例:CLRP1.0;即使P1.0变为0⑵位置1指令

SETBC

;1→CY。1字节指令

SETBbit

;1→bit。2字节指令

2.位修正指令(3)位取反指令①

CPLC

;(C)→C,1字节指令

②CPLbit

;(bit)→bit。2字节指令

3.位逻辑运算指令⑴位逻辑“与”指令①ANLC,bit

;(C)

(bit)→C。2字节指令

②ANLC,/bit

;(C)

(bit)→C。2字节指令

注意:指定的位地址中的值本身并不发生变化。例:ANLC,/P1.03.位逻辑运算指令⑵位逻辑“或”指令①

ORLC,bit

;(C)

(bit)→C。2字节指令

ORLC,/bit

;(C)

(bit)→C。2字节指令

4.位条件转移类指令⑴判Cy转移指令

JCrel

;先(PC)+2→PC;后:若(CY)=1,则转移。否则顺序执行②

JNCrel

;先(PC)+2→PC;后:若(CY)=0,则转移。否则顺序执行rel用“标号”来代替(PC)+rel→PC(PC)+rel→PC上面两条指令均为:2字节指令。4.位条件转移类指令⑵判位变量转移指令

①JBbit,rel

;(PC)+3→PC;若(bit)=1,则(PC)+rel→PC;否则顺序执行。

JNBbit,rel

;(PC)+3→PC;若(bit)=0,则(PC)+rel→PC;否则顺序执行。③

JBCbit,rel

;(PC)+3→PC;若(bit)=1,则(PC)+rel→PC,且0→bit;否则顺序执行。

rel用“标号”来代替。上面三条指令均为:3字节指令。在“上机实验指导书”的实验二,也需要用到“JB”或“JNB”指令。查询I/O口中的按钮(或开关)是否按下了,这种方法我们称为“查询方式”。P92【例4-6】片内RAM40H和41H两个单元中存有两个无符号数,将这两个数数中的小者存入30H单元中。解:程序如下:

MOVA,40H;40H单元的数送A

CJNEA,41H,BIG;比较大小,两个数不相等转BIGSJMPSTORE;相等,40H单元的数作为小者BIG:JCSTORE;有借位,则40H单元的数小MOVA,41H;无借位,则41H单元的数小STORE:MOV30H,A;小者存入30H单元中静态显示9~0的源程序:

ORG0000HAJMPMAINORG0050HMAIN:MOVDPTR,#TAB;字型表的首地址→DPTRLOOP:MOVR0,#9;R0作为计数器LOOP1:MOVA,R0MOVCA,@A+DPTR;查字型表,

MOVP2,A;字型送P2口显示,共阳7LEDLCALLDELAY;调用延时程序

DECR0CJNER0,#0FFH,LOOP1;比较大小,当R0≠0FFH时则转LOOP1,若R0=0FFH则顺序执行ACALLLOOPDELAY:MOVR1,#40;延时子程序

DL1:MOVR2,#40DL2:MOVR3,#0FFHDJNZR3,$DJNZR2,DL2DJNZR1,DL1RET

TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;共阳7LED字型表0,1,2~F

END修改程序,使它显示0~9“DB”为伪指令。P96数据表格表格首地址复习:【思考题】请编程:1)片内RAM40H和4AH两个单元中存有两个无符号数,将这两个数中的小者存入片外RAM的1000H单元中。2)有两个无符号数分别存放在片外RAM的1000H单元和1200H单元,将这两个数中的大者存入片内RAM的30H单元中。某同学编写的程序:解:MOVXR0,2000HMOVXA,2001HCJNEA,@R0,LOOP1MOV60H,ALOOP1:JCLOOP2MOV60H,AAJMPLASTLOOP2:MOV60H,@R0LAST:END例1:片外RAM2000H、2001H单元中分别存有两个无符号数,请编程将这两个数中的大者存入片内RAM的60H单元中(若这两个数相等,亦存入60H单元中)。例2:两个8位补码数DATA1与DATA2相加。若溢出,则累加器A清0,同时LED亮表示“溢出”;若无溢出,则“和”存放在R7中,同时LED灭表示无“溢出”。硬件电路如图所示(LED的初始态为灭)。试编写程序并在ProteusISIS中进行硬件仿真。PSW有位地址,也可用它的位名称,即:JBOV,LOOP1完善上例:黄LED亮表示“溢出”,绿LED亮表示“无溢出”。并将计算结果(16进制)由7段LED数码管显示(请参阅教材P209的内容)出来。注意观察:P1.6和P1.7引脚的“标色”是“灰色”,即电平状态不确定。所选的七段LED数码管是共阳极的,应该是高电平才对。这是由于驱动功率不够造成的。要解决此问题可各接一三极管。

ORG0000HAJMPMAINORG0050HMAIN:SETBP1.1SETBP1.5MOVA,#DATA1ADDA,#DATA2

MOV20H,A;结果存入20H单元中

JBOV,L1;有溢出转l1CLRP1.5;无溢出,绿灯亮AJMPL2L1:CLRP1.1;点亮溢出灯

;以下为拆字

MOVR0,#21HMOVA,20HANLA,#0FH;屏蔽高4位,取低4位MOV@R0,A;低4位存入21H单元中

INCR0MOVA,20HSWAPA;高、低4位互换ANLA,#0FHMOV@R0,A;高4位存入22H单元中;以下为查表显示数字

MOVDPTR,#TABMOVA,22HMOVCA,@A+DPTRMOVP2,A;显示十位

SETBP1.6MOVA,21HMOVCA,@A+DPTRMOVP3,A;显示个位

SETBP1.7L2:SJMP$TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H;共阳7段LED显示0~F字型编码表DB80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFH,0FFHEND该程序中DATA1和DATA2为具体的16进制数。如果无溢出,只是绿色LED亮,而不显示计算结果。请同学们想一想,如何修改该程序使其有无溢出都能将计算结果显示出来!教材P89例4-2。拆字教材P209-213。例3:如图所示:P3.2和P3.3上各接有一只按键,要求它们分别按下时(P3.2=0或P3.3=0),分别使P1口为0或FFH。试编写程序。这叫做“查询方式”例4:如图所示,开关K1和K2未按下时,两只发光二极管均不亮。当按下K1时,使发光二极管LED1亮,而发光二极管LED2不亮;当按下K2时,LED2亮而LED1不亮。试编写程序实现上述功能。例5:如图所示,上电时,LED不亮。每当开关K1合上时,LED亮,而当开关K1打开时,则LED熄灭。请编写其控制程序。分析:1、开关K1的闭合/断开状态是从P1.0端口输入信号的(P1.0作为输入端使用),而输入的信号只有“高/低电平”两种状态。K1打开,即输入高电平“1”,K1合上时,即输入低电平“0”。2、LED接在P1.1上,即P1.1作输出端口使用。当P1.1输出高电平“1”时,LED不亮;当P1.1输出低电平“0”时,则LED亮。故,可用“判位变量转移指令”

(JBbit,rel)来判断开关K1的状态。这种方法我们称为“查询方式”1、源程序如下(用汇编语言编写)

ORG0000H;程序起始地址AJMPMAIN;引导程序ORG0050H;程序从ROM0050H单元开始存放MAIN:SETBP1.0;输入的准备动作,即向P1.0端口写“1”SETBP1.1;上电时,LED为灭LOOP2:JBP1.0LOOP1;查询开关K1的状态.K1未合上,转LOOP1CLRP1.1;K1合上了,使P1.1输出低电平,LED亮

AJMPLOOP2;转LOOP2,继续查询LOOP1:SETBP1.1;使P1.1输出高电平,LED灭AJMPLOOP2;转LOOP2,继续查询

END;结束汇编2、C语言源程序#include<reg51.h>//头文件sbit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论