认识转移指令(第10课)_第1页
认识转移指令(第10课)_第2页
认识转移指令(第10课)_第3页
认识转移指令(第10课)_第4页
认识转移指令(第10课)_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

项目二

花样流水灯设计

任务5认识转移指令

学习内容1.理解无条件移位指令,特别是转移范围。2.掌握条件移位指令,特别是指令应用的场合。3.掌握子程序调用和返回指令。一、无条件转移指令(4条)指令:LJMP,AJMP,SJMP,JMPLJMPaddr16长跳转指令

——可在64KB范围内跳转AJMPaddr11绝对跳转指令

——可在指令所在的2KB范围内跳转SJMPrel

相对跳转指令

——可在当前PC的-128与+127范围内跳转JMP@A+DPTR间接长跳转指令

——可在以DPTR为基址+A为偏移量之和所指向的64KB程序范围内跳转一、无条件转移指令(4条)1.绝对跳转指令AJMP addr11;PC+2 PC,指令中addr10~0 PC10~0这是2KB范围内的无条件跳转指令,转移到指定地址,地址为:PC15…PC11a10a9…a0 PC。MCS—51把存贮空间划分为32个区,每个区为2KB字节。AJMP的下一条指令第一个字节与跳转的入口地址必须在同一区内例:KWR:AJMP addr11设addr11=001,0000,0000(a10~0)①设KWR

处地址为:1030H则执行指令后转移到:a.PC+2 PC PC=1032H PC15~11=00010。b.00010

001,0000,0000B=1100H②

设KWR

处地址为:

3030H则执行指令后转移到:a.PC+2 PC PC=3032H PC15~11=00110。b.00110

001,0000,0000B=3100H0000H~07FFH0区0800H~0FFFH1区1000H~17FFH2区……一、无条件转移指令(4条)2.短跳转指令SJMP rel

;PC+2+rel PC rel:-128~127rel:-128~127,负数表示向后转移,正数表示向前转移。编程时,rel往往用一个标号来代替,由汇编程序在汇编过程中自动计算偏移字节数,并填入指令代码中。当手工汇编时,rel一般用补码表示。例:KRD:SJMP PKRD标号PKRD的地址值为0123H则:0123H=0100+2+rel rel=21H①设 KRD的地址为0100H②

设KRD的地址为0100H标号PKRD值为00F2H则:00F2H=0100+2+rel rel=0F0H一、无条件转移指令(4条)3.长跳转指令LJMP addr16 ;addr15~0 PC无条件跳转到指定地址,地址空间为64KB程序存贮器地址。4.基址寄存器加变址寄存器间接转移指令(散转指令)JMP @A+DPTR

;(A)+(DPTR)PC例:PM:MOVR1,ARLAADDA,R1MOV DPTR,#PMTBJMP @A+DPTRPMTB:LJMP PM0 LJMP PM1 LJMP PM2 LJMP PM3 LJMP PM4 LJMP PM5 LJMP PM6二、条件转移指令(8条)1.判零转移指令JZrel

;(A)=0,(PC)+2+rel(PC),(A)≠0,(PC)+2(PC)JNZrel

;(A)≠0,(PC)+2+rel(PC),(A)=0,(PC)+2(PC)规定的条件满足,则进行转移,条件不满足则顺序执行下一条指令。转移到相对于当前PC值的8位移量的地址去。即:

新的PC值=当前PC+偏移量rel我们在编写汇编语言源程序时,可以直接写成:

JZ

标号 ;即转移到标号处。二、条件转移指令(8条)1.判零转移指令(2条)JZrel

;(A)=0,(PC)+2+rel(PC),(A)≠0,(PC)+2(PC)JNZrel

;(A)≠0,(PC)+2+rel(PC),(A)=0,(PC)+2(PC)例:MOVA,R0

