みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

x86の条件分岐命令の法則

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

x86の条件分岐命令の法則

投稿記事 by みけCAT » 7年前

x86の条件分岐命令(0x7*系)は、以下のようになっています。

CODE:

機械語  ニモニック  ジャンプする条件
70      JO          OF=1
71      JNO         OF=0
72      JB/JNAE/JC  CF=1
73      JNB/JAE/JNC CF=0
74      JZ/JE       ZF=1
75      JNZ/JNE     ZF=0
76      JBE/JNA     CF=1 OR ZF=1
77      JNBE/JA     CF=0 AND ZF=0
78      JS          SF=1
79      JNS         SF=0
7A      JP/JPE      PF=1
7B      JNP/JPO     PF=0
7C      JL/JNGE     SFOF
7D      JNL/JGE     SF=OF
7E      JLE/JNG     ZF=1 OR SFOF
7F      JNLE/JG     ZF=0 AND SF=OF
16種類あるように見えますが、よく見ると「チェックするフラグ8種類」×「全部0 or 少なくとも1つ1がある」となっていることがわかります。
さらに、最下位ビットが0のときは「少なくとも1つ1がある」、1のときは「全部0」の時にジャンプすることがわかります。
(「SF xor OF」という仮想フラグを導入すると、「SFOF」は「(SF xor OF)=1」、「SF=OF」は「(SF xor OF)=0」と書けます。)

さらに、この法則に気付くと、サイトの間違いを発見できることがあります。

分岐 (アセンブラ入門) (WebArchive)
「JBE / 以下なら(符号なし)」のフラグが「CF=1 and ZF=1」となってしまっています。
例えば0は0以下ですが、0から0を引いてもキャリーは発生しないはずなので、andとなっているのはおかしいでしょう。
また、「below or equal」であることから、「below」(CF=1)と「equal」(ZF=1)のorであることが予想できます。
なお、「JNA / 上じゃないなら=以下なら(符号なし)」のフラグは正しく「CF=1 or ZF=1」となっています。

coder32 edition | X86 Opcode and Instruction Reference 1.11 (WebArchive)
同様にJBE/JNAの条件が「CF=1 AND ZF=1」になってしまっています。
さらに、JZ/JEとJNZ/JNEの条件が入れ替わってしまっています。
演算結果がゼロのときはZF=1、ゼロでないときはZF=0になるでしょう。

Tips IA32(x86)命令一覧 Jから始まる命令 Jcc命令 (WebArchive)
今回対象の0x7*系ではないですが、後半の0x0Fから始まる方のJGの分岐条件が「ZF=0 or SF=OF」となってしまっています。
これではZF=0、すなわち等しくなければなんでもジャンプするということになってしまいます。
また、0x7*系の2バイト目は1バイトで飛び先を示す「cb」であるべきでしょうが、「0xCB」という誤解を招く表現になっています。
最後に編集したユーザー みけCAT on 2016年10月31日(月) 23:16 [ 編集 1 回目 ]
理由: 間違いの指摘を追加

コメントはまだありません。