我發現這個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