JZL1MOVR1,#00HAJMPL2L1:MOVR1,#0FFHL2:SJMPL2END如果R0=0,结果R1=00H。如果R00,结果是R1中的值为0FFH。程序前:如果R0=0,结果R1=0FFH。而如果R00,则结果是R1=00H。若例子中的JZ改成JNZ,看看程序执行的结果是什么?二、条件转移指令(8条)2.比较不相等转移指令(4条)(1)CJNE A,direct,rel①(A)=(direct),(PC)+3 (PC),0 CY ②(A)>(direct),(PC)+3+rel (PC),0 CY ③(A)<(direct),(PC)+3+rel (PC),1 CY (2)CJNE A,#data,rel①(A)=data,(PC)+3 (PC),0 CY ②(A)>data,(PC)+3+rel (PC),0 CY ③(A)<data,(PC)+3+rel (PC),1 CY 二、条件转移指令(8条)2.比较不相等转移指令(3)CJNE Rn,#data,rel①(Rn)=data,(PC)+3 (PC),0 CY ②(Rn)>data,(PC)+3+rel (PC),0 CY ③(Rn)<data,(PC)+3+rel (PC),1 CY (4)CJNE @Ri,#data,rel①((Ri))=data,(PC)+3 (PC),0 CY ②((Ri))>data,(PC)+3+rel (PC),0 CY ③((Ri))<data,(PC)+3+rel (PC),1 CY 功能:比较前面两个操作数的大小,如果它们的值不相等,则转移。如果第一操作数(无符号整数)小于第二操作数(无符号整数),则置进位标志位Cy置1,否则清“0”Cy。二、条件转移指令(8条)2.比较不相等转移指令利用这些指令,可以判断两数是否相等。如果前面的数大,则CY=0,否则CY=1。因此在程序转移后再次利用CY就可判断出哪个数大,哪个数小了。

MOVA,R0CJNEA,#10H,L1MOVR1,#0 AJMPL3L1:JCL2

MOVR1,#0AAH AJMPL3L2:MOVR1,#0FFHL3:SJMPL3;如果R0=10H,则不转移R1=00H;如果CY=1即R0<10H,则转移;如果CY=0即R0>10H,则顺序执行因此最终结果是:本程序执行前,如果R0=10H,则R1=00H;如果R0>10H,则R1=0AAH;如果R0<10H,则R1=0FFH。二、条件转移指令(8条)3.减1不为0转移指令(2条)DJNZ Rn,rel

;(Rn)-1 (Rn)①(Rn)=0,(PC)+2 (PC) ②(Rn)≠0,(PC)+2+rel(PC)DJNZ direct,rel

;(direct)-1 (direct) ①(direct)=0,(PC)+3

(PC) ②(direct)≠0,(PC)+3+rel(PC),转移功能:将源操作数(Rn或direct)减1,结果回送到Rn寄存器或direct中去。如果结果不为0则转移。允许程序员把寄存器Rn或内部RAM的direct单元用作程序循环计数器。主要用于控制程序循环。以减1后是否为“0”作为转移条件,即可实现按次数控制循环。二、条件转移指令(8条)3.减1不为0转移指令例:MOV23H,#0AHCLRALOOP:ADDA,23HDJNZ23H,LOOPSJMP$程序段的执行过程是:将23H单元中的数连续相加,存至A中,每加一次,23H单元中的数值减1,直至减到0,共加(23H)次。(A)=10+9+8+7+6+5+4+3+2+1=55D=37H三、子程序调用与返回指令(4条)子程序:具有一定功能的公用程序段。在子程序的末尾一般是一条返回指令(RET)。执行返回主程序指令执行返回主程序指令子程序SUB执行调用子程序指令执行调用子程序指令主程序MAINCPU正在执行主程序CPU执行子程序AB主程序二次调用子程序示意图B主程序MAIN子程序SUB1子程序SUB2转向SUB1转向SUB2返回SUB1返回MAIN二级子程序嵌套示意图三、子程序调用与返回指令(4条)当主程序调用子程序时①把下一条指令地址 (SP),(SP)+2(SP)②子程序起始地址 PC当子程序执行返回时:把调用子程序处下一条指令地址从堆栈中取出 PC,(SP)-2 (SP)三、子程序调用与返回指令(4条)压栈1.短调用指令ACALL addr11

①(PC)+2 PC②(SP)+1 SP,(PC7~0) (SP)低③(SP)+1 SP,(PC15~8) (SP)高④PC15PC14PC13PC12PC11a10a9…a0 PC(转向执行子程序)例:(SP)=60H,标号MA值为0123H。SUB起始地址0345HMA:ACALL SUB

①(PC)+2②(SP)=61H,(61H)=25H ③(SP)=62H,(62H)=01H ④00000

01101000101=0345H①PC=0125H PC15~11=00000ACALL的下一条指令第一字节与子程序的入口地址必须在同一区内。三、子程序调用与返回指令(4条)2.长调用指令压栈LCALL addr16 ;addr1664KB地址区①(PC)+3 PC②(SP)+1 SP,(PC7~0) (SP)低③(SP)+1 SP,(PC15~8) (SP)高④addr16 PC例:(SP)=60H,START:标号地址0100HDIR:标号地址8100HSTART:LCALL DIR

②(SP)=61H,(61H)=03H ③(SP)=62H,(62H)=01H ④(PC)=8100H①(PC)=0103H三、子程序调用与返回指令(4条)3.返回指令①从子程序返回RET

