当前位置: 首页 > 工具软件 > JLE Icms > 使用案例 >

test jle

张可人
2023-12-01

请看一段代码(代码片段一)

...

.text:006EDA09 01C                 mov     eax, [esi+46h]
.text:006EDA0C 01C                 sub     eax, 10h
.text:006EDA0F 01C                 test    eax, eax
.text:006EDA11 01C                 jle     loc_6EDE7B

...

看起来是这个意思

取值到eax,

eax值减去0x10,

eax值 <= 0则跳转

写段C代码反汇编看下,

比如

a -= 16;
 if ( a > 0) {
  a = 1;
 }
 else {
  a = 2;
 }

查看反汇编发现比较用的是cmp 指令,而没有test 指令

而上面那段汇编代码有必要再仔细推敲一下

首先,回顾一下test指令

test, 属于逻辑运算指令,对两个操作数执行and 逻辑操作,根据结果设置标志寄存器,而结果本身并不会保存

语法:  TEST  r/m,  r/m/data

影响标志:  O、S、Z、P、C(其中O、C会被置为0 )

然后是jle 指令

属于条件跳转指令,用于有符号数比较,小于等于则跳

测试条件:(SF∀OF)∨ZF=1, 也就是ZF=1 OR SF≠OF

这样看来,在代码片段一中, test eax, eax,  导致 CF和OF 被清0,

如果eax值 为0,则ZF=1,即满足跳转条件的等于

如果SF=1,则SF≠OF,即满足跳转条件的小于

如果SF=0,则SF=OF,即大于的情况,不满足跳转条件。

总的来说,是上面理解的意思,但是由什么样的C++ 代码编译得到的,目前未知。


 类似资料:

相关阅读

相关文章

相关问答