web-dev-qa-db-ja.com

アセンブリ言語jeジャンプ関数

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

私にお知らせください。

ところで、違いがある場合は、NASMを使用しています。

16
QAH

EAX5と等しいかどうかを確認し、その比較結果に基づいてさまざまなアクションを実行するとします。つまり、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 ...
20
bcat

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

例:(メモリが正しく機能する場合、これは正しいです:-)

cmp eax、ebx; EAXからEBXを減算します-結果は破棄されます
;ただし、FLAGSレジスタは結果に応じて設定されます。
 je .SomeLabel;結果がゼロの場合(つまり、等しい場合)、あるラベルにジャンプします。
;これも「jz」と同じ命令です。
13
asveikau

Je funcは、ゼロフラグが設定されているかどうかをテストしてから、別の場所にジャンプするか、次の命令に進むことです。

test cx, cx
je   some_label

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

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

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

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

8
wljackhero

通常、jeの前にcmp(またはtestまたは同等のもの)を置きます。これにより、EFLAGSレジスタにフラグが設定されます。 NASMのシンプルなエコーサーバーへの link は、一般的に役立つ可能性があります。迷惑なGoogle広告は無視してください。

jeの使用例は次のようになります。

    cmp eax, ebx
    je  RET_FAIL
    jmp RET_SUCCESS

RET_FAIL:
    Push 1
    pop  eax
    ret

RET_SUCCESS:
    Push 0
    pop eax
    ret
2
mrduclaw

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

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

1
QAH