虽然jmp指令提供了控制转移,但是它不允许进行任何复杂的判断。80x86条件跳转指令提供了这种判断。条件跳转指令是创建循环和实现其他条件执行语句,如if…endif的基本要素。
条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置;如果匹配失败,CPU忽略该条件跳转指令而继续执行下一条指令。一些条件跳转指令只是简单测试符号位(sign)、进位位(carry)、溢出位(overflow)、零标志(zero)位的设置。例如,在执行一条sh1指令后,您需要测试进位标志,来判断sh1是否从操作数的高地址位移出一位。类似地,也可以在一条test指令后测试零标志位,来判断指定的位是否为1。大多数情况,在cmp指令之后执行条件跳转指令。cmp指令设置标志位,以便判断小于、大于、等于等情况。
条件跳转指令形式如下:
Jcc label;
其中,Jcc中的“cc”,必须用表示测试条件类型的字符序列替换。这些字符和setcc指令使用的一样。例如,“js”表示根据符号(sign)标志是否被置位来决定是否跳转。一个典型的js指令如下:
js ValueIsNegative ;
在这个示例中,如果符号(sign)标志被置位,则js指令将控制转移到ValueIsNegative语句标号处;如果符号标志清零,则将控制直接转移给js指令后的指令。
与无条件jmp指令不同,条件跳转指令不提供间接跳转的形式。惟一允许的形式是跳转到程序中某一标号处。条件跳转指令有一个限制:目标标号的位置必须在跳转指令本身附近32768字节范围内,这通常对应着8000~32000条机器指令。一般情况下不会超过这种限制。
注意:Intel文档为许多条件跳转指令定义了多种替代名或指令别名。表7-1、7-2和7-3列出了每个指令所有的别名。这些表格也列出了表示相反分支的指令。很快您将明白这些相反分支指令的作用。
表7-1 测试标志位的JCC指令
指 令 描 述 条 件 别 名 相 反 指 令
JC 如果进位位被置位则跳转 进位标志=1 JB,JNAE JNC
JNC 如果进位位没有置位则跳转 进位标志=0 JNB,JAE JC
JZ 如果0标志被置位则跳转 0标志=1 JE JNZ
JNZ 如果0标志没有置位则跳转 0标志=0 JNE JZ
(续表)
指 令 描 述 条 件 别 名 相反指令
JS 如果符号位被置位则跳转 符号标志=1 JNS
JNS 如果符号位没有被置位则跳转 符号标志=0 JS
JO 如果溢出标志置位则跳转 溢出标志=1 JNO
JNO 如果溢出标志没有置位则跳转 溢出标志=0 JO
JP 如果奇偶校验位被置位则跳转 奇偶校验标志=1 JPE JNP
JPE 如果奇偶校验位为偶校验则跳转 奇偶校验标志=1 JP JPO
JNP 如果奇偶校验位没有被置位则跳转 奇偶校验标志=0 JPO JP
JPO 如果奇偶校验位为奇校验则跳转 奇偶校验标志=0 JNP JPE
表7-2 使用无符号数比较的JCC指令
指 令 描 述 条 件 别 名 相反指令
JA 如果超过(>)则跳转 进位标志=0,0标志=0 JNBE JNA
JNBE 如果不低于或等于(不 <=)则跳转 进位标志=0,0标志=0 JA JBE
JAE 如果超过或等于(>=)则跳转 进位标志=0 JNC,JNB JNAE
JNB 如果不低于则跳转(不 <) 进位标志=0 JNC,JAE JB
JB 如果低于(<)则跳转 进位标志=1 JC,JNAE JNB
JNAE 如果不超过或等于(不>=)则跳转 进位标志=1 JC,JB JAE
JBE 如果低于或等于(<=)则跳转 进位标志=1或0标志=1 JNA JNBE
JNA 如果不超过(不>)则跳转 进位标志=1或0标志=1 JBE JA
JE 如果相等(=)则跳转 0标志=1 JZ JNE
JNE 如果不相等(<>)则跳转 0标志=0 JNZ JE
表7-3 使用有符号数比较的JCC指令
指 令 描 述 条 件 别 名 相反指令
JG 如果大于(>)则跳转 符号标志=溢出标志或0标志=0 JNLE JNG
JNLE 如果小于或等于(<=)则跳转 符号标志=溢出标志或0标志=0 JG JLE
JGE 如果大于或等于(>=)则跳转 符号标志=溢出标志 JNL JGE
JNL 如果不小于(不<)则跳转 符号标志=溢出标志 JGE JL
JL 如果小于(<)则跳转 符号标志<>溢出标志 JNGE JNL
JNGE 如果大于或等于(>=)跳转 符号标志<>溢出标志 JL JGE
JLE 如果小于或等于(<=)跳转 符号标志<>溢出标志或0标志=1 JNG JNLE
JNG 如果不大于(不>)则跳转 符号标志<>溢出标志或0标志=1 JLE JG
JE 如果等于(=)则跳转 0标志=1 JZ JNE
JNE 如果不等于(<>)则跳转 0标志=0 JNZ JE
接下来将对“相反指令”一列进行简单的说明。在许多情况下,需要产生与某条分支指令条件相反的分支(在本章后面会给出示例),即相反分支。除了两个例外,都可以按下面的简单规则(后面统称为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是适用的。
虽然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”规则来选择相反分支指令。
使用条件跳转指令还可以实现循环。例如,下面的代码序列实现了从用户输入读入一串字符,并将字符存储到一组连续的单元中,直到用户输入回车键。
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指令。
条件跳转指令测试标志位,但不影响标志位。
转自:http://liuchang.blog.51cto.com
分享到:
相关推荐
关于汇编跳转指令 汇编语言中,跳转指令是控制程序流程的重要组成部分。跳转指令可以根据条件码标志位的状态来决定程序的执行方向。本文将详细讲解汇编语言中的跳转指令,包括状态寄存器PSW、直接标志转移、间接...
汇编程序跳转指令说明 汇编程序跳转指令是单片机编程过程中的重要组成部分,它能够实现程序的分支跳转,提高程序的执行效率和灵活性。其中,JMP、SJMP、AJMP、LJMP 等指令都是常用的跳转指令,每个指令都有其特点和...
汇编跳转指令大全,jc,jg,jz,jp,jl
总结了各类条件跳转指令所需要的各个不同的标志寄存器
- 查找指令:用户可以通过关键词搜索特定的汇编指令,如`MOV`(数据传输)、`ADD`(加法)、`JMP`(无条件跳转)等。 - 参数解释:查询器会解释指令的操作数类型和数量,以及它们在指令中的作用。 - 示例代码:...
汇编指令是计算机硬件能够直接理解和执行的基本操作,每条指令对应一个特定的机器码。汇编指令查询器是一款工具,帮助程序员和计算机科学学习者快速查找并理解各种汇编指令的含义和用法。 汇编语言的核心在于它的...
《汇编语言指令大全(详解版)》是一份详尽阐述汇编语言指令系统的参考资料,对于学习和理解计算机底层工作原理、程序设计以及系统开发具有重要价值。汇编语言是计算机编程的一种低级语言,它与机器语言密切相关,每一...
ARM汇编指令集包括了数据处理指令、移动指令、比较和分支指令、加载和存储指令、算术运算指令、逻辑运算指令、控制流指令等几大类别,以下是对这些主要指令类型的详细说明: 1. **数据处理指令**:这类指令主要用于...
2. 跳转指令:找出用于跳转的关键汇编指令,如JMP、CALL等。 3. 地址计算:理解如何计算目标地址,确保跳转到正确的位置。 4. 自我修改代码:如果涉及自我修改,要理解如何动态改变程序的执行流。 5. 错误处理:考虑...
每个指令都有其特定的格式、操作数类型和执行效果,学习时需仔细研究每个指令的详细说明,结合实际例子进行练习。 在实际编程中,汇编语言常与高级语言混合使用,形成混合编程。通过在关键性能瓶颈处使用汇编语言...
"DSP C6000系列常用汇编指令大全" DSP C6000系列常用汇编指令大全是面向DSP C6000系列芯片的汇编指令大全,旨在供大家在编写汇编时进行参考,特别是在CCS中编C与汇编混合编程时。该文档包含了DSP C6000系列芯片的...
条件跳转指令通常基于PSW中的标志位来决定是否执行跳转。 4. I/O访问指令:如读写内部或外部寄存器(MOV)、加载和存储(LDI, STI)等,用于与STM8S的外设进行通信。 5. 控制指令:包括设置和清除位(SETB, CLR)...
《汇编语言指令大全 X86和X87汇编指令大全(带注释)》是一份详尽的参考资料,涵盖了X86和X87架构下的汇编语言指令集。汇编语言是计算机硬件与高级编程语言之间的桥梁,直接对应机器码,对于理解计算机底层工作原理...
在IT领域,汇编语言是一种低级编程语言,它与计算机硬件紧密相关,直接对应于机器指令。汇编语言的每个指令通常代表一个特定的CPU操作,这些指令构成了计算机的基础运算。本教程聚焦于“汇编单机指令”,旨在帮助...
在ARM架构的汇编语言中,跳转指令是控制流程的关键部分,它们允许程序根据特定条件或无条件地改变执行路径。本文将详细探讨在描述中提到的几种跳转指令:b、bl、bep和bne。 1. **b (Branch) 指令** b指令是无条件...
`AJMP`和`LJMP`是跳转指令,分别用于短距离和长距离的无条件转移,这里的`L0003`和`L0006`是目标地址。 `RR`指令实现了数据的右移,这里累加器A的内容被右移一位,若最高位为1,则移入进位标志CF。`INC`指令则用于...
列出了x86平台中跳转指令详细集合,可作为查询文本使用
在学习易语言汇编跳转到标记的源码时,你需要理解以下几个关键点: 1. **理解汇编指令**:熟悉汇编语言的基本指令,如JMP、JE、JNE等,以及它们在程序控制中的作用。 2. **掌握标记的使用**:了解如何在源码中定义...
### 相对跳转指令与绝对跳转指令的特殊用法 #### 一、引言 在嵌入式系统及操作系统开发过程中,汇编语言及其指令集架构的应用极为广泛。ARM架构作为主流的嵌入式处理器之一,其指令集中的跳转指令(如BL和BX)对于...