我发现这个 asm 指令在调用之前将参数推入堆栈,但我认为有一些无用的指令。
mov eax,esi
neg eax
sbb eax,eax
lea ecx,[esp+10h]
and eax,ecx
push eax
我可以用以下内容替换这些说明:
lea ecx,[esp+10h]
push ecx
我发现这个 asm 指令在调用之前将参数推入堆栈,但我认为有一些无用的指令。
mov eax,esi
neg eax
sbb eax,eax
lea ecx,[esp+10h]
and eax,ecx
push eax
我可以用以下内容替换这些说明:
lea ecx,[esp+10h]
push ecx
不,我不相信你所拥有的是等价的。sbb
指令可能保留为零(全为 0 位)或负一(全为 1 位),这肯定会影响从指令中eax
提取的值发生的情况。ecx
and
看起来原始代码将推送esp+10h
或0
,这取决于esi
开始的内容。
您可以将这些指令替换为
lea eax, [esp+10]
test esi, esi
cmovz eax, esi ;; push zero (i.e. esi) iff esi==0
push eax
或者
test esi, esi
jz skip
lea esi, [esp+10]
skip: push esi
Neg 将从 0 中减去 eax 并产生进位标志,除非 eax==0; 设置进位标志时, sbb a,a 产生 -1(否则为 0),用作选择掩码。尚不清楚 cmov 指令是否会比分支更快。