汇编--控制转移指令 jmp

跳转指令分三类:
一、无条件跳转: JMP;
二、根据 CX、ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转)、JECXZ(ECX 为 0 则跳转);
三、根据 EFLAGS 寄存器的标志位跳转, 这个太多了.

JMP 无条件转移指令

1、段内直接短转移

2、段内直接近转移

3、段内间接近转移

4、段间直接远转移

5、段间间接远转移


条件转移指令

1)根据单个条件标志的设置情况转移:

JZ(JE)   ;为 0(等于) 则跳转   jump if zero,
JNZ(JNE)  ;不为 0(等于) 则跳转
JS   ;结果为负则转移     sign
JNS  ;结果为正则转移

JO   ;溢出则转移    overflow
JNO  ;不溢出则转移


JP(JPE)     ;奇偶位为1则跳转  parity
JNP(JPO)     ;奇偶位为0则跳转
JB(或JNAE,或JC)   ;低于,或者不高于或等于,或进位为1则转移
JNB(或JAE,或JNC)  ;不低于,或者高于或等于,或进位为零则转移

2)比较两个无符号数,并根据比较结果转移

JB(JNAE或JC)其实就是 JNAE: jump not above and equal 低于,即不高于且不等于,或进位位为1 则转移
JB   ;无符号小于则跳转
JNB  ;无符号不小于则跳转

JBE  ;无符号小于等于则跳转
JNBE ;无符号不小于等于则跳
但执行这条语句JB  之前先用CMP来比较2个无符号数,CMP比较无符号数后影响的是CF,所以JB应该是通过CF来判断的
(注意:无符号数的比较在这里用高于和低于,有符号数的比较在这里用大于小于)

跳转相关的标志位:

11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF   AF   PF   CF

     






D16  即为及其指令中的位移量

CALL  RET  都不影响条件码


中断指令

INT     中断

INTO     溢出则中断

IRET     从中断返回

由于每个中断向量占有4个字节单元。所以中断指令中指定的类型号N需要乘以4才能取得所制定类型的中断向量



处理机控制与杂项操作指令

1、标志处理指令

CLC ; CF=0
STC ; CF=1
CMC ; CF=NOT CF
CLD ; DF=0
STD ; DF=1
CLI ; IF=0(应慎用)
STI ; IF=1

2、其它处理机控制与杂项操作指令

  NOP(NO Operation)   无操作指令  该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代.(占位的作用,延时作用)

  HLT(halt)停机指令     该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序.

  WAIT(wait)等待指令  该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续德行.

  ESC(escape)换码指令  其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件.

  LOCK(lock)封锁指令  该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止  . 当CPU与其他处理机协同工作时 , 该指令可避免破坏有用信息.

  这些指令可以控制处理机状态.这们都不影响条件码.

  BOUND 界限指令 

  ENTER imm16,imm8   建立堆栈帧

  LEAVE   释放堆栈帧


1、JMP(无条件转移指令)

执行代码的跳转,分为两种,一:段内转移,即要跳过去的代码地址和当前地址在同一段,这时只要修改IP(专用寄存器--指令指针)即可;二:段间转移:即要跳过去的代码地址和当前代码地址不在同一段内,需要同时修改CS和IP的值。

写法:

1、JMP label;若label与该指令位于同一代码段内,IP=label的偏移地址,否则CS:IP=label的分段地址,简单的说,就是跳到label的地址去。

2、JMP reg16/mem16;段内转移,偏移地址=reg16/[mem16]

3、JMP mem32;段间间接转移,段地址CS=mem32高字,偏移地址IP=mem32低字。

说明:当操作数是内存操作数时,若内存操作数是双字类型,则产生段间转移,若内存操作数是字类型,则产生段内间接转移。当不能确定类型时,编译器将报错。

32、Jcc(条件转移指令)

写法:Jcc label;

作用:若条件成立,则IP=label的偏移地址,否则,CPU将忽略该条件转移,继续执行下一条指令。

条件转移有以下几种形式:

表一:测试单个标志位的Jcc指令:


Jcc指令


描述


转移条件


JC,JB,JNAE


有进位时转移


CF=1


JNC,JNB,JAE


无进位时转移


CF=0


JZ,JE


为零(相等)时转移


ZF=1


JNZ,JNE


非零(不等)时转移


ZF=0


JS


为负时转移


SF=1


JNS


为正时转移


SF=0


JO


溢出时转移


OF=1


JON


不溢出时转移


OF=0


JP,JPE


‘1’的个数为偶数时转移


PF=1


JNP,JPO


‘1’的个数为奇数时转移


PF=0

表二:用于带符号数比较的Jcc指令(常用在CMP指令之后,以判断带符号数的大小)


Jcc指令


描述


转移条件


JG,JNLE


大于(不小于等于)时转移


SF=OF且ZF=0


JGE,JNL


大于等于(不小于)时转移


SF=OF


JL,LNGE


小于(不大于等于)时转移


SF<>OF


JLE,LNG


小于等于(不大于)时转移


SF<>OF或ZF=1

表三:用于无符号数比较的Jcc指令(常用在CNO指令之后,以判断无符号数的大小)


Jcc指令


描述


转移条件


