第六节控制转移_第1页
第六节控制转移_第2页
第六节控制转移_第3页
第六节控制转移_第4页
第六节控制转移_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

五控制控制转移指令控制转移指令分为:转移指令子程序调用和返回指令循环控制指令中断指令处理器控制指令1

◢程序是指令的集合◢指令代码在内存中顺序存放在8086系列中,指令的地址由CS和IP两个寄存器决定。CS和IP两寄存器的内容决定了程序的流程,1顺序执行

CPU取来一条指令后,自动将IP的值加上该指令的字节数,使IP顺序指向下一条指令,CPU取来紧接着的指令执行。

(此时IP的变化由CPU内部的硬件自动完成)先介召顺序执行和非顺序执行的概念2

通过控制转移指令改变CS和IP的值,使程序产生分支、调用结构。

例:比较(AX)、(BX)的大小,将大数存于(max)单元。

CMPAX,BX

JGEgreat XCHGAX,BX

great: MOV[max],AX

2非顺序执行3转移指令的实质:改变IP(或CS)的内容。所有转移指令不会影响标志位。分为无条件转移和条件转移两种。1.转移指令关于转移指令和调用指令的寻址,结合转移指令来介绍4(1)无条件转移指令-JMP本指令无条件转移到指定的目标地址,以执行从该地址开始的程序段。根据设置CS、IP的方法,JMP指令分成4种情况。

①段内直接转移:

指令中给出的8/16位的位移量加到IP。CS保持不变。

②段内间接转移:

REG/MEM中的16位偏移地址送IP。CS保持不变。③段间直接转移指令中给出的16位的段和16位的偏移地址送到CS和IP。

④段间间接转移

MEM中给出的16位的段和16位的偏移地址送到CS和IP。5转移的目标地址由指令直接给出。段内转移,故转移后CS内容保持不变,只改变IP的值。汇编语言中格式位移量转移范围JMPSHORTOPRD8位-128~+127JMPNEARPTROPRD16位-32768~+32767OPR-在汇编语言中使用符号地址。在机器语言中是一个相对于当前IP的位移量:例:JMP SHORTLPI ;转向LPIJMP NEARPTRBBB ;转向BBB①段内直接转移6

JMPSHORTNEXT

指令本身占有两个字节

操作码占一个字节;8位位移量占有一个字节=1050H-1000H源程序:条件转移指令:JMPSHORTnext.........

next:MOVAL,03HOP50H......OP03H......3000:1000H3000:1050H(IP)当前D8=50H(IP)=(IP)当前+D8内存例:代码段内有一条无条件转移指令在汇编语言中使用符号地址执行操作:(IP)←(IP)当前+D8

7

JMPSHORTOPR

8位位移量D8的范围在(-128~127)之间,否则出错JMPNEARPTROPR指令本身占有三个字节,位移量为D16,占有两个字节,范围:-32768~+32767H。可以转移到段内的任一位置。8②段内间接转移转移的目标地址由寄存器或存储单元的内容给出。例1:JMPSI若指令执行前(SI)=1200H,则指令执行后,(IP)=1200H,于是转向代码段的偏移地址1200H处执行。9例2:JMP[BX+DI]设指令执行前:(DS)=3000H,(BX)=1300H,(DI)=1200H,(32500H)=2350H;则指令执行后:(IP)=2350H在汇编语言中,段内间接寻址通常写成:

JMP WORDPTR[BX+DI]表示所取得的目标地址是一个字。(只改变IP)10③段间直接转移在指令中直接给出要转移到的目的段地址和偏移地址。

例:JMP 2000:1000H执行时,(IP)←1000H,(CS)←2000H注:直接地址为符号地址时,段间直接转移指令中的符号地址前应加操作符FARPTR。

例:JMP FARPTRfar_label其中的far_label为远类型的标号。11例:

C1SEGMENT …JMPFARPTRnext_prog

C1ENDS

C2SEGMINT …next_prog:… …C2 ENDSFAR远属性标号,标号与控制转移指令不在同一代码段中。

