面倒なので、フラグチェックを、サブルーチン化してみる。
; ; EFLAGSの指定ビットをチェックする ; ECX=チェックビット ; 指定ビットが変更可能であればCF=1 ; checkflg: PUSH EAX ; EAXレジスタの内容を退避 PUSH EBX ; EBXレジスタの内容を退避 ; 指定ビットをテスト&反転 PUSHFD ; フラグレジスタの内容を退避 POP EAX ; フラグレジスタの内容をEAXレジスタに転写 BTC EAX, ECX ; EAXレジスタのECXレジスタで指定されるビットを反転 PUSH EAX ; EAXレジスタの内容を退避 POPFD ; EAXレジスタの内容をフラグレジスタに転写 ; 再度、指定ビットをテスト&反転 PUSHFD ; フラグレジスタの内容を退避 POP EBX ; フラグレジスタの内容をEBXレジスタに転写 BTR EBX, ECX ; EBXレジスタのECXレジスタで指定されるビットを反転 PUSH EBX ; EBXレジスタの内容を退避 POPFD ; EBXレジスタの内容をフラグレジスタに転写 ; 指定ビットが変更不可能であれば、そもそも、フラグの値は変わらない ; 指定ビットが変更可能であれば、二回の反転で、元に戻る ; EAXには、指定ビットが反転した内容が格納される。 ; EBXには、指定ビットが変更可能であれば、元の値の内容が格納される。 ; もし、指定ビットが変更不可能であれば、EAXと同じ内容が格納される。 ; よって、EAXとEBXの排他的論理和を求めて、 ; 0である場合、変更出来なかったと判断できる。 CLC ; 一度キャリーフラグをクリアする XOR EAX, EBX ; EAXとEBXの排他的論理和を求める JZ checkflgfin ; 0であれば終了 STC ; そうでなければ、キャリーフラグオン checkflgfin: POP EBX POP EAX RET
これで任意のフラグをチェック出来るようになった。