关于 汇编的跳转指令,大家应该都有所体会比较多 而且比较乱   不容易记  容易忘记,今天在用到的时候,也发愁了 ,于是在这里总结一下,方便以后学习。
虽然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指令。
条件跳转指令测试标志位,但不影响标志位。

汇编跳转指令(转载)相关推荐

  1. 【debug】汇编跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    汇编跳转指令: JMP.JECXZ.JA.JB.JG.JL.JE.JZ.JS.JC.JO.JP 等 2017年11月12日 15:01:09 zmmycsdn 阅读数 19334 转自:http:// ...

  2. 汇编跳转指令B、BL、BX、BLX 和 BXJ的区别

    已针对原链接错误翻译并更正                                                    跳转指令用于实现程序流程的跳转,在 ARM 程序中有两种方法可以实现程 ...

  3. 关于汇编跳转指令的说明

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

  4. 汇编跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    转自:http://www.cnblogs.com/del/archive/2010/04/16/1713886.html http://pan.baidu.com/s/1gVTSi 跳转指令分三类: ...

  5. 汇编jnl_汇编跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    http://pan.baidu.com/s/1gVTSi 跳转指令分三类: 一.无条件跳转: JMP ;无条件跳转 二.根据CX.ECX寄存器的值跳转: JCXZ ;CX 为 0 则跳转 JECXZ ...

  6. 汇编——跳转指令与分支结构(包括OF和CF的溢出判断)

    汇编中的循环和分支结构 虽然我们没有花里胡哨的函数和对象等等,但是我们也可以实现循环和分支结构(其实就是if_else) 我们要知道一个问题,就是代码是一行行执行的. (其实这个是说给我这样的被Ver ...

  7. 单片机汇编跳转指令延时一秒

    DELAY: MOV      R7,#10    ;延时1S子程序 DL1:   MOV      R6,#200-----1T DL2:   MOV      R5,#248------1T DJ ...

  8. 汇编 跳转指令: JMP、JCXZ、JECXZ、JA、JE、JNA、JNE、JZ、JB、JS、JC、JNC、JG、JNBE、JO、JP、JL、JPO、JGE、JLE 汇编语言

    以下为JCXZ和JECXZ .JMP:

  9. arm64汇编b带条件跳转指令和bl跳转带返回ret指令

    文章目录 ret返回指令 B 跳转指令 BL 带返回的跳转指令 B指令可以接上后缀,用来和cmp比较后待条件的跳转 ret返回指令 cpu遇到ret之后,会把lr赋值给pc,这样cpu执行了pc里的地 ...

  10. 汇编--条件跳转指令

    条件跳转指令很多,支持根据有符号.无符号整数的比较以及对CPU状态标志的检查进行跳转的一系列指令. 根据特定的标志的 根据两操作数是否相等,或根据(E)CX的值是否相等 基于无符号操作数的比较结果的 ...

最新文章

  1. python对文件的读写正确操作方式
  2. 静态代码分析——字符串
  3. [译]使用 Rust 开发一个简单的 Web 应用,第 4 部分 —— CLI 选项解析
  4. 吴恩达:我们说人工智能时,实际在说些什么?
  5. python如何定义自定义函数_python类中系统自定义函数
  6. pdftk — PDF万用命令行工具
  7. 腾讯云总裁邱跃鹏:新基建最大的改变是从硬件到软件的转变
  8. SENT (Single Edge Nibble Transmission) 协议 接口
  9. python爬虫入门教程——爬取360翻译
  10. 程序人生 - Nature封面:脑机接口突破,可将脑中“笔迹”转为屏幕字句,速度创纪录,准确率超高
  11. 火车头采集html文档没内容,火车头采集器:编辑任务中常见问题
  12. 喜羊羊与灰太狼java_java swing实现喜羊羊与灰太狼推箱子游戏附带视频开发教程...
  13. 【数据结构与算法python】最小生成树算法-Prim算法
  14. 学生信息管理系统(头哥适用版)(c语言)
  15. 用python画漂亮的网状几何图形
  16. 虚拟机windows10 屏幕大小不能自适应
  17. 箱线图的几种画法-Python
  18. 力扣简单题合集(带答案)
  19. es6+最佳入门实践(8)
  20. js中特殊字符以及转义

热门文章

  1. linux修改对外访问ip_linux 同一个ip 绑定两个不同的域名 访问两个不同的项目
  2. pythonsuper多重继承_解决python super()调用多重继承函数的问题
  3. 订阅发布延时_Redis实时队列和延时队列的php实现
  4. 如何让循环里面语句执行完之后再去循环第二次_Go循环语句的使用
  5. 计算机应用基础精品课程申报表,计算机应用基础精品课程申报表(15页)-原创力文档...
  6. java linq select_Java 8是否还需要LINQ?还是已经比LINQ 更好?
  7. mysql优化 知乎_MYSQL优化
  8. python13文件_python中13个实用的文件操作
  9. Install Air Conditioning HDU - 4756(最小生成树+树形dp)
  10. 写个批处理脚本来帮忙干活--遍历文件夹字符串处理