欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

Win32ASM学习[17]:条件跳转

发布时间:2023/12/1 56 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Win32ASM学习[17]:条件跳转 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

 一.跳转相关的标志位:

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位寄存器

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

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

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

 

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

 

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

 

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

 

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

 

 

 

 

总结

以上是生活随笔为你收集整理的Win32ASM学习[17]:条件跳转的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。