0

我发现这个 asm 指令在调用之前将参数推入堆栈,但我认为有一些无用的指令。

mov eax,esi
neg eax
sbb eax,eax
lea ecx,[esp+10h]
and eax,ecx
push eax

我可以用以下内容替换这些说明:

lea ecx,[esp+10h]
push ecx
4

2 回答 2

1

不,我不相信你所拥有的是等价的。sbb指令可能保留为零(全为 0 位)或负一(全为 1 位),这肯定会影响从指令中eax提取的值发生的情况。ecxand

看起来原始代码将推送esp+10h0,这取决于esi开始的内容。

于 2012-12-19T22:43:38.830 回答
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 指令是否会比分支更快。

于 2012-12-20T06:13:46.823 回答