[解決済み] アセンブリ - 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 | | |
+--------+------------------------------+-------------+--------------------+
関連
-
[解決済み】バイナリーボム - フェーズ4
-
[解決済み] callq命令とは何ですか?
-
[解決済み] MIPSプログラムの中で`lw`と`sw`が実際にどのように機能するかを理解する
-
[解決済み] アセンブリでは、`PTR`は何の略ですか?
-
[解決済み] MIPSアセンブリ言語では、なぜ.globl mainを使うのですか?
-
[解決済み] CS:IPの組み立ての意味と仕組みについて教えてください。
-
[解決済み] LC3 LEA 命令と格納された値
-
[解決済み] movqアセンブリ機能
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン