汇编跳转指令使用总结

虽然jmp指令提供了控制转移,但是它不允许进行任何复杂的判断。80x86条件跳转指令提供了这种判断。条件跳转指令是创建循环和实现其他条件执行语句。条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置;如果匹配失败,CPU忽略该条件跳转指令而继续执行下一条指令。条件跳转指令有一个限制:目标标号的位置必须在跳转指令本身附近32768字节范围内,这通常对应着8000~32000条机器指令。一般情况下不会超过这种限制。

用自己的话总结:条件跳转指令是指jz,jg..等等指令,这些指令跳转方式是根据标志位的状态进行跳转,而设置这些标志的常见指令为cmp和test指令,所以他们经常搭配使用(应该是必须的)。即跳转指令前一行要吗有cmp指令要吗有test指令。

汇编标志位:

标志名                          标志 1              标志 0

OF (溢出标志)                 OV                  NV

DF  (方向标志)                                         UP                  DN

IF (中断标志)                 DI                  EI

SF (符号标志位)               PL                  NG

ZF (零标志)                   NZ                  ZR

AF (辅助进位标志位)           NA                  AC

PF (奇偶标志)                 PO                  PE

CF (进位标志)                 NC                  CY

反汇编窗口,对应的标志位(双击后面的数字可改变其状态)

Test和cmp指令的区别

test属于逻辑运算指令
Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。
举例:
Test的一个非常普遍的用法是用来测试一方寄存器是否为空:
test ecx, ecx
jz somewhere
如果ecx为零,设置ZF零标志为1,Jz跳转

--------------------------------------------

CMP属于算术运算指令
CMP比较.(两操作数作减法,仅修改标志位,不回送结果). 
cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志).
举例:
Cmp eax, 2;       如果eax-2=0即eax=2就设置零标志为1
Jz ****;          如果设置了零标志就跳转

============================================

得出的结论
test逻辑与运算结果为零,就把ZF(零标志)置1;
cmp 算术减法运算结果为零,就把ZF(零标志)置1.


指 令


描 述


条 件


别 名


相 反 指 令


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

使用无符号数比较的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

