59

JG/JNLE/JL/JNGECMP の後に続く指示がわかりません。

たとえば、私が持っている場合:

CMP al,dl
jg label1

いつal=101; dl =200

私たちが尋ねるものについてjg?オンal>dlですか?またはal-dl>0

次のコードで同じ問題:

test al,dl
jg label1

私たちが何を比較しているのか、何を尋ねているのか理解できませんjg

つまり、いつ label1 にジャンプし、いつジャンプしないのかわかりません。

4

4 に答える 4

129

を実行するcmp a,bと、計算したかのようにフラグが設定されますa - b

次に、jmp-type 命令がこれらのフラグをチェックして、ジャンプを行う必要があるかどうかを確認します。

言い換えれば、あなたが持っているコードの最初のブロック (私のコメントが追加されています):

cmp al,dl     ; set flags based on the comparison
jg label1     ; then jump based on the flags

が より大きいlabel1場合にのみジャンプします。aldl

おそらく次のように考えたほうがよいでしょうal > dlが、そこにある 2 つの選択肢は数学的に同等です。

al > dl
al - dl > dl - dl (subtract dl from both sides)
al - dl > 0       (cancel the terms on the right hand side)

jg値が署名されていることを前提としているため、使用するときは注意が必要です。したがって、バイト101 (2 の補数で 101) と 200 (2 の補数で -56) を比較すると、実際には前者の方が大きくなります。それが望ましくない場合は、同等の符号なし比較を使用する必要があります。

ジャンプ選択の詳細については、こちらを参照してください。完全を期すために以下に再現されています。まず、signed-ness が適切でないもの:

+--------+------------------------------+-------------+--------------------+
|Instr   | Description                  | signed-ness | Flags              |
+--------+------------------------------+-------------+--------------------+
| JO     | Jump if overflow             |             | OF = 1             |
+--------+------------------------------+-------------+--------------------+
| JNO    | Jump if not overflow         |             | OF = 0             |
+--------+------------------------------+-------------+--------------------+
| JS     | Jump if sign                 |             | SF = 1             |
+--------+------------------------------+-------------+--------------------+
| JNS    | Jump if not sign             |             | SF = 0             |
+--------+------------------------------+-------------+--------------------+
| JE/    | Jump if equal                |             | ZF = 1             |
| JZ     | Jump if zero                 |             |                    |
+--------+------------------------------+-------------+--------------------+
| JNE/   | Jump if not equal            |             | ZF = 0             |
| JNZ    | Jump if not zero             |             |                    |
+--------+------------------------------+-------------+--------------------+
| JP/    | Jump if parity               |             | PF = 1             |
| JPE    | Jump if parity even          |             |                    |
+--------+------------------------------+-------------+--------------------+
| JNP/   | Jump if no parity            |             | PF = 0             |
| JPO    | Jump if parity odd           |             |                    |
+--------+------------------------------+-------------+--------------------+
| JCXZ/  | Jump if CX is zero           |             | CX = 0             |
| JECXZ  | Jump if ECX is zero          |             | ECX = 0            |
+--------+------------------------------+-------------+--------------------+

次に、署名されていないもの:

+--------+------------------------------+-------------+--------------------+
|Instr   | Description                  | signed-ness | Flags              |
+--------+------------------------------+-------------+--------------------+
| JB/    | Jump if below                | unsigned    | CF = 1             |
| JNAE/  | Jump if not above or equal   |             |                    |
| JC     | Jump if carry                |             |                    |
+--------+------------------------------+-------------+--------------------+
| JNB/   | Jump if not below            | unsigned    | CF = 0             |
| JAE/   | Jump if above or equal       |             |                    |
| JNC    | Jump if not carry            |             |                    |
+--------+------------------------------+-------------+--------------------+
| JBE/   | Jump if below or equal       | unsigned    | CF = 1 or ZF = 1   |
| JNA    | Jump if not above            |             |                    |
+--------+------------------------------+-------------+--------------------+
| JA/    | Jump if above                | unsigned    | CF = 0 and ZF = 0  |
| JNBE   | Jump if not below or equal   |             |                    |
+--------+------------------------------+-------------+--------------------+

そして最後に、署名されたもの:

+--------+------------------------------+-------------+--------------------+
|Instr   | Description                  | signed-ness | Flags              |
+--------+------------------------------+-------------+--------------------+
| JL/    | Jump if less                 | signed      | SF <> OF           |
| JNGE   | Jump if not greater or equal |             |                    |
+--------+------------------------------+-------------+--------------------+
| JGE/   | Jump if greater or equal     | signed      | SF = OF            |
| JNL    | Jump if not less             |             |                    |
+--------+------------------------------+-------------+--------------------+
| JLE/   | Jump if less or equal        | signed      | ZF = 1 or SF <> OF |
| JNG    | Jump if not greater          |             |                    |
+--------+------------------------------+-------------+--------------------+
| JG/    | Jump if greater              | signed      | ZF = 0 and SF = OF |
| JNLE   | Jump if not less or equal    |             |                    |
+--------+------------------------------+-------------+--------------------+
于 2012-03-08T12:55:37.060 に答える
5

Wikibooks には、ジャンプの説明のかなり良い要約があります。基本的に、実際には 2 つの段階があります。

cmp_instruction op1, op2

結果に基づいてさまざまなフラグを設定します。

jmp_conditional_instruction address

これらのフラグの結果に基づいてジャンプを実行します。

Compare( cmp) は基本的に減算op1-op2を計算しますが、これは保存されません。代わりに、フラグの結果のみが設定されます。したがって、それを行った場合は、それが正、負、またはゼロのいずれであるかに基づいて、どのフラグを設定するかを決定することcmp eax, ebxと同じです。eax-ebx

詳細なリファレンスはこちらです。

于 2012-03-08T12:55:56.177 に答える
0

コマンド JG は単に次のことを意味します: Jump if Greater . 前の命令の結果は、特定のプロセッサ フラグに格納され (この場合、ZF=0 および SF=OF かどうかをテストします)、ジャンプ命令はその状態に従って動作します。

于 2012-03-08T13:02:40.407 に答える