我发现这个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
指令可能会将eax
保留为零(全0位)或负1(全1位),这将肯定会影响and
指令中从ecx
中取出的值。
它看起来像原来的代码将推动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
负片从0减去EAX并且产生进位标志,除非EAX == 0; 当进位标志置位时,sbb a,a产生-1(否则为0),用作选择掩码。 cmov指令将比分支更快并不完全清楚。
为了说清楚:如果esi不为零,esp + 10h将被推送(即地址不是来自内存的值,由于'LEA')。 – Jester
我可以认为esi寄存器被前面的函数用来存储参数传递给上面的那个? – user1917156