我发现这个asm指令在调用之前将参数压入堆栈,但我认为有一些无用的指令。
mov eax,esi
neg eax
sbb eax,eax
lea ecx,[esp+10h]
and eax,ecx
push eax
我可以用以下内容替换这些说明:
lea ecx,[esp+10h]
push ecx
答案 0 :(得分:1)
不,我不相信你所拥有的是等同的。 sbb
指令可以将eax
保留为零(全0位)或负1(全1位),这肯定会影响ecx
中and
提取的值。 1}}指令。
看起来原始代码会推送esp+10h
或0
,具体取决于esi
中的内容。
答案 1 :(得分:0)
您可以用
替换这些指令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指令会比分支更快。