アセンブリ言語関数「je」の使用法をオンラインで見つけようとしています。je は等しい場合はジャンプを意味することを読みましたが、それはまさに私が望んでいることです。この関数の実際の使用法、つまり、この関数を入力して値をチェックし、それが何かと等しい場合にジャンプする方法は?
私にお知らせください。
ところで、それが違いを生む場合、私はNASMを使用しています。
アセンブリ言語関数「je」の使用法をオンラインで見つけようとしています。je は等しい場合はジャンプを意味することを読みましたが、それはまさに私が望んでいることです。この関数の実際の使用法、つまり、この関数を入力して値をチェックし、それが何かと等しい場合にジャンプする方法は?
私にお知らせください。
ところで、それが違いを生む場合、私はNASMを使用しています。
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 ...
これは、レジスタ内の「等しいフラグ」(「ゼロ フラグ」とも呼ばれます)FLAGSが設定されている場合にジャンプします。これは、算術演算、または や などの命令の結果として設定されTESTますCMP。
例:(記憶が正しければ、これは正しいです:-)
cmp eax、ebx ; EAX から EBX を引きます -- 結果は破棄されます
; ただし、FLAGS レジスタは結果に従って設定されます。
je .SomeLabel ; 結果が 0 の場合 (つまり、それらが等しい場合)、ラベルにジャンプします。
; これも「jz」と同じ命令です。
je func は、ゼロフラグが設定されているかどうかをテストしてから、別の場所にジャンプするか、次の命令に進むことだと言わざるを得ません。
test cx, cx
je some_label
テスト命令は、2 つのオペランドのビットごとの AND を実行し、AND の結果に従って FLAG を設定します。次に、je 命令は ZERO フラグを使用して、ジャンプするか続行するかを決定します。
上記のコードは、cx がゼロかどうかを確認するために使用されます。
注: je は等しいかどうかをテストするのではなく、この前に何らかの命令によって設定された ZERO フラグをテストします。
通常、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
さて、私はついに私の答えを見つけました。:P 基本的に、cmp 呼び出しの後に je label_to_jump_to を呼び出します。
cmp が 2 つの値が等しいことを示す場合、je は指定されたラベルにジャンプします。そうでない場合は、実行の流れが維持されます。