汇编--控制转移指令 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 ;不溢出则转移
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
|
以上是关于汇编--控制转移指令 jmp的主要内容,如果未能解决你的问题,请参考以下文章
汇编指令JMP是啥意思?
关于汇编的段内转移
汇编语言--微机CPU的指令系统(转移指令)
汇编语言-其他转移指令CALL
汇编转移指令
汇编入门学习笔记 —— 转移指令