资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,3.2.5,调用,/,转移,/,循环控制,/,中断指令,转移可分成两类:段内或段间转移。,段内转移:只要改变,IP,寄存器的内容,指在同一段的范围之内进行转移,即用新的转移目标地址代替原有的,IP,值。,段间转移:要修改,IP,、,CS,寄存器的内容,转到另一段去执行程序。,即,转移目标地址,=,新的段地址和偏移地址组成。,目标地址可以是:直接方式,/,间接方式给出。,代码段,代码段,代码段,代码段,第,3,章,Pentium,的指令系统,2024/11/21,1,1.,子程序调用和返回指令,CALL,label,主程序,RET,子程序,回到,CALL,指令后的指令处,返回地址,CALL 1000H,段内直接,CALLEAX,段内间接,CALL2500H,:,3600H,段间直接,CALLDWORD PTR DI,段间间接,第,3,章,Pentium,的指令系统,2024/11/21,2,放在子程序的末尾,使子程序在功能完成后返回调用程序继续执行。,*为能准确返回 ,返回指令类型与调用指令类型相对应。,在子程序调用时,需要保存返回地址,返回地址入栈,在子程序返回时:将返回地址出栈,段内返回,出栈偏移地址,IP,IPSS:SP,,,SPSP,2,段间返回,出栈偏移地址,IP,和段地址,CS,IPSS:SP,,,SPSP,2,CSSS:SP,,,SPSP,2,返回指令,RET,第,3,章,Pentium,的指令系统,2024/11/21,3,RET n,带参数的返回指令:,RET,指令,可以带有一个立即数,i16,,则堆栈指针,SP,将增加,即,SPSP+i16,,,这个特点使得程序可以方便地废除若干执行,CALL,指令以前入栈的参数,RET,返回指令有,4,种:,段内返回 段间返回,段内带立即数返回 段间带立即数返回,n,只能为偶数,第,3,章,Pentium,的指令系统,2024/11/21,4,(AX),(BX),(CX),(SP),code segment,main proc far,push ax,push bx,push cx,call sub,ret,main endp,sub proc near,ret 6,sub endp,code ends,(SP),堆栈段,(SP),(IP),第,3,章,Pentium,的指令系统,2024/11/21,5,JMP1000H,;段内直接,JMPCX,;段内间接,JMP1000H,:,2000H,;段间直接,JMP DWORD PTR SI,;段间间接,JMP dest,;,必须指定转移目标地址,(,或转向地址,),。,2.,无条件转移指令和条件转移指令,JMP/J*,(其中,*代表各种条件),1),无条件转移指令,JMP,例:已知,(BX)=1000H,,,(SI)=2000H ,(DS)=2000H,(23000H)=0250H,(23002H)=2000H,JMP DWORD PTR BXSI,则:(,BX,),+,(,SI,),=3000H,(IP)=,(,PA,),=(16d,(DS)+(BX)+(SI)=(23000H)=0250H,(,CS,),=(PA+2)=2000H,第,3,章,Pentium,的指令系统,2024/11/21,6,JE/JZ,JNE/JNZ,JG/JNLE,JNG/JLE,JL/JNGE,JNL/JGE,JNA/JBE,JB/JNAE,JNB/JAE,JA/JNBE,JS,JNS,JO,JNO,JP,NP,JCXZ,JECXZ,2),条件转移指令,J*,根据单个条件标志的设置情况转移,根据两个无符号数比较结果转移,比较两个带符号数,,并根据比较结果转移,第,3,章,Pentium,的指令系统,2024/11/21,7,注意几点:,所有条件转移指令都是相对转移形式,段内范围。,当需往一个较远地方进行条件转移时,,选用条件转移转到附近一个单元,,然后,再用无条件转移转到较远的目的地。,条件转移指令中,相当一部分指令是在比较完二个,数大小后,根据结果而决定是否转移,,条件转移指令不影响标志位,第,3,章,Pentium,的指令系统,2024/11/21,8,按转移条件不同,条件转移指令可以分为四大类:,以单个状态标志作为转移条件助记符转移条件,助记符,转移条件,助记符,转移条件,JZ/JE,ZF=1,JNZ/JNE,ZF=0,JS,SF=1,JNS,SF=0,JO,OF=1,JNO,OF=0,JP/JPE,PF=1,JNP/JPO,PF=0,JC,CF=1,JNC,CF=0,以,CX,的值为,0,作为转移条件,助记符,转移条件,JCXZ/JECXZ,(E)CX=0,第,3,章,Pentium,的指令系统,2024/11/21,9,助记符,转移条件,JA/JNBE,CFZF=0,高于,/,不低于等于,JAE/JNB/JNC,CF=0,高于或等于,/,不低于,/,无进位,JB/JNAE/JC,CF=1,低于,/,不高于等于,/,有进位,JBE/JNA,CFZF=1,低于或等于,/,不高于,以两个无符号数比较的结果作为转移条件,以两个带符号数比较的结果作为转移条件,助记符,转移条件,JG/JNLE,(,SFOF,),ZF=0,大于,/,不小于等于,JGE/JNL,SFOF=0,大于或等于,/,不小于,JL/JNGE,SFOF=1,小于,/,不大于等于,JLE/JNG,(,SFOF,),ZF=1,小于或等于,/,不大于,第,3,章,Pentium,的指令系统,2024/11/21,10,条件转移指令应用,例:比较二个数是否相等,如相等做动作,1,否则,做动作,2,CMP AX,,,BX,JE action_1,Action_2:,action_1,:,或,CMP AX,,,BX,JNZ action_2,action_1:,action_2,:,第,3,章,Pentium,的指令系统,2024/11/21,11,例:,X,,,Y,放在,X,,,Y,单元里,,(,带符号数判断,),先判,X 50,,,YES too_high,,,NO,做,X-Y,溢出,overflow,,,否则求,|X-Y|result,程序,:,MOV AX,X CMP AX,50,JG too_high,;,大于转,too_high,SUB AX,Y,JO overflow,;,溢出转,overflow,JNS nonneg,;S=0,转,nonneg,NEG AX,nonneg:MOV result,AX,too_high,:,overflow,:,第,3,章,Pentium,的指令系统,2024/11/21,12,例,:,在,M,中有一个首地址为,array,的,N,字数组,要求测试其中正数、,0,及负数的个数。,(,带符号数判断,),正数个数放在(,DI,)中,0,的个数放在(,SI,)中,负数的个数放在,N-,(,DI,),-,(,SI,)送(,AX,),如果没有负数转,skip,如果有负数转,neg_val,程序:,MOV CX,N,;,N,字数组,MOV BX,0,MOV DI,BX,MOV SI,BX,AGAIN:CMP WORD PTR ARRARYBX,0,JLE LESS_OR_AG,INC DI;,正数个数,JMP SHORT NEAT,LESS_OR_AG:JL NEAT,INC SI;0,的个数,NEAT:ADD BX,2,DEC CX,JNZ AGAIN,MOV AX,N,SUB AX,DI,SUB AX,SI,JZ SKIP ;,没有负数,JMP NEAR PTR NEG_VAL ;,负数,SKIP:,NEG_VAL:,第,3,章,Pentium,的指令系统,2024/11/21,13,3.,循环控制指令,循环控制指令用于使一些程序段反复执行,循环控制指令有三种:,(1),、,LOOP (Loop),循环指令,(2),、,LOOPE/LOOPZ,当相等,/,为“,0”,循环,(3),、,LOOPNE/LOOPNZ,当不相等,/,不为“,0”,循环,注意:,*,CX,中存放循环次数,只能使用段内直接寻址的,8,位位移量,(,-128127,),*,ECX,中存放循环次数,只能使用段内直接寻址的,16,位位移量(,-3276832767,),助记符,转移条件,不转移条件,LOOP,CX0,CX=0,LOOPZ,CX0,且,ZF=1,CX=0,或,ZF=0,LOOPNZ,CX0,且,ZF=0,CX=0,或,ZF=1,第,3,章,Pentium,的指令系统,2024/11/21,14,LOOPxx,符号地址,执行 操作,:,(,(E)CX,)(,(E)CX,),-1,此,操作不影响标志,检查转移条件,xx,,满足转向目标地址去执行,;,不满足执行,LOOPxx,后一条指令,与条件转移指令不同的是:,循环指令隐含,(E)CX),减操作。,第,3,章,Pentium,的指令系统,2024/11/21,15,例,:,求首地址为,ARRAY,的,M,个字之和,结果存入,TOTAL,。,MOV CX,M,MOV AX,0,MOV SI,AX,START_LOOP:,ADD AX,ARRAYSI,ADD SI,2,LOOP START_LOOP,MOV TOTAL,AX,第,3,章,Pentium,的指令系统,2024/11/21,16,例:在,string,字符串中查找空格字符,串长度为,N,。,修改偏址,BX,Y,N,AL,关键字,CX,串长度,N,DS,:,BX,串首址,判,BX,是关键字?,(CX)(CX),-,1,找到处理,未找到处理,(CX)=0,?,Y,N,结束出口,第,3,章,Pentium,的指令系统,2024/11/21,17,用条件转移:,JZ,MOV CX,,,N,MOV AX,SEG string,MOV DS,AX,LEA BX,,,string,MOV AL,20H,next,:,CMP AL,,,BX,JZ find,INC BX,DEC CX,JNZ next,未找到处理,JMP exit,find,:找到处理,exit,:结束出口,用循环指令,:,LOOP NZ next,MOV CX,,,N,MOV AX,SEG string,MOV DS,AX,LEA BX,,,string,MOV AL,20H,next,:,CMP AL,,,BX,PUSHF,INC BX,POPF,LOOPNZ next,JZ find,未找到处理,JMP exit,find,:找到处理,exit,:结束出口,DEC BX,next,:,INC BX,CMP AL,,,BX,LOOP NZ next,JZ find,未找到处理,JMP exit,find,:找到处理,exit,:结束出口,2024/11/21,18,思考:,去掉指令,JMP exit,,程序执行结果会怎样?,PUSH F,、,POPF,可否去掉?若要去掉,程序如何修改?,执行完,LOOPNZ,后,可否根据,CX=0,来,判断查找结果,?,有人认为,CX=0,,即,说明没找到,,对吗?,第,3,章,Pentium,的指令系统,2024/11/21,19,循环指令说明:,LOOP,退出循环条件是(,CX,),=0,LOOPZ,和,LOOPNZ,提供了提前结束循环的可能,不一定要等到,(CX)=0,才退出循环。,在串中查找字符,查到了,就可退出,,可用,LOOPNZ,,,不相等时继续查找。,比较两串时,当有字符不等,就可退出,说明两字符串不等。,可用,LOOPZ,,,当相等时继续比较。,执行完,LOOPNZ,或,LOOPZ,后,根据,ZF,标志的值判断结果,对查找字符,,ZF=1,说明找到;否则没有找到。,对串比较,,ZF=1,说明两串相等;否则不等。,第,3,章,Pentium,的指令系统,
展开阅读全文