2012-12-19 45 views
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 

回答

1

不,我不相信你有什么是等价的。 sbb指令可能会将eax保留为零(全0位)或负1(全1位),这将肯定会影响and指令中从ecx中取出的值。

它看起来像原来的代码将推动esp+10h0,这取决于esi开始。

+0

为了说清楚:如果esi不为零,esp + 10h将被推送(即地址不是来自内存的值,由于'LEA')。 – Jester

+0

我可以认为esi寄存器被前面的函数用来存储参数传递给上面的那个? – user1917156

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 

负片从0减去EAX并且产生进位标志,除非EAX == 0; 当进位标志置位时,sbb a,a产生-1(否则为0),用作选择掩码。 cmov指令将比分支更快并不完全清楚。