请看一段代码(代码片段一)
...
.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++ 代码编译得到的,目前未知。