使用有符号数比较的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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 汇编语言无效指令错误概述

    问题:cmpxchg8b 指令比较一个8字节值edx和EAX带有8字节值内存( 目的地操作数). 只有有效目标操作数用于此指令是内存 操作数. 如果目标操作数是一个寄存器处理器应产生一个 无效OpCode例外,执行的指令cmpxchg8b应当停止和 处理器应该执行无效OpCode异常处理程序. 此错误发生是 锁定前缀为使用cmpxchg8b指令与一个(无效)寄存器目的地 操作数. 在这种情况下,处理器可能无法启动执行无效OpCode 异常处理程序,因为总线已锁定. 这将导致系统挂起. 提示:如果

  • 从汇编看c++函数的默认参数的使用说明

    在c++中,可以为函数提供默认参数,这样,在调用函数的时候,如果不提供参数,编译器将为函数提供参数的默认值.下面从汇编看其原理. 下面是c++源码: 复制代码 代码如下: int add(int a = 1, int b = 2) {//参数a b有默认值    return a + b;}int main() {   int c= add();//不提供参数 } 下面是mian函数里面的汇编码: 复制代码 代码如下: ; 4    : int main() { push    ebp    m

  • 汇编语言rep movsd 的使用详解

    mov esi,offset @s1mov edi,offset @s2 mov ecx,10cld rep movsd 1.rep movsd 每次ecx!=0便执行movsd ,然后ecx=ecx-1 movsd移动ds:[si] 到es:[di],在32位汇编下可以用esi代替si,edi代替di 2.同时由于在一般exe中ds = es 程序起始位置所以另esi = offset @s1就可以找到变量s1 ,edi= offset @s2就可以找到变量s2 3.movsd此类指令有个性质

  • 从汇编看c++中默认构造函数的使用分析

    c++中的源程序: 复制代码 代码如下: class X {private:    int i;}; int main() {    X x;} 上面的类X没有定义构造函数,仅仅有一个int i. 下面为其汇编程序: 复制代码 代码如下: ; 7    : int main() { push    ebp;ebp为一个寄存器,总是指向一个函数调用堆栈的栈底,作为基址,用偏移量来访问该调用栈上的变量,但这里没有任何变量要访问,因此不起作用     mov    ebp, esp;这两句的作用是为了

  • 汇编语言超浓缩教程

    所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样).某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了.为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ--).但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP.WINRAR-依次压迫,嘿嘿!

  • 从汇编看c++的默认析构函数的使用详解

    c++中,如果没有为一个类提供析构函数,那么编译器会为这个类提供默认的析构的函数.由于析构函数的功能和构造函数相反,因此和默认的构造函数类似,编译器也会提供无用的默认的析构函数,和非无用的析构函数.两者的分析情况一样(对于默认的构造函数分析,请参看<从汇编看c++中默认构造函数的使用分析>).并且编译器会提供非无用的默认析构函数情形和默认构造函数类似: 1 类含有虚成员函数(类继承自虚基类或者继承的基类含有虚成员函数,也属于这种情况) 2 类继承自一个基类,基类含有自定义析构函数(如果基类没有

  • 汇编语言 口算异或xor小结

    复制代码 代码如下: 123 145 167 189 1AB 1CD 1EF 246 257 28A 29B 2CE 2DF 347 356 38B 39A 3CF 3DE 48C 49D 4AE 4BF 58D 59C 5AF 5BE 68E 69F 6AC 6BD 78F 79E 7AD 7BC

  • 汇编语言常见错误信息中文注解

    本文的目标是收集大部分汇编中常见错误信息及对其的中文注解,方便大家在写汇编程序时能够快速地定位错误并解决问题. ml.exe错误信息: 复制代码 代码如下: FATAL   严重错误 cannot open file不能打开文件 I/O error closing fileI/O错误 正在关闭文件 I/O error writing fileI/O错误 正在写文件 I/O error reading file            I/O错误 正在读取文件 out of memory      

  • 汇编跳转指令使用总结

    虽然jmp指令提供了控制转移,但是它不允许进行任何复杂的判断.80x86条件跳转指令提供了这种判断.条件跳转指令是创建循环和实现其他条件执行语句.条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置:如果匹配失败,CPU忽略该条件跳转指令而继续执行下一条指令.条件跳转指令有一个限制:目标标号的位置必须在跳转指令本身附近32768字节范围内,这通常对应着8000-32000条机器指令.一般情况下不会超过这种限制. 用自

  • 汇编语言 跳转指令与C语言的条件分支

    跳转指令 跳转指令也是一个组的指令,称为j组.其中jmp为无条件跳转,其余为条件跳转 上图为j组指令,可结合条件码访问指令加深理解 在机器指令水平上理解如何对跳转指令编码 如上图,通过反汇编软件得到机器指令与汇编语言,其中左边为机器指令编码,右边为对应汇编语言含义,最左边为每条机器指令地址 jmp指令的对应机器指令有两个字节:eb表示这是jmp指令,03描述跳转信息.值得注意的是,跳转指令进行编码时,采用相对位置编码,如03描述的就是偏移量 结合实例进行理解:在未执行jmp指令时,rip寄存器存

  • 汇编语言:比较指令、跳转指令、JCC的使用

    一.JMP 指令:修改EIP 当前运行的下一条指令 JMP 寄存器/立即数        目标类似:  mov  EIP,寄存器/立即数 CALL指令:  调用函数  CALL 地址A/寄存器        等价:                 PUSH 地址B           :保存call的下一条指令地址,压栈,作为返回值,                MOV EIP,地址A/寄存器            : 将函数首地址作为EIP RET指令:        等价:LEA ESP,

  • 汇编语言软件延时1s的实现方法

    对于不同的计算机,因为其主频不同,延时1s的参数也不相同,计算延时的方法如下: 计算机主频:x (Hz) 一条LOOP语句执行始终周期数:y 所需要延时的时间:z (s) 需要执行的语句数:a z=y*(1/x)*a 计算得到所需的执行语句数编写程序. 例:(计算机主频为3GHz) delay proc near push bx push cx mov bx,400h for1:mov cx,0ffffh for2:loop for2 dec bx jnz for1 pop cx pop bx

  • 常用的汇编指令与技巧(收藏)

    1.数据传送指令:mov move r1,r2 /*r1=r2*/ move r1,#4096 /*r1=4096*/ 2.大范围的地址读取指令:ldr ldr r1,=0x123456789 /*r1=0x123456789*/ ldr r1,=label /*获取绝对地址,即label的地址*/ label: -- 3.内存访问指令(当ldr后面没有=号时为内存读取指令) 读取指令:ldr ldr r1 ,[r2,#4] /*将内存地址为r2+4的数据读取到r1中,相当于C语言中的*操作*/

  • C 表达式中的汇编指令

    asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析. asm 表达式有两种形式,第二种 asm-qualifiers 包含了 goto 语句. 第一种形式为常见的用法,AssemblerTemplate 和 OutputOperands 必须存在, 其中 Clobbers 存在需要 InputOperands 也出现. asm asm-qualifiers ( AssemblerTemplate : Outpu

  • 汇编语言:x86汇编指令大全及其注意事项

    目录 Part 1:instruction Part 2 2.1 (逻辑)运算.移位等常用指令 2.1 (逻辑)运算.移位等常用指令 2.2 循环移位指令 2.3 数据串操作指令 2.4 逻辑运算指令 2.5 基于大小关系的跳转指令 2.6 基于单标志位的转移指令 Part 1:instruction 积少成多,持续更新.(这将会是一个极其漫长的过程) 表格中各条指令的顺序根据笔者所认为的重要或常用程度进行排序,仅供参考. Part 2 本表格中所涉及的F是指状态寄存器,CF指进位标志位,其它以

  • 汇编优化提示

    你需记住的最重要的事情就是代码花费的时间!不同的方法可以加速你的代码或者不能,所以你要多多尝试.因而计算代码花费的时间来看看你尝试的每个方法是否可以提速是件很重要的事情. :=========================初级========================= <1>释放所有8-CPU寄存器,以使它们用于你自己的代码中 复制代码 代码如下: push ebx push esi push edi push ebp :必须在改变ESP之前完成 :装载ESI.EDI和其他传递栈中值

  • 一个简单的花指令伪装器-Delphi版木马彩衣

    说明:以VC++6的花指令为例说明 //VC++6外衣 1 OEPCODEFIVE: THEAD = ($55, $8B, $EC, $6A, $FF, $68, $00, $00, $00, $00, $68, $00, $00, $00, $00, $64, $A1, $00, $00, $00, $00, $50, $64, $89, $25, $00, $00, $00, $00, $83, $EC, $68, $53, $56, $57, $58, $58, $58, $83, $C4

  • C语言ASM汇编内嵌语法详解

    3 GCC Inline ASM GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM--GCC内联汇编.这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达的指令直接潜入C/C++代码中,另外也允许我们直接写 C/C++代码中使用汇编编写简洁高效的代码. 1.基本内联汇编 GCC中基本的内联汇编非常易懂,我们先来看两个简单的例子: __asm__("movl %esp,%eax"); // 看起来很熟悉吧! 或者是 __asm__(&q

随机推荐