2012-12-19 78 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指令將比分支更快並不完全清楚。