0

私はアセンブリプログラミングの初心者です。私は整数を持っていaます。間にパフォーマンスの違いがあるかどうかを理解しようとしていました

if(a >= 0)

if(a > -1)

というわけで、上記の分解を進めました。私のx86マシンでは、

if(a >= 0)

以下に逆アセンブルします。

cmp         dword ptr [ebp-4],0
jl          main+43h (00401053)

と、

if(a > -1)

以下に逆アセンブルします。

cmp         dword ptr [ebp-4],0FFh
jle         main+43h (00401053)

これらのプログラムの CPU サイクルを計算するプログラムをすぐに作成できます (まだ作成していません)。しかし、私は今、別の問題に直面しています。

cmpを実行し、 、、、、および/またはフラグを適切subに設定することを理解しています。また、a が基準を確認することも理解しています。ここのオペレーターは何ですか?SFZFPFCFOFAFjlSF <> OF<>

jl私が使用したリファレンスEIPcmp arg2, arg1

  1. arg2 < arg1 であり、演算にオーバーフローがない
  2. arg2 < arg1 で、演算にオーバーフローがある

リファレンスには、 のjl場合はジャンプしないとも書かれていarg2 == arg1ます。

2 番目の質問は、の場合と?の場合はいつjlジャンプすべきではないということです。arg2 <= arg1if(a <= 0)arg2 < arg1if(a < -1)

誰かがこれを理解するのを手伝ってくれますか?

4

1 に答える 1

1

<>演算子は「等しくない」、つまり!=Cと同じことを意味します。

if(a <= 0) の場合、arg2 <= arg1 のときに jl ジャンプしてはいけません

あなたの状態はa >= 0、ではありませんa <= 0。がjl行うことは、 の場合に実行されるコードのチャンクをスキップすることですa >= 0

つまり、次のようなものです。

cmp a,0   
jl end_if  ; jump past the body of the if-statement if the condition is false,
           ; i.e. a < 0
; code that should be executed if a >= 0 goes here
; ...
end_if:
于 2013-04-30T08:26:14.837 に答える