②(SP)-1 SP,((SP))PC7~0③(SP)-1 SP①((SP))PC15~8即把堆栈顶的内容送到PC寄存器中。例:(SP)=62H,(61H)=30H,(62H)=07HRET

②(SP)=61H;(61H) PC7~0,PC7~0=30H③(SP)=60H(PC)=0730H,

从0730H处开始执行。①07H PC15~8,

PC15~8=07H 三、子程序调用与返回指令(4条)3.返回指令②从中断返回RETI②(SP)-1 SP,((SP))PC7~0③(SP)-1 SP①((SP))PC15~8中断返回指令把栈顶的内容送到PC寄存器中,同时释放中断逻辑使之能接受同级的另一中断请求。CPU执行RETI指令后至少要再执行一条指令,才能响应新的中断请求。四、空操作指令(1条)NOP ;除(PC)+1(PC)外无任何操作。一般用于延时。ADD INC —IncrementSUBB —SubtractWithBorrowADDC —Add with Carry flagDEC —DecrementMUL —MultiplyDIV —DivideDA —Decimal AdjustANL —AndLogical CLR —ClearXRL —Exclusive-OR

LogicalORL —OR

LogicalCPL —ComplementLogicalRL —RotateLeftRLC —RotateLeftwithCarryflagRR —RotateRightRRC —RotateRightwithCarryflagSWAP —指令助记符注释MOV —Move MOVC—MoveCode MOVX—MoveExternalRAMPUSH —POP —XCH —ExchangeXCHD —Exchangelow-order Digit指令助记符注释ACALL—AbsoluteSubroutineCallLCALL—LongSubroutineCallRET—ReturnfromSubroutineRETI—ReturnfromInterruptAJMP—AbsoluteJumpLJMP—LongJumpSJMP—ShortJumpJZ—JumpifAccumulatorisZeroJNZ—JumpifAccumulatorisNotZeroJC—JumpifCarryflagisSetJNC—JumpifNoCarryflagJB—JumpifdirectBitSetJNB—JumpifdirectBitNotSetJBC—JumpifdirectBitSet&ClearBitCJNE—CompareJmpifNotEqualDJNZ—DecrementJumpifNotZeroNOP—NoOperation预习控制程序转移指令17条,特别是子程序调用和返回指令。任务布置3.4.2伪指令

伪指令不是真正的指令,无对应的机器码,在汇编时不产生目标程序,它只是用来对汇编过程进行某种控制。

标准的MCS-51汇编程序定义的伪指令常用的有以下几条:

1.ORG(汇编起始命令)功能:规定下面的目标程序的起始地址

格式:[标号:]ORG16位地址例:ORG2000H

START:MOVA,#64H

规定了标号START的地址是2000H,又规定了汇编后的第一条指令从2000H开始存放。

ORG可以多次出现在程序的任何地方,当它出现时,下一条指令的地址由此重新定位。注意:所规定的地址是从小到大,且不允许有重叠。2.END(汇编结束命令)

功能:通知汇编程序结束汇编,在END之后所有的汇编语言指令均不予处理。一定放在程序末尾!

格式:[标号:]END3.EQU(等值命令)

功能:将一个数或者特定的汇编符号赋予规定的字符名称。

格式:字符名称EQU数或汇编符号

注意:字符名称不等于标号(其后没有冒号),用EQU赋值的符号名可以用作数据地址,代码地址,位地址,或是一个立即数。项可以是数,也可以是汇编符号。3.4.2伪指令例1:AAEQUR1

MOVA,AA;(R1)

A例2:A10EQU10

DELAYEQU07EBH

MOVA,A10

LCALLDELAY

这里A10当作片内RAM的一个直接地址,而DELAY定义了一个16位地址,实际上它是一个子程序的入口。3.4.2伪指令4.DATA(数据地址赋值命令)功能:将数据地址或代码地址赋予规定的字符名称。格式:字符名称DATA表达式

DATA命令功能与EQU类似,但有以下差别:

(1)EQU定义的字符名必须先定义后使用,而DATA定义的字符名可以后定义先使用。

(2)EQU可以把一个汇编符号赋给字符名称,而DATA只能把数据赋给字符名。

(3)DATA语句可以把一个表达式的值赋给字符名称,其中表达式应是可求值的。

DATA伪指令常在程序中用来定义数据地址。3.4.2伪指令5.DB(定义字节命令)

功能:从指定的地址单元开始,定义若干个8位内存单元的内容。

格式:[

温馨提示

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

评论

0/150

提交评论