我需要帮助才能理解这些装配说明

时间:2012-12-19 22:32:46

标签: assembly

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

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

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

lea ecx,[esp+10h]
push ecx

2 个答案:

答案 0 :(得分:1)

不,我不相信你所拥有的是等同的。 sbb指令可以将eax保留为零(全0位)或负1(全1位),这肯定会影响ecxand提取的值。 1}}指令。

看起来原始代码会推送esp+10h0,具体取决于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指令会比分支更快。