JA,JNBE


大于(不小于等于)时转移


CF=0且ZF=0


JAE,JNB,JNC


大于等于(不小于)时转移


CF=0


JB,LNAE,JC


小于(不大于等于)时转移


CF=1


JBE,LNA


小于等于(不大于)时转移


ZF=1或CF=1

时间: 2024-12-28 15:35:17

汇编--控制转移指令 jmp的相关文章

汇编--控制转移指令

跳转指令分三类:一.无条件跳转: JMP;二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转);三.根据 EFLAGS 寄存器的标志位跳转, 这个太多了. JMP 无条件转移指令 1.段内直接短转移 2.段内直接近转移 3.段内间接近转移 4.段间直接远转移 5.段间间接远转移 条件转移指令 根据标志位跳转的指令: JZ ;为 0 则跳转 jump if zero, JNZ ;不为 0 则跳转 JE ;等于则跳转 jump if equ

标志寄存器PSW和汇编条件转移指令解释

标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW)   标志寄存器PSW是一个16为的寄存器.它反映了CPU运算的状态特征并且存放某些控制标志.8086使用了16位中的9位,包括6个状态标志位和3个控制标志位. CF(进位标志位):当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0.ZF零标志位:若当前的运算结果为零,则ZF为1,否则为0.SF符号标志位:该标志位与运算结果的最高位相同.即运算结果为负,则SF为1,否则为0.OF溢出标志位:若运算结果超出机器能

Jvm(47),指令集----控制转移指令

控制转移指令可以让Java虚拟机有条件或无条件地从指定的位置指令而不是控制转移指令的下一条指令继续执行程序,从概念模型上理解,可以认为控制转移指令就是在有条件或无条件地修改PC寄存器的值.控制转移指令如下. 条件分支:ifeq.iflt.ifle.ifne.ifgt.ifge.ifnull.ifnonnull.if_icmpeq. if_icmpne.if_icmplt.if_icmpgt.if_icmple.if_icmpge.if_acmpeq和if_acmpne. 复合条件分支:table

(二十三)控制转移指令

一.概念 二.案例 源代码 public class Test { public static void main(String []args){ int age = 10; if( age > 10 ){ System.out.println(" > 10"); }else{ System.out.println(" < = 10"); } String userName = "admin"; } } javap -verbo

汇编中精妙的流程控制

汇编中精妙的流程控制 前言 今天一天挺废啊,百无聊赖啊,唉,也不想学习,看了一天的电视了,不过好在我还是想看看OS中的东西,这次咱们一起来看看一个特别有趣的内容,就是汇编级的语言,如何利用寄存器实现if/for/while这些高级语言的流程控制,这一点十分神奇.保证你绝对想不到在汇编中是这样实现平时的流程控制的. 正文 条件码寄存器 这个子标题在之前就出现过,条件码寄存器与普通的寄存器不同,他们都是1位寄存器,换句话说,它们当中的值只有0和1.当有算数与逻辑发生时,这些条件码寄存器当中的值会相应

王爽汇编笔记

  第一章 内存地址空间的地址段分配 地址:0~7FFFH的32kb空间为主随机存储器的地址空间 地址:8000~9FFFH的8kb空间为显存地址空间 地址:A000~FFFFH的24kb空间为各个rom的地址空间   第二章 进入DOS模式 重新启动计算机,进入DOS模式,此时进入的是实模式的DOS 在Windows中进入DOS方式,此时进入的是虚拟8086模式的DOS   使用命令 -R 查看寄存器内容 -R 寄存器 可以修改寄存器的内容 -D查看内存中的内容 –D 段地址:偏移地址 输入后

16位汇编第八讲指令第四讲

16位汇编第八讲指令第四讲 一丶串操作类指令 1.什么是串操作? 1.串操作指令是8086指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,在操作主存连续区域 的数据是,特别好用.因而比较常用 简而言之,就是内存中的一段数据,拷贝/读取/修改... 到另一块另内存 重点掌握  MOVS  STOS  LODS CMPS SCAS REP 2.串操作的简介 1.串操作指令的操作数,是驻村中连续存放的数据串(String 注意string表示串的意思)--也就是一段数据在内存中 是连续的,

对X86汇编的理解与入门

本文描述基本的32位X86汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令.逻辑计算指令.算数运算指令),以及函数的调用规则.个人认为:在理解了本文后,基本可以无障碍地阅读绝大部分标准X86汇编程序.当然,更复杂的指令请参阅Intel相关文档. 1 寄存器. 主要寄存器如下图所示: X86处理器中有8个32位的通用寄存器.由于历史的原因,EAX通常用于计算,ECX通常用于循环变量计数.ESP和EBP有专门用途,ESP指示栈指针(用于指示

学习linux内核时常碰到的汇编指令(1)

 转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符.宏扩展时不识别符号和字符串中的形式参数,如果在形式参数前面加上一个& 记号,宏汇编程序就能够用实在参数代替这个形式参数了. $∶地址计数器的值——记录正在被汇编程序翻译的语句地址.每个段均分配一个计数器,段内定义的所有标号和变量的偏移地址就是当前汇编地址计数器的值. ?∶操作数.在数据定义语句中,操作