12转移的目的地址(段和偏移)在两个相邻的字存储单元中。例如:

JMP DWORDPTR[SI]设指令执行前:(DS)=4000H,(SI)=1212H,(41212H)=1000H,(41214H)=4A00H则指令执行后:(IP)=1000H,(CS)=4A00H于是转到4B000H处开始执行指令。例中的DWORDPTR表示转移地址是一个双字。④段间间接转移1340001212+)41212DSSI0010004A

4121241213412144121510004A00IPCS段间间接转移操作示意图1111111111101100JMPDWORDPTR[SI]的机器码DS:[SI]14条件转移指令可实现程序的条件分支。条件转移指令根据标志位的状态来决定是否进行分支转移。格式:

JXXlabel ;xx为条件名称缩写指令的转移范围为-128~+127字节。(2)条件转移指令-JXX15①以单个状态标志作为转移条件助记符 转移条件助记符转移条件助记符转移条件JZ/JEZF=1JNZ/JNEZF=0JSSF=1JNSSF=0JOOF=1JNOOF=0JP/JPEPF=1JNP/JPOPF=0JCCF=1JNCCF=0②以CX的值为0作为转移条件助记符转移条件JCXZ CX=0按转移条件不同,条件转移指令可以分为四大类:

16助记符 转移条件JA/JNBECF∨ZF=0 高于/不低于等于JAE/JNB/JNCCF=0高于或等于/不低于/无进位JB/JNAE/JCCF=1

低于/不高于等于/有进位JBE/JNACF∨ZF=1 低于或等于/不高于③以两个无符号数比较的结果作为转移条件④以两个带符号数比较的结果作为转移条件助记符 转移条件 JG/JNLE(SF⊕OF)∨ZF=0 大于/不小于等于JGE/JNL

SF⊕OF=0 大于或等于/不小于JL/JNGE

SF⊕OF=1

小于/不大于等于JLE/JNG(SF⊕OF)∨ZF=1 小于或等于/不大于171所有条件转移指令只能用段内直接寻址方式,都是相对转移,范围(-128~+127)。 当需往一个较远地方进行条件转移时, 先选用条件转移转到附近一个单元, 然后,再用无条件转移转到较远的目的地。2条件转移指令中,相当一部分指令是在比较完二个数大小后,根据结果而决定是否转移,3条件转移指令不影响标志位注意几点:18条件转移指令应用举例:例1:以十六进制数形式显示BX中的内容。

MOV BX,1234H MOV CH,4 ;CH做循环计数器ROT: MOV CL,4 ;CL做移位计数器 ROL BX,CL ;将最高4位移到低4位

MOV AL,BL AND AL,0FH ;取出低4位 ADD AL,30H ;转换为ASCII码

CMP AL,39H ;与’9’比较

JBE DISP ;若(AL)≤‘9’,则转显示

ADD AL,7 ;若(AL)>’9’,再加7转为‘A’-‘F’DISP: MOV DL,AL ;(DL)←字符

MOV AH,2

INT 21H ;显示输出

DEC CH ;4个十六进制数显示完否?

JNZ ROT ;没有,循环

MOV DL,48H ;‘H’ MOV AH,2 INT 21H ;最后显示’H’19

ASCII码美国标准信息交换代码20例2:在8000H开始的长度为1000字节的字符串中查找’S’,若找到,把其偏移地址记录在ADDR中,否则ADDR单元置为0FFFFH。MOVDI,8000HMOVCX,1000MOVAL,’S’MOVADDR,0FFFFHGOON:SCASBLOOPNZ

GOONJNZDONEDECDIMOVADDR,DIDONE:HLT212.过程调用和返回指令过程(子程序)一段具有特定功能的,供其它程序调用的公用程序。特点调用子程序时,IP(CS)的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到IP(CS)。子程序执行结束后一般均要返回调用程序。一次定义,多次调用;可带参数调用,以完成不同的功能。优点程序代码短,结构清晰,便于编程、调试、修改和阅读。两条相关指令:子程序调用指令CALL子程序返回指令RET22过程—程序中具有独立功能的部分编写成独立程序模块。过程定义格式:过程名PROC类型 ……

