呼び出しの前にパラメータをスタックにプッシュする 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
命令はゼロ(すべて 0 ビット) または負の 1 (すべて 1 ビット) のままになる可能性があり、これは命令でeax
引き出された値に何が起こるかに確実に影響します。ecx
and
元のコードは、最初に何があったかに応じて、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
Neg は 0 から eax を減算し、eax==0 でない限りキャリー フラグを生成します。キャリー フラグが設定されている場合、sbb a,a は -1 (それ以外の場合は 0) を生成し、セレクション マスクとして使用されます。cmov 命令が分岐よりも高速であることは完全には明らかではありません。