機械語 ニモニック ジャンプする条件
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
さらに、最下位ビットが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」という誤解を招く表現になっています。