RET

过程名ENDP 过程有两种类型:按过程与调用语句间的位置

NEAR:调用指令CALL与过程在同一个代码段中

FAR:调用指令CALL与过程不在同一个代码段中CALL指令和RET指令都不影响条件码。23例:NEAR类型过程

code1SEGMENT;code段 …

CALLsubp

;调用指令

YYY:MOVBX,AX …

subp

PROCNEAR;过程定义 …

RET;返回

subpENDP

code1ENDS24一般格式:CALLsub

;sub为子程序的入口子程序调用有两类。段内调用段间调用①段内直接调用子程序的偏移地址直接由CALL指令给出。格式:CALLNEARPTRDST

CALL执行时:首先将当前IP内容(返回地址)压栈, 然后把机器指令中给出的位移量加到 IP上,转到子程序的入口处去执行。

注:返回地址-

CALL指令的下一条指令的首地址。

(1)调用指令CALL25例:段内直接调用code1SEGMENT;code段 …

CALLsubp

;调用指令

YYY:MOVBX,AX …

subp

PROCNEAR;过程定义 …

RET;返回

subpENDP

code1ENDS问题:本例中的返回地址?26子程序的偏移地址在寄存器或存储器中。格式:CALLmem16/reg16CALL执行时,它首先将IP内容压栈,然后把指定的寄存器/存储器的内容送入IP。例:CALL AX;调用地址由AX给出 CALL WORDPTR[SI];调用地址由存储器给出②段内间接调用27CALL

IPHIPL代码段数据段对于CALLWORDPTR[SI]这条指令若:(DS)

=

8000H,(SI)

=

1200H则指令操作图示如下。81200H81201H28子程序的段地址和偏移地址直接由CALL指令给出。

格式:CALLFARPTRDST;执行操作:SP←(SP)-2

((SP)-1,(SP)-2)←(CS);返回地址的段地址入栈

SP←(SP)-2

((SP)-1,(SP)-2)←(IP);返回地址的偏移地址入栈

(IP)←DST偏移地址(CS)←DST段地址③段间直接调用29CSEG1 SEGMENT … CALLFARPTRPPP;AAA处的CS:IP入栈,转PPPAAA: …CSEG1ENDSCSEG2SEGMENT …PPPPROCFAR … …RETPPPENDP …CSEG2ENDS段间直接调用举例30子程序的段和偏移地址为存储器的连续4个单元中的内容。

格式:CALLmem32指令的操作为:

SP←(SP)-2

((SP)+1,(SP))←(CS);返回地址的段地址入栈 SP←(SP)-2

((SP)+1,(SP))←(IP);返回地址的偏移地址入栈

CS←(mem32+2) IP←(mem32)例:CALLDWORD

PTR[DI]

调用地址在[DI],[DI]+1,[DI]+2,[DI]+3四个存储单元中。低字内容为偏移地址,高字内容为段地址。④段间间接调用31CALL代码段数据段

IPHIPL

CSHCSL[DI][DI]+1[DI]+2[DI]+3段间间接调用示意图CALLDWORD

PTR[DI]

32段内返回指令RET的操作为:

IP←((SP)+1,(SP));栈顶内容弹出到IPSP←(SP)+2段间返回指令RET的操作为:

IP←((SP)+1,(SP));栈顶内容弹出到IPSP←(SP)+2CS←((SP)+1,(SP));栈顶内容弹出到CSSP←(SP)+2带立即数返回指令:RETN;N为偶数执行操作:从栈顶弹出返回地址后,再使SP的值加N。 例:RET4(2)返回指令RET(子程序中的最后一条指令)33例如:RETN堆栈使用情况:

CODE SEGMENTASSUMECS:CODE,DS:DATAMAINPROCFAR START:MOVAX,DATA MOVDS,AX …… PUSHBX PUSHCX

