web-dev-qa-db-ja.com

アセンブリJLE jmp命令の例

命令の jump family をどのように使用しますか?

これは彼らが持っているものです:

JLラベル
「それ」は、それ以下またはそれ以下の場合にジャンプします。

私の質問はこれはitとは何ですか?たとえば、ebxに変数があり、ebxthere:の場合、ラベル<= 10にジャンプしたいとします。

特に、 x86 ジャンプファミリの命令を使用することに興味があります。

16
bobobobo

ジャンプ自体は、EFLレジスタのフラグをチェックします。これらは通常、TESTまたはCMPで設定されます(または他の多くの命令の副作用として)。

CMP ebx,10
JLE there
  • CMPは、オペランドの差の計算、フラグの更新、および結果の破棄に相当します。通常、大小のチェックに使用されます
  • TESTは、オペランドのバイナリANDの計算、フラグの更新、および結果の破棄に相当します。通常、等価性チェックに使用されます。

参照: CMPにおけるアセンブリ言語の芸術

補足として: Intel reference manuals を取得する必要があります。特に、すべてのx86命令を説明する2つのパート「インテル®64およびIA-32アーキテクチャソフトウェア開発者向けマニュアル第2巻:命令セットリファレンス」。

16
CodesInChaos

JLE命令は、実際には2つのフラグを同時にテストします。

  • ゼロフラグZF
  • キャリーフラグ(CF

キャリーフラグとゼロフラグが1の場合、短い相対ジャンプが実行されます。

多分ちょうどCMP命令がどのように機能するかという言葉CMP命令はSUB(減算)に似ていますが、宛先レジスタは実行後に更新されません。したがって、次のコードはCMP ebx、1のような同じ結果を実行します。 CMPおよびSUB命令はフラグに影響します:キャリー、パリティ、補助、ゼロ、符号、オーバーフローフラグ。

Push   ebx            //store ebx value to stack
sub    ebx, 10
pop    ebx            //restore ebx value from stack
11
GJ.

X86アセンブリは、比較の結果を表すビットフラグのシステムを使用します。条件付きジャンプ命令は、ジャンプを実行するかどうかを決定するときにこれらのフラグを使用します。

あなたのケースでは、次の2つの指示を使用します。

cmp ebx, 10     ; compare EBX and 10
jle label       ; jump if the previous comparison is "less than or equal"
…
label:
…
4
Ondrej Tucny

JB-符号なしの数値を処理する(下にジャンプ)<

JL-符号付きの数値を扱う

mov bx,0     // BX := 0
cmp bx,FF    // 0 < -1 or 0 < 255 (Jump Flag and Sign Flag will change)
jl  butter   // if you use JL jump will not occurs, cus 0 > -1
jb  butter   // if you use JB jump will occurs, cus 0 < 255
1
Mario Augusto