虽然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指令。

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

jle汇编_汇编跳转指令集相关推荐

  1. cmp 字节 汇编_汇编 常用指令 cmp jmp call ret

    cmp 指令 功能相当于减法指令 只是不保存结果 不过cmp执行后会影响标志位 其它指令 通过识别标志位 来得知比较的结果 CPU在执行cmp指令时 像add sub指令一样 也包含两种含义 (有符号 ...

  2. cmp 字节 汇编_汇编 – x86 CMP指令差异

    题 以下两个x86指令之间的(非平凡)差异是什么? 39 /r CMP r/m32,r32 Compare r32 with r/m32 3B /r CMP r32,r/m32 Compare r/m ...

  3. Win32汇编_基础

    Win32汇编_基础 包含全部段的源程序结构: .386 .model flat, stdcall Option casemap:none ;<一些include语句> .stack [堆 ...

  4. 80X86汇编_绘制五角星程序

    80X86汇编_绘制五角星程序 DATAS SEGMENT mode  dw 0 COLOR DW 12 BKCOLOR DW 15 POINT dw 160,200,480,200,480,200, ...

  5. 为什么很少人学汇编_要想精通C语言,必须先学习汇编吗

    编程语言里面很少有人直接说出精通两个字,特别是一些入行好多年的程序员,从语法来讲C语言相对来讲入门还是比较容易,在高级语言还没有完全展开的年代,C语言算入门比较简单的编程语言了,起码要比语法细节繁杂的 ...

  6. 汇编:汇编的基本介绍

    文章目录 1.编程语言的发展 2.汇编语言的特点 3.汇编语言 VS 高级语言 4.汇编语言的用途 5.汇编语言的种类 1.编程语言的发展 机器语言 由0和1组成 汇编语言(Assembly Lang ...

  7. ARM汇编:汇编中proc、endp、ret、near、far指令用法

    ARM汇编:汇编中proc.endp.ret.near.far指令用法 子程序名 PROC NEAR ( 或 FAR ) -- ret 子程序名 ENDP (1)NEAR属性(段内近调用): 调用程序 ...

  8. x86汇编_指令集大全_笔记_6

    汇编指令集太多,如果不用就会忘记,所以将intel处理器官方的指令集整理一下. ------------------------------------------ 一.数据传输指令 -------- ...

  9. 汇编学习笔记(3)-80x86指令集

    前言 (1)指令的一般格式 [标号:] 助记符 [操作数1 , [操作数2]] [; 注释] 一行一条指令 助记符就是指令的名称,每条指定必定有个助记符. 助记符前面的标号是给汇编编译器看的,由我们自 ...

  10. java 与 汇编_清华大学出版社-图书详情-《汇编语言与计算机体系结构——使用C++和Java》...

    本书特点 汇编语言和计算机体系结构都是难学的课程.传统的汇编语言是如此复杂和特别,以至于即使学习基本概念都可能是一项困难任务.计算机体系结构也有同样的问题,而且更严重.学习汇编语言,我们要研究一个复杂 ...

最新文章

  1. SQL语句判断指定的数据库、表、字段、存储过程是否存在
  2. mongodb的IO测试工具 mongoperf
  3. vue 传参 微信_vue-router 你可能忽略的知识点
  4. 高性能MySQL之Count统计查询
  5. 微型计算机中 i o接口位于6,北语15秋计算机基础作业1
  6. 感想2-对于组件化的一些思考
  7. Linux kernel中网络设备的管理
  8. macos怎么装mysql80_Mac下MySQL安装配置教程
  9. java 坦克大战 素材_经典90坦克大战素材
  10. python的pyaudio教程入门_Python音频操作工具PyAudio上手教程!
  11. 麻将编程c语言,C语言麻将算法(胡牌算法)
  12. HDU 5956 The Elder(斜率优化DP)
  13. 怎么样免费建自己的网站?
  14. css图片压缩不变形
  15. 第二课堂计算机记录,第二课堂计算机小结
  16. 2023年徐汇区文化发展专项资金扶持项目申报指南
  17. 在跑SC-LEGO-LOAM时报错[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloude
  18. virtualbox虚拟机网络配置实现内网外网互通
  19. 华为光猫HG8240的简单配置过程
  20. 嘉兴碧桂园云栖里土拍价格_奥山深耕嘉兴,再下一城!以总价5.73亿元竞得王店镇宅地...

热门文章

  1. 0704第五讲异常处理
  2. R语言入门——一文讲明白attach与detach
  3. 猜一宋词名句 Java_《宋词三百首》里的50个名句,最适合发朋友圈
  4. Linux进程间通信——使用信号量
  5. 文档型漏洞攻击研究报告
  6. 【汇正财经】两市缩量下跌
  7. Jar包常见的反编译工具介绍与使用
  8. 美国计算机编程竞赛,USACO美国计算机竞赛
  9. 新手配置Intel NUC8i5INH的Ubuntu 16.04 时无法上网
  10. QuantLib 金融计算——基本组件之 ExchangeRate 类