汇编--控制转移指令 jmp

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编--控制转移指令 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  ;不溢出则转移

JPJPE;奇偶位为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来判断的
(注意:无符号数的比较在这里用高于和低于,有符号数的比较在这里用大于小于)

跳转相关的标志位:

11109876543210
OFDFIFTFSFZF 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

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

以上是关于汇编--控制转移指令 jmp的主要内容,如果未能解决你的问题,请参考以下文章

汇编指令JMP是啥意思?

关于汇编的段内转移

汇编语言--微机CPU的指令系统(转移指令)

汇编语言-其他转移指令CALL

汇编转移指令

汇编入门学习笔记 —— 转移指令