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
4

2 に答える 2

1

いいえ、あなたが持っているものが同等だとは思いません。sbb命令はゼロ(すべて 0 ビット) または負の 1 (すべて 1 ビット) のままになる可能性があり、これは命令でeax引き出された値に何が起こるかに確実に影響します。ecxand

元のコードは、最初に何があったかに応じて、esp+10hまたはのいずれかをプッシュするようです。0esi

于 2012-12-19T22:43:38.830 に答える
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

Neg は 0 から eax を減算し、eax==0 でない限りキャリー フラグを生成します。キャリー フラグが設定されている場合、sbb a,a は -1 (それ以外の場合は 0) を生成し、セレクション マスクとして使用されます。cmov 命令が分岐よりも高速であることは完全には明らかではありません。

于 2012-12-20T06:13:46.823 に答える