21

アセンブリ言語関数「je」の使用法をオンラインで見つけようとしています。je は等しい場合はジャンプを意味することを読みましたが、それはまさに私が望んでいることです。この関数の実際の使用法、つまり、この関数を入力して値をチェックし、それが何かと等しい場合にジャンプする方法は?

私にお知らせください。

ところで、それが違いを生む場合、私はNASMを使用しています。

4

5 に答える 5

22

EAXが と等しいかどうかを確認5し、その比較の結果に基づいてさまざまなアクションを実行するとします。つまり、if 文です。

  ; ... some code ...

  cmp eax, 5
  je .if_true
  ; Code to run if comparison is false goes here.
  jmp short .end_if
.if_true:
  ; Code to run if comparison is true goes here.
.end_if:

  ; ... some code ...
于 2009-10-17T19:14:03.953 に答える
14

これは、レジスタ内の「等しいフラグ」(「ゼロ フラグ」とも呼ばれます)FLAGSが設定されている場合にジャンプします。これは、算術演算、または や などの命令の結果として設定されTESTますCMP

例:(記憶が正しければ、これは正しいです:-)

cmp eax、ebx ; EAX から EBX を引きます -- 結果は破棄されます
                ; ただし、FLAGS レジスタは結果に従って設定されます。
je .SomeLabel ; 結果が 0 の場合 (つまり、それらが等しい場合)、ラベルにジャンプします。
                ; これも「jz」と同じ命令です。
于 2009-10-17T19:11:50.853 に答える
13

je func は、ゼロフラグが設定されているかどうかをテストしてから、別の場所にジャンプするか、次の命令に進むことだと言わざるを得ません。

test cx, cx
je   some_label

テスト命令は、2 つのオペランドのビットごとの AND を実行し、AND の結果に従って FLAG を設定します。次に、je 命令は ZERO フラグを使用して、ジャンプするか続行するかを決定します。

上記のコードは、cx がゼロかどうかを確認するために使用されます。

  • cx がゼロの場合、test はゼロ フラグを設定し、je はある場所にジャンプします。
  • cx がゼロでない場合、test はゼロ フラグを設定せず、je は後続の命令を実行し続けます。

注: je は等しいかどうかをテストするのではなく、この前に何らかの命令によって設定された ZERO フラグをテストします。

于 2011-05-25T03:40:28.673 に答える
2

通常、EFLAGS レジスタにフラグを設定する(または同等の) を前にje付けます。一般的に役立つNASMの単純なエコーサーバーへのリンクを次に示します。迷惑な Google 広告は無視してください。cmptest

の使用例は次のjeとおりです。

    cmp eax, ebx
    je  RET_FAIL
    jmp RET_SUCCESS

RET_FAIL:
    push 1
    pop  eax
    ret

RET_SUCCESS:
    push 0
    pop eax
    ret
于 2009-10-17T19:11:48.910 に答える
0

さて、私はついに私の答えを見つけました。:P 基本的に、cmp 呼び出しの後に je label_to_jump_to を呼び出します。

cmp が 2 つの値が等しいことを示す場合、je は指定されたラベルにジャンプします。そうでない場合は、実行の流れが維持されます。

于 2009-10-17T19:10:52.680 に答える