35 控制转移指令-精品文档资料系列.ppt
复习复习1、逻辑运算指令:AND OR XOR NOT TEST2、移位指令:2移位指令小结保存其它指令移入保存其它指令移入CF的值的值带进位位循环左移指令带进位位循环左移指令RCL带进位位循环右移指令带进位位循环右移指令RCR将操作数的高低将操作数的高低4位或位或8位位(字节)数据相交换。(字节)数据相交换。循环左移指令循环左移指令ROL循环右移指令循环右移指令ROR将操作数乘以将操作数乘以2的的CL次。次。将补码数除以将补码数除以2的的CL次。次。算术左移指令算术左移指令SAL算术右移指令算术右移指令SAR将操作数乘以将操作数乘以2的的CL次。次。将操作数除以将操作数除以2的的CL次。次。逻辑左移指令逻辑左移指令SHL逻辑右移指令逻辑右移指令SHR主要作用主要作用指指 令令3例题1、以下指令序列,请问实现了什么功能?、以下指令序列,请问实现了什么功能? MOV AL,08H SAL AL,1 MOV BL,AL MOV CL,2 SAL AL,CL ADD AL,BL ;08H AL ;AL算术左移一位,算术左移一位,AL=10H, ;相当于;相当于AL2;AL BL;2 CL;AL算术再左移两位,算术再左移两位,AL=40H,;相当于;相当于AL4 ;AL + BLAL整个过程相当于整个过程相当于AL10,AL = 50H试分析下面的程序段完成什么功能?试分析下面的程序段完成什么功能?MOV CL,04HSHL DX,CL MOV BL,AHSHL AX,CLSHR BL,CLOR DL,BL;04H CL;DX逻辑左移逻辑左移4位,相当于位,相当于DX;低;低4位清零,位清零,DX = 0H;AHBL;AX逻辑左移逻辑左移4位,相当于位,相当于AX低低4位位;清零,;清零,AX = 0H;BL逻辑右移逻辑右移4位,相当于位,相当于AH=0H;现;现DL的高的高4位是原来位是原来DL的低的低4位,位,;现;现DL的低的低4位是原位是原AH的高的高4位位所以,完成将所以,完成将DX,AX组成的双字逻辑左移组成的双字逻辑左移4位。位。53.6 3.6 控制转移类指令控制转移类指令1、无条件转移指令、无条件转移指令2、条件转移指令、条件转移指令3、循环控制指令、循环控制指令4、调用和返回指令、调用和返回指令6 控制转移类指令通过控制转移类指令通过改变改变IP(和(和CS)值,实现程序执行顺序的改变值,实现程序执行顺序的改变l用于实现分支转移、循环控制、过程调用等用于实现分支转移、循环控制、过程调用等l常用指令常用指令重点掌握:JMP/Jcc/LOOP CALL/RET一般了解: INT n/IRET INTOLOOPZ / LOOPNZ71 无条件转移指令无条件转移指令l指令格式:指令格式:JMP labelJMP label;程序无条件转向;程序无条件转向labellabel标号指定的地址标号指定的地址l指令功能:使程序转到指定的目标地址处,并从该指令功能:使程序转到指定的目标地址处,并从该处开始继续执行,操作数处开始继续执行,操作数label是要转移到的是要转移到的目标地目标地址(目的地址、转移地址)址(目的地址、转移地址)执行执行JMP 段内转移、直接寻址;段内转移、直接寻址; 段内转移、间接寻址段内转移、间接寻址 段间转移、直接寻址;段间转移、直接寻址; 段间转移、间接寻址段间转移、间接寻址 JMP SHORT HELLO ;转移到目标地址是;转移到目标地址是HELLO ; IPIP+8位位移量位位移量 JMP NEAR PTR ABC ;转移到目标地址;转移到目标地址ABC, ;IP被修改了被修改了,IPIP+16位位移量位位移量8段内直接近转移段内直接近转移(JMP NEAR PTR lable):指指明在同一段的转移,明在同一段的转移, 偏移在偏移在32K 32KB范围范围之内,之内,IP的值被改变。的值被改变。 段内转移段内转移 段内直接短转移段内直接短转移(JMP SHORT lable):指明指明在同一段内更短距离的转移。目的地址与在同一段内更短距离的转移。目的地址与JMP指令指令所处地址的距离应在所处地址的距离应在128 127B范围之内。范围之内。 段间直接转移段间直接转移 “FAR PTR”:指明要转到另一:指明要转到另一个逻辑段执行程序,个逻辑段执行程序,CS和和IP都被修改都被修改。 段间间接转移段间间接转移”DWROD PTR”,存储器寻址方存储器寻址方式式.(2)段间转移)段间转移9段内转移、直接寻址段内转移、直接寻址JMP label;IPIP+IPIP+位移量位移量l位移量是紧接着位移量是紧接着JMP指令后的那条指令的偏移地址指令后的那条指令的偏移地址到到目标指令的偏移地址目标指令的偏移地址的地址位移的地址位移实际为相对寻址实际为相对寻址jmp again;转向转向again处继续执行处继续执行again:dec cx;标号;标号again的指令的指令jmp output;转向;转向outputoutput: mov bl,al;标号;标号output的指令的指令jmp 0120H;直接转向直接转向CS:0120H单元单元10段内直接短转移段内直接短转移 JMP SHORT HELLO HELLO:MOV AL,3 010AH010BHE 8E 80 80 8B 0B 00 30 30100H0101H0102HJMP指令HELLO位移量代码段代码段11段间直接转移段间直接转移C2C2段段20000H20000H20250H20250H新新(IP)=0250H(IP)=0250H新新(CS)=2000H(CS)=2000HNEXT_PROGNEXT_PROGC1 SEGMENTC1 SEGMENT JMP FAR JMP FAR PTR PTR NEXT_PROGNEXT_PROGC1 ENDSC1 ENDSC2 SEGMENTC2 SEGMENT NEXT_PROG ADD AL,BL NEXT_PROG ADD AL,BLC2 ENDSC2 ENDSC1段EA5 00 20 02 0JMP指令122. 条件转移指令条件转移指令格式:格式:Jcc label功能:能够对一个或几个状态位进行测试功能:能够对一个或几个状态位进行测试, ,判判断是否满足转移条件条件满足,转移到目的断是否满足转移条件条件满足,转移到目的地址地址labellabel去执行;条件不满足,顺序执行下去执行;条件不满足,顺序执行下一一条指令条指令,不影响标志位。,不影响标志位。13相对寻址方式相对寻址方式lJcc指令的操作数指令的操作数label是一个标号是一个标号l条件转移指令的目的地址必须在现行的代码段内条件转移指令的目的地址必须在现行的代码段内一个一个8位位移量,表示位位移量,表示Jcc指令后的那条指令的偏移指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移地址,到目标指令的偏移地址的地址位移l8位位移量是相对于当前位位移量是相对于当前IP的,且距当前的,且距当前IP地址地址128127个单元的范围之内,属于段内短距离转个单元的范围之内,属于段内短距离转移移lJcc指令为指令为2个字节,条件不满足时的顺序执个字节,条件不满足时的顺序执行就是当前指令偏移指针行就是当前指令偏移指针IP加加214Jcc指令的分类指令的分类lJcc指令不影响标志,但要利用标志指令不影响标志,但要利用标志位。根据利用的标志位不同,位。根据利用的标志位不同,16条指条指令分成令分成3种情况:种情况:(1)判断单个标志位状态)判断单个标志位状态(2)比较无符号数高低)比较无符号数高低(3)比较有符号数大小)比较有符号数大小15(1)判断单个标志位状态)判断单个标志位状态功功 能能结果有进位(借位)转移结果有进位(借位)转移结果无进位(借位)转移结果无进位(借位)转移 CF=1CF=0JC dstJNC dst结果为零转移结果为零转移结果不为零转移结果不为零转移 ZF=1ZF=0JZ dstJNZ dst结果溢出转移结果溢出转移 结果不溢出转移结果不溢出转移OF=1OF=0JO dstJNO dst奇偶校验结果为偶转移奇偶校验结果为偶转移奇偶校验结果为奇转移奇偶校验结果为奇转移 PF=1PF=0JP dstJNP dst结果为负数转移结果为负数转移结果为正数转移结果为正数转移 SF=1SF=0JS dstJNS dst转移条件转移条件条件转移指令条件转移指令例:JZ/JNZ指令test al,80h;测试;测试AL的最高位的最高位jz next1;D70(ZF1),转移),转移mov ah,0ffh ;D71,顺序执行,顺序执行jmp done;无条件转向;无条件转向next1:mov ah,0done:.test al,80h ;测试最高位;测试最高位jnz next2 ;D71(ZF0),转移),转移mov ah,0 ;D70,顺序执行,顺序执行jmp done ;无条件转向;无条件转向next2:mov ah,0ffhdone:.例:JS/JNS指令;X和和Y为存放于为存放于X单元和单元和Y单元的单元的16位操作数位操作数 lea si , X lea di , Ymov ax , sisub ax , dijns nextneg ax ;neg是求补指令:是求补指令:0axnext:mov result , ax;计算;计算|XY|(绝对值)(绝对值);结果存入;结果存入result单元单元 18BCD码码:二进制编码的十进制数二进制编码的十进制数lBCD码是十进制数码是十进制数,而运算器对数据做加减运而运算器对数据做加减运算时算时,都是按二进制运算规则进行处理的都是按二进制运算规则进行处理的(四位四位二进制相加逢十六进一二进制相加逢十六进一),而实际上是两个十进而实际上是两个十进制数相加制数相加,应该逢十进一应该逢十进一.因此采用因此采用BCD码后码后,在在两数相加的和小于或等于两数相加的和小于或等于9时时,十进制运算的结十进制运算的结果是正确的果是正确的;当大于当大于9时时,结果不正确结果不正确,必须加必须加6修修正后才能得出正确的结果正后才能得出正确的结果.l(57.2)10=(01010111.0010)BCD例:例:JO/JNO指令指令;计算;计算XY;若溢出,则转移到;若溢出,则转移到overflow处理处理 lea si , X lea di , Y mov ax , si sub ax , di jo overflow .;无溢出,结果正确;无溢出,结果正确overflow: .;有溢出,出错处理有溢出,出错处理;X和和Y为存放于为存放于X单元和单元和Y单元的字操作数单元的字操作数例:JP/JNP指令;设字符的设字符的ASCII码在码在AL寄存器中寄存器中and al,7fh;最高位先置最高位先置“0”,并判断,并判断“1”的个的个数数jnp next;个数已为奇数,则转向个数已为奇数,则转向nextor al,80h;否则,最高位置否则,最高位置“1”next:.;若该字符;若该字符ASCII码中为码中为“1”的个数已为奇数时的个数已为奇数时 则令其最高位为则令其最高位为“0”;否则令最高位为;否则令最高位为“1” ;将字符加上奇校验位;将字符加上奇校验位例:JC/JNC指令;记录记录BX中中1的个数的个数方法方法1xor al , al ;AL0,CF0again: cmp bx , 0jz nextshl bx , 1;也可使用;也可使用 shr bx , 1ADC al , 0 ;ALAL+(CF)jmp againnext:.;AL保存保存1的个数的个数22记录BX中“1”的个数方法2xor al , al again:test bx , 0ffffh jz nextshl bx , 1jnc againinc aljmp again next:.;AL0,CF0;等价于等价于 cmp bx , 0;AL保存保存1的个数的个数;若若bx0,转到转到next;否则,;否则,bx逻辑左移逻辑左移1位位;CF=0,转到转到again;CF=1,al加加1;无条件转到;无条件转到again23(2)比较无符号数高低)比较无符号数高低l无符号数的大小用无符号数的大小用 高高(Above)、)、低低(Below)表示,利用表示,利用CF确定高低确定高低l利用利用ZF标志确定标志确定相等相等(Equal )l两数的高低分成:两数的高低分成:1) 低于(不高于等于低于(不高于等于):):JB(JNAE/JC)2) 不低于(高于等于):不低于(高于等于):JNB(JAE/JNC)3) 低于等于(不高于低于等于(不高于):):JBE(JNA)4) 不低于等于(高于):不低于等于(高于):JNBE(JA )5) 相等(等于零):相等(等于零):JE/JZ6) 不相等(不等于零):不相等(不等于零):JNE/JNZ24(3)比较有符号数大小)比较有符号数大小l有符号数的大小用有符号数的大小用大大(Greater)小小(Less)表示)表示l利用利用ZF标志确定标志确定相等相等(Equal)l两数的大小分成两数的大小分成4种关系:种关系: 小于(不大于等于):小于(不大于等于):JL(JNGE) 不小于(大于等于):不小于(大于等于):JNL(JGE) 小于等于(不大于):小于等于(不大于):JLE(JNG) 不小于等于(大于):不小于等于(大于):JNLE(JG )25Jcc M,NM N 无符号数无符号数(A,B) 有符号数有符号数(G,L)l=) JB(JNAE) JL(JNGE)l) JBE(JNA) JLE( (JNG) )l (= (B)时转移时转移lJNE 不等于不等于(A B)时转移时转移 MOV AX, XCMP AX, 50JG TOO_HIGHSUB AX, YJO OVERFLOWJNS NONNEGNEG AX NONNEG: MOV RESULT, AX TOO_HIGH: OVERFLOW: 例:例:X50,转到,转到TOO_HIGH; 计算计算X-Y: 溢出转到溢出转到OVERFLOW, 否则否则 |X-Y|RESULT 343. 循环指令循环指令(loop)l控制某程序段反复执行的次数。循环指令默认利控制某程序段反复执行的次数。循环指令默认利用用CX计数器,方便实现计数循环的程序结构计数器,方便实现计数循环的程序结构llabel操作数采用相对寻址方式操作数采用相对寻址方式LOOP labelLOOP label;CXCXCXCX1 1, ;CX0CX0,循环到标号,循环到标号labellabelLOOPZ labelLOOPZ label;CXCXCXCX1 1, ;CX0CX0且且ZFZF1 1,循环到标号,循环到标号labellabelLOOPNZ labelLOOPNZ label ;CXCXCXCX1 1, ;CX0CX0且且ZFZF0 0,循环到标号,循环到标号labellabelJCXZ labelJCXZ label;CXCX0 0,转移到标号,转移到标号labellabel35LOOP格式:格式:LOOPLOOP label操作:操作:(CX)-1(CX)-1CXCX; 若若(CX)0,(CX)0,则转至则转至label处执行;处执行; 否则退出循环否则退出循环, ,执行执行LOOPLOOP后面的指令。后面的指令。 不影响标志位。不影响标志位。实际上,该指令可以等价两条指令:实际上,该指令可以等价两条指令: DEC CX ;CX1CX JNZ dst ;ZF=0,转向,转向dst执行执行36例、编写指令序列,确定AL中“1”的个数。解:解: XOR AH,AH MOV CX,08H Start:ROL AL,1 JNC Lp INC AH Lp: LOOP Start;累加器清零;累加器清零;设置循环次数;设置循环次数;AL循环左移循环左移1位位;AL的最高位送的最高位送CF;CF=0,转移到,转移到Lp;CF=1,AH+1AH;CX-1CX,CX0;循环到;循环到Start执行执行