1. ホーム
  2. assembly

[解決済み] アセンブリ - CMP後のJG/JNLE/JL/JNGE

2022-02-12 23:10:18

質問事項

を理解できません。 JG/JNLE/JL/JNGE CMPの後に来る命令です。

例えば If I have:

CMP al,dl
jg label1

いつ al=101; dl =200 .

を求めるものについて jg ? にあるのでしょうか? al>dl または al-dl>0 ?

次のコードでも同じプロブレムです。

test al,dl
jg label1

何を比較し、何に対して「"」を求めるのかがわからない。 jg "です。

つまり、label1 に飛ぶ場合と飛ばない場合がよくわからない。

どのように解決するのか?

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

次に jmp -型命令は、これらのフラグをチェックして、ジャンプを行うべきかどうかを判断します。

つまり、あなたが持っているコードの最初のブロック(私のコメントを追加したもの)です。

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

にジャンプします。 label1 もし al よりも大きかった。 dl .

と考えたほうがいいかもしれません。 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)では、実際には前者の方が大きくなります。もしそれが望まれたものでないなら、同等の符号なし比較を使用すべきです。

参照 ここで を参照してください。念のため、以下にジャンプの選択方法を示します。まず、符号付きが適切でないもの。

+--------+------------------------------+-------------+--------------------+
|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    |             |                    |
+--------+------------------------------+-------------+--------------------+