《第2章8086的指令系统三.ppt》由会员分享,可在线阅读,更多相关《第2章8086的指令系统三.ppt(60页珍藏版)》请在优知文库上搜索。
1、第第 2 章章 8086的指令系统的指令系统(三)(三)22.4 控制转移类指令控制转移类指令n控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的常用指令重点掌握:JMP/Jcc/LOOP CALL/RETINT n/IRET 常用系统功能调用一般了解:LOOPZ/LOOPNZ INTO 控制转移类指令通过改变控制转移类指令通过改变IP(和(和CS)值,实现程序执行顺序的改变值,实现程序执行顺序的改变32.4.1 无条件转移指令无条件转移指令n只要执行无条件转移指令只要执行无条件转移指令JMP,就使程序转到,就使程序转到指定的目标地址处,从目标地址处开始执行指指定的目标地址处
2、,从目标地址处开始执行指令令n操作数操作数label是要转移到的是要转移到的目标地址(目的地目标地址(目的地址、转移地址址、转移地址)JMP labelJMP label;程序转向;程序转向labellabel标号指定的地址标号指定的地址4目标地址的范围:段内目标地址的范围:段内n段内转移近转移(near)q在当前代码段64KB范围内转移(-3276832767)q不需要更改CS段地址,只要改变IP偏移地址n段内转移短转移(short)q转移范围可以用一个字节表达,在段内128127范围的转移代码段代码段代码段代码段5目标地址的范围:段间目标地址的范围:段间n段间转移远转移(far)q从当前代
3、码段跳转到另一个代码段,可以在1MB范围q更改CS段地址和IP偏移地址q目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址代码段代码段代码段代码段 实际编程时,实际编程时,MASM汇编程序会根据目标地址的汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移距离,自动处理成短转移、近转移或远转移 程序员可用操作符程序员可用操作符short、near ptr 或或far ptr 强制强制6nJMP指令分成指令分成4种类型:种类型:段内转移、相对寻址段内转移、相对寻址 段内转移、间接寻址段内转移、间接寻址 段间转移、直接寻址段间转移、直接寻址 段间转移、间接寻址段间转移、间接
4、寻址7段内转移、相对寻址段内转移、相对寻址JMP labelJMP label;IPIP+IPIP+位移量位移量n位移量是紧接着位移量是紧接着JMP指令后的那条指令的偏移地指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移址,到目标指令的偏移地址的地址位移n当向地址增大方向转移时,位移量为正;向地址当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负减小方向转移时,位移量为负again:again:dec cxdec cx;标号;标号againagain的指令的指令jmp againjmp again;转移到;转移到againagain处继续执行处继续执行jmp out
5、putjmp output;转向;转向outputoutputoutput:output:mov result,almov result,al;标号;标号outputoutput的指令的指令8段内转移、间接寻址段内转移、间接寻址JMP r16/m16 JMP r16/m16;IPr16/m16IPr16/m16n将一个将一个1616位寄存器或主存字单元内容送入位寄存器或主存字单元内容送入IPIP寄存器,作为新的指令指针,但不修改寄存器,作为新的指令指针,但不修改CSCS寄存器的内容寄存器的内容jmp axjmp ax;IPAXIPAXjmp word ptr 2000hjmp word ptr
6、 2000h;IP2000hIP2000h9段间转移、直接寻址段间转移、直接寻址JMP far ptr labelJMP far ptr label;IPlabelIPlabel的偏移地址的偏移地址;CSlabelCSlabel的段地址的段地址n将标号所在段的段地址作为新的CS值,标号在该段内的偏移地址作为新的IP值;这样,程序跳转到新的代码段执行jmp far ptr othersegjmp far ptr otherseg;远转移到代码段2的otherseg10段间转移、间接寻址段间转移、间接寻址JMP far ptr memJMP far ptr mem;IPmemIPmem,CSmem
7、+2CSmem+2n用一个双字存储单元表示要跳转的目标地址。n这个目标地址存放在主存中连续的两个字单元中的,低位字送IP寄存器,高位字送CS寄存器mov word ptr bx,0mov word ptr bx,0mov word ptr bx+2,1500hmov word ptr bx+2,1500hJMP far ptr bxJMP far ptr bx ;转移到1500h:011nJmp转移指令的原理,可参见:q王爽第九章122.4.2 条件转移指令条件转移指令n指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令n操作数l
8、abel是采用相对寻址方式的短转移标号q表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移q距当前IP地址128127个单元的范围之内Jcc labelJcc label ;条件满足,发生转移:;条件满足,发生转移:IPIPIPIP8 8位位移位位移量量 ;条件不满足,顺序执行;条件不满足,顺序执行13Jcc指令的分类指令的分类nJcc指令不影响标志,但要利用标志。n根据利用的标志位不同,16条指令分成3种情况:1.判断单个标志位状态 2.比较无符号数高低 3.比较有符号数大小 14转移条件转移条件cc:单个标志状态:单个标志状态JZ/JEZF=1Jump if Zero/E
9、qualJNZ/JNEZF=0Jump if Not Zero/Not EqualJSSF=1Jump if SignJNSSF=0Jump if Not SignJP/JPEPF=1Jump if Parity/Parity EvenJNP/JPOPF=0Jump if Not Parity/Parity OddJOOF=1Jump if OverflowJNOOF=0Jump if Not OverflowJCCF=1Jump if CarryJNCCF=0Jump if Not Carry 采用多个助记符,只是为了方便记忆和使用采用多个助记符,只是为了方便记忆和使用15转移条件转移条件c
10、c:两数大小关系:两数大小关系无符号数无符号数JB/JNAECF=1Jump if Below/Not Above or EqualJNB/JAECF=0Jump if Not Below/Above or EqualJBE/JNACF=1或或ZF=1Jump if Below/Not AboveJNBE/JACF=0且且ZF=0Jump if Not Below or Equal/Above16 SF=0 SF=0 SF=1 SF=1 OF=0 OF=1 OF=0 OF=1 正,=溢出,负,负,=带符号数带符号数JL/JNGESFOFJump if Less/Not Greater or E
11、qualJNL/JGESF=OFJump if Not Less/Greater or EqualJLE/JNGSFOF或或ZF=1Jump if Less or Equal/Not GreaterJNLE/JGSF=OF且且ZF=0Jump if Not Less or Equal/Greater17判断单个标志位状态判断单个标志位状态n这组指令单独判断这组指令单独判断5个状态标志之一个状态标志之一JZJZ/JEJE和和J JNZ/JNE:利用零标志:利用零标志ZF,判断结果是否为零,判断结果是否为零(或相等)(或相等)JS和和JNS:利用符号标志:利用符号标志SF,判断结果是正是负,判断结
12、果是正是负JO和和JNO:利用溢出标志:利用溢出标志OF,判断结果是否产生溢出,判断结果是否产生溢出JP/JPE和和JNP/JPO:利用奇偶标志:利用奇偶标志PF,判断结果中,判断结果中“1”的个数是偶是奇的个数是偶是奇JC/JB/JNAE和和J JNC/JNB/JAE:利用进位标志:利用进位标志CF,判,判断结果是否进位或借位断结果是否进位或借位例题例题2.38例题例题2.39例题例题2.40例题例题2.41例题例题2.4218例2.38:JZ/JNZ指令test al,80htest al,80h;测试最高位;测试最高位jz next0jz next0;D7D70 0(ZFZF1 1),转
13、移),转移mov ah,0ffhmov ah,0ffh;D7D71 1,顺序执行,顺序执行jmp donejmp done;无条件转向;无条件转向next0:next0:mov ah,0mov ah,0done:done:.test al,80htest al,80h;测试最高位;测试最高位jnz next1jnz next1;D7D71 1(ZFZF0 0),转移),转移mov ah,0mov ah,0;D7D70 0,顺序执行,顺序执行jmp donejmp done;无条件转向;无条件转向next1:next1:mov ah,0ffhmov ah,0ffhdone:done:.19例2.
14、39:JS/JNS指令;计算计算|XY|(绝对值)(绝对值);X和和Y为存放于为存放于X单元和单元和Y单元的单元的16位操作数位操作数;结果存入;结果存入resultmov ax,Xmov ax,Xsub ax,Ysub ax,Yjns nonnegjns nonnegnegneg ax ax;negneg是求补指令是求补指令nonneg:nonneg:mov result,axmov result,ax20例2.40:JO/JNO指令;计算;计算XY;X和和Y为存放于为存放于X单元和单元和Y单元的单元的16位操作数位操作数;若溢出,则转移到;若溢出,则转移到overflow处理处理mov a
15、x,Xmov ax,Xsub ax,Ysub ax,Yjo overflowjo overflow.;无溢出,结果正确;无溢出,结果正确overflow:overflow:.;有溢出处理;有溢出处理21例2.41:JP/JNP指令;设字符的;设字符的ASCII码在码在AL寄存器中寄存器中;将字符加上奇校验位;将字符加上奇校验位;在字符;在字符ASCII码中为码中为“1”的个数已为奇数时的个数已为奇数时;则令其最高位为;则令其最高位为“0”;否则令最高位为;否则令最高位为“1”and al,7fhand al,7fh;最高位置;最高位置“0 0”,同时判断,同时判断“1 1”的个的个数数jnp
16、nextjnp next;个数已为奇数,则转向;个数已为奇数,则转向nextnextor al,80hor al,80h;否则,最高位置;否则,最高位置“1 1”next:next:.22例2.42:JC/JNC指令;记录;记录BX中中1的个数的个数xor al,alxor al,al;ALAL0 0,CFCF0 0again:again:test bx,0ffffh test bx,0ffffh;等价于等价于 cmp bx,0cmp bx,0je nextje nextshl bx,1shl bx,1jnc againjnc againinc alinc aljmp againjmp againnext:next:.;ALAL保存保存1 1的个数的个数另一种做法另一种做法23记录BX中“1”的个数xor al,alxor al,al;ALAL0 0,CFCF0 0again:again:cmp bx,0cmp bx,0jz nextjz nextshl bx,1shl bx,1;也可使用;也可使用 shr bx,1shr bx,1adc al,0adc al,0jmp againjm