test jle

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

...

.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++ 代码编译得到的,目前未知。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值