CALLDELCHARQQQ:MOVAH,4CH INT21HMAINENDPDELCHARPROCNEAR ……

RET4DELCHARENDP

CODEENDS ENDSTART(BX)(SP)(CX)QQQ的偏移地址PUSHBXPUSHCXCALLDELCHARRET4RET4堆栈使用情况:

343.循环控制指令用在循环程序中以确定是否要继续循环。循环次数通常置于CX中。转移的目标应在距离本指令-128~+127的范围之内。循环控制指令不影响标志位。35(1)LOOP格式:LOOPlabel操作:(CX)-1→CX;若(CX)≠0,则转至label处执行;否则退出循环,执行LOOP后面的指令。LOOP指令与下面的指令段等价:

DECCX JNZlabel(2)LOOPZ(LOOPE)格式:LOOPZ

label操作:(CX)-1→CX;

若(CX)≠0∧ZF=1,则转至label处执行;否则退出循环,执行LOOP后面的指令。36(3)LOOPNZ(LOOPNE)格式:LOOPNZlabel操作:(CX)-1→CX;若(CX)≠0∧ZF=0,则转至label处执行;否则退出循环,执行LOOP后面的指令。循环指令的例子见下页。37例1:给1A000H开始的256个内存单元均减去1,若发现某个单元减为0则立即退出循环,其后的单元不再减1。

MOVAX,1A00HMOVDS,AXMOVDI,0MOVCX,256GOON:DECBYTEPTR[DI]INCDICMPBYTEPTR[DI-1],0LOOPNZ

GOONHLT38例2:在40个元素构成的数组中,寻找第一个非零元素

MOVCX,40; MOVSI,0FFH;NEXT:INCSI; CMPBYTEPTR[SI],0; LOOPZNEXT;(CX)≠0∧ZF=1当前元素为0且未找完时,继续寻找 JNZOKK;退出循环有两种情况:ZF=0,找到非零元素

或CX=0:整个数组已找完,未找到非零元素,此时ZF=1

CALLDISPLAY;未找到非零元素的处理 RETOKK:.….. ;找到非0元素的处理 …… RET394.中断指令8086/8088CPU在程序中允许安排一条中断指令来引起一个中断过程,这种中断叫软中断。有关中断的详细情况将在第六章讨论。中断指令共有三条:(1)INTn执行类型n的中断服务程序,N=0~255(2)INTO执行溢出中断的中断服务程序(3)IRET从中断服务程序返回调用程序40(1)INTn;n=0~255,为中断类型号本指令的操作步骤为:①((SP)-1,(SP)-2)←(FLAGS),SP←(SP)-2

保护标志寄存器的内容②IF←0,TF←0

中断服务程序中禁止外部INTR中断和单步中断③((SP)-1,(SP)-2)←(CS),SP←(SP)-2,CS←(n*4+2)

中断服务程序的段地址送入CS。n*4为向量地址。该向量地址中的内容即为中断服务程序入口地址。④((SP)-1,(SP)-2)←(IP),SP←(SP)-2,IP←(n*4)

中断服务程序的偏移地址送IP。INT指令只影响IF和TF,对其余标志位无影响。INT指令可用于调用系统服务程序,如INT21H41(2)溢出中断INTO

INTO检查溢出标志OF,如果OF=1,则启动一个类型4的中断过程;如果OF=0,不做任何操作。通常INTO指令安排在有符号数算术运算指令后面。如

IMUL DX INTO ;若溢出,则启动INT4,否则继续 MOV RESULT,AX MOV RESULT+2,DX……42用于从中断服务程序返回被中断的程序。任何中断服务程序不管是外部中断引起的,还是内部中断引起的,最后都要用IRET返回。

该指令执行的操作为:IP←((SP)+1,(SP));栈顶内容弹出到IPSP←(SP)+2CS←((SP)+1,(SP));栈顶内容弹出到CSSP←(SP)+2FLAGS←((SP)+1,(SP));

温馨提示

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

评论

0/150

提交评论