汇编语言跳转命令详细讲解

2025-11-04 06:25:31

1、虽然jmp指令提供了控制转移,但是它不允许进行任何复杂的判断。80x86条件跳转指令提供了这种判断。条件跳转指令是创建循环和实现其他条件执行语句,如if…endif的基本要素。

条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置;如果匹配失败,CPU忽略该条件跳转指令而继续执行下一条指令。一些条件跳转指令只是简单测试符号位(sign)、进位位(carry)、溢出位(overflow)、零标志(zero)位的设置。例如,在执行一条sh1指令后,您需要测试进位标志,来判断sh1是否从操作数的高地址位移出一位。类似地,也可以在一条test指令后测试零标志位,来判断指定的位是否为1。大多数情况,在cmp指令之后执行条件跳转指令。cmp指令设置标志位,以便判断小于、大于、等于等情况。

汇编语言跳转命令详细讲解

2、条件跳转指令形式如下:

Jcc label;

其中,Jcc中的“cc”,必须用表示测试条件类型的字符序列替换。这些字符和setcc指令使用的一样。例如,“js”表示根据符号(sign)标志是否被置位来决定是否跳转。一个典型的js指令如下:

js ValueIsNegative ;

在这个示例中,如果符号(sign)标志被置位,则js指令将控制转移到ValueIsNegative语句标号处;如果符号标志清零,则将控制直接转移给js指令后的指令。

汇编语言跳转命令详细讲解

3、与无条件jmp指令不同,条件跳转指令不提供间接跳转的形式。惟一允许的形式是跳转到程序中某一标号处。条件跳转指令有一个限制:目标标号的位置必须在跳转指令本身附近32768字节范围内,这通常对应着8000~32000条机器指令。一般情况下不会超过这种限制。

注意:Intel文档为许多条件跳转指令定义了多种替代名或指令别名。表7-1、7-2和7-3列出了每个指令所有的别名。这些表格也列出了表示相反分支的指令。很快您将明白这些相反分支指令的作用。

表7-1 测试标志位的JCC指令

汇编语言跳转命令详细讲解

1、接下来将对“相反指令”一列进行简单的说明。在许多情况下,需要产生与某条分支指令条件相反的分支(在本章后面会给出示例),即相反分支。除了两个例外,都可以按下面的简单规则(后面统称为N/No N规则)产生相反分支:

● 如果Jcc的第二个字母不是“n”,则在“j”后面插入一个“n”。例如:je对应为jne,jl对应为jnl。

● 如果Jcc的第二个字母是“n”,则去掉指令中的“n”。例如:jng对应为jg,jne对应为je。

不遵循这两条规则的两个例外是jpe(奇偶位为偶跳转)和jpo(奇偶位为奇跳转)。这两个例外并不会导致什么问题,因为:(a)很少需要测试奇偶标志;(b)可以使用别名jp和jnp替代jpe和jpo。而“N/No N”规则对jp和jnp是适用的。

汇编语言跳转命令详细讲解

2、虽然jge是jl的相反指令,但是建议使用jnl作为jl的相反指令。因为很容易误认为“大于是小于的相反”,从而把jg当作jl的相反指令。您可以坚持使用“N/No N”规则以避免这种混淆。

80x86条件跳转指令提供了这样的能力:根据判断条件将程序流分支到两条路径中的某一条。例如,要实现:如果BX等于CX,则寄存器AX的值加1。可以使用下面的代码来完成该功能:

cmp(bx,cx );

jne SkipStmts;

inc(ax );

SkipStmts:

其中的诀窍是使用相反分支指令来跳过在条件满足的情况下需要执行的指令。请坚持使用前面介绍的“N/no N”规则来选择相反分支指令。

使用条件跳转指令还可以实现循环。例如,下面的代码序列实现了从用户输入读入一串字符,并将字符存储到一组连续的单元中,直到用户输入回车键。

汇编语言跳转命令详细讲解

3、mov(0,edi );

RdLnLoop:

  stdin.getc(); //Read a character into the AL register.

   mov(al,Input [edi])); //Store away the character.

   inc(edi ); //Move on to the next character.

   cmp(al,stdio.cr ); //See if the user pressed Enter.

   jne RdLnLoop;

与setcc指令类似,条件跳转指令分为两类—— 测试特殊处理器标志位的条件跳转指令(例如jz、jc、jno)和测试某些条件(小于、大于等)的条件跳转指令。当测试某个条件时,条件跳转指令通常紧跟在一个cmp指令之后。cmp指令设置标志位后,如果是无符号数比较,使用ja、jae、jb、jbe、je或jne等指令测试这些标志来判断是否小于、小于等于、等于、不等于、大于或大于等于;如果是有符号数比较,则使用jl、jle、je、jne、jg、jge指令。

条件跳转指令测试标志位,但不影响标志位。

汇编语言跳转命令详细讲解

1、跳转指令分三类:

一、无条件跳转:JMP  ;无条件跳转

汇编语言跳转命令详细讲解

2、二、根据CX、ECX寄存器的值跳转:JCXZ ;CX 为 0 则跳转JECXZ;ECX 为 0 则跳转

汇编语言跳转命令详细讲解

3、三、根据EFLAGS寄存器的PSW标志位跳转, 这个太多了.根据标志位跳转的指令:JE   ;等于则跳转         同JZJNE  ;不等于则跳转        同JNZJA   ;无符号大于则跳转JNA  ;无符号不大于则跳转JAE  ;无符号大于等于则跳转        同JNBJNAE ;无符号不大于等于则跳转   同JBJB   ;无符号小于则跳转JNB  ;无符号不小于则跳转JBE  ;无符号小于等于则跳转        同JNAJNBE ;无符号不小于等于则跳转   同JAJG   ;有符号大于则跳转JNG  ;有符号不大于则跳转JGE  ;有符号大于等于则跳转        同JNLJNGE ;有符号不大于等于则跳转   同JLJL   ;有符号小于则跳转JNL  ;有符号不小于则跳转JLE  ;有符号小于等于则跳转        同JNGJNLE ;有符号不小于等于则跳转   同JGJZ   ;为零则跳转JNZ  ;不为零则跳转JS   ;为负则跳转JNS  ;不为负则跳转JC   ;进位则跳转JNC  ;不进位则跳转JO   ;溢出则跳转JNO  ;不溢出则跳转JP   ;为偶则跳转JNP  ;不为偶则跳转JPE  ;奇偶位置位则跳转      同JPJPO  ;奇偶位复位则跳转      同JNP

汇编语言跳转命令详细讲解

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