Win32ASM学习[17]:条件跳转

来源:互联网 发布:keynote在windows播放 编辑:程序博客网 时间:2024/06/11 16:59

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

 一.跳转相关的标志位:

11

10

9

8

7

6

5

4

3

2

1

0

OF

DF

IF

TF

SF

ZF

 

AF

 

PF

 

CF


 

 

 








 条件码:
①OF(Overflow Flag)溢出标志。溢出时为1,否则置0。
②SF(Sign Flag)符号标志。结果为负时置1,否则置0.
③ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0.
④CF(Carry Flag)进位标志,进位时置1,否则置0.
⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。有进位时1,否则置0.
⑥PF(Parity Flag)奇偶标志。结果操作数中1的个数为偶数时置1,否则置0.

控制标志位:
⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。

⑧IF(Interrupt Flag)中断标志。
⑨TF(Trap Flag)陷井标志,单步中断。

二.条件跳转的分类

(1).标志寄存器FR中有6个标志是状态的,它反映运算结果的情况。6个状态中除AF半进位标志外,其余5个标志可以反映10种不同的条件

故单条件跳转指令有10种

jc                              CF=1;则转移

jnc                            CF=0;则转移  

 

je\jz                          ZF=1;jmp

jne\jnz                      ZF=0;jmp

 

js                              SF=1;jmp           

jns                            SF=0;jmp

 

jo                             OF=1;jmp

jno                           OF=0;jmp

 

jp\jpe                       PF=1;jmp

jnp\jpo                     PF=0;jmp

(2).无符号数条件跳转指令

用于无符号数的条件跳转指令如下

ja\jnbe                     大于则跳转           >     则转移, CF 或 ZF = 0;

jae\jnb                     大于等于则跳转    >=   则跳转,   CF = 0;

jna\jbe                     小于则跳转          <      则转移,  CF 或 ZF = 0;

jb\jnae                     小于等于则跳转    <=   则跳转,  CF = 1;

(3).带符号数的比较

JG/JNLE                 大于则跳             >      则跳,        SF 或 OF 或 ZF = 0则跳 

JGE/JNL                 大于等于则跳      >=    则跳,        SF 或 OF = 0 则跳

JL/JNGE                 小于则跳             <      则跳,        SF 或 OF = 1 则跳  

JLE/JNG                 小于等于则跳      <=    则跳,        SF 或 OF 或 ZF = 1则跳

 

用带符号数和无符号数的条件转移指令时,必须严格加以区别,否则会得到错误的结果

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

三.无条件跳转

操作码伪码指令含义

EB  cb
JMP rel8相对短跳转(8位),使rel8处的代码位下一条指令
E9  cw
JMP rel16相对跳转(16位),使rel16处的代码位下一条指令
FF  /4
JMP r/m16绝对跳转(16位),下一指令地址在r/m16中给出
FF  /4
JMP r/m32绝对跳转(32位),下一指令地址在r/m32中给出
EA  cb
JMP ptr16:16远距离绝对跳转, 下一指令地址在操作数中
EA  cb
JMP ptr16:32远距离绝对跳转, 下一指令地址在操作数中
FF  /5
JMP m16:16远距离绝对跳转, 下一指令地址在内存m16:16中
FF  /5
JMP m16:32远距离绝对跳转, 下一指令地址在内存m16:32中

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

 四.16位/32位寻址方式(fisheep译 fisheep@sohu.com)

操作码
伪码指令
跳转含义
跳转类型
跳转的条件(标志位)
0F 87  cw/cd
JA rel16/32
大于
near
(CF=0 and ZF=0)
0F 83  cw/cd
JAE rel16/32
大于等于
near
(CF=0)
0F 82  cw/cd
JB rel16/32
小于
near
(CF=1)
0F 86  cw/cd
JBE rel16/32
小于等于
near
(CF=1 or ZF=1)
0F 82  cw/cd
JC rel16/32
进位
near
(CF=1)
0F 84  cw/cd
JE rel16/32
等于
near
(ZF=1)
0F 84  cw/cd
JZ rel16/32
为0
near
(ZF=1)
0F 8F  cw/cd
JG rel16/32
大于
near
(ZF=0 and SF=OF)
0F 8D  cw/cd
JGE rel16/32
大于等于
near
(SF=OF)
0F 8C  cw/cd
JL rel16/32
小于
near
(SF<>OF)
0F 8E  cw/cd
JLE rel16/32
小于等于
near
(ZF=1 or SF<>OF)
0F 86  cw/cd
JNA rel16/32
不大于
near
(CF=1 or ZF=1)
0F 82  cw/cd
JNAE rel16/32
不大于等于
near
(CF=1)
0F 83  cw/cd
JNB rel16/32
不小于
near
(CF=0)
0F 87  cw/cd
JNBE rel16/32
不小于等于
near
(CF=0 and ZF=0)
0F 83  cw/cd
JNC rel16/32
不进位
near
(CF=0)
0F 85  cw/cd
JNE rel16/32
不等于
near
(ZF=0)
0F 8E  cw/cd
JNG rel16/32
不大于
near
(ZF=1 or SF<>OF)
0F 8C  cw/cd
JNGE rel16/32
不大于等于
near
(SF<>OF)
0F 8D  cw/cd
JNL rel16/32
不小于
near
(SF=OF)
0F 8F  cw/cd
JNLE rel16/32
不小于等于
near
(ZF=0 and SF=OF)
0F 81  cw/cd
JNO rel16/32
未溢出
near
(OF=0)
0F 8B  cw/cd
JNP rel16/32
不是偶数
near
(PF=0)
0F 89  cw/cd
JNS rel16/32
非负数
near
(SF=0)
0F 85  cw/cd
JNZ rel16/32
非零(不等于)
near
(ZF=0)
0F 80  cw/cd
JO rel16/32
溢出
near
(OF=1)
0F 8A  cw/cd
JP rel16/32
偶数
near
(PF=1)
0F 8A  cw/cd
JPE rel16/32
偶数
near
(PF=1)
0F 8B  cw/cd
JPO rel16/32
奇数
near
(PF=0)
0F 88  cw/cd
JS rel16/32
负数
near
(SF=1)
0F 84  cw/cd
JZ rel16/32
为零(等于)
near
(ZF=1)

注:一些指令操作数的含义说明:
  rel8      表示 8 位相对地址
  rel16    表示 16 位相对地址
  rel16/32  表示 16或32 位相对地址
  r/m16    表示16位寄存器
  r/m32    表示32位寄存器

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

 另外有其他的  在补充   ^_^

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

 

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

 

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

 

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

 

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