アセンブリ
ここでの話は、特に明記しない限り、linux/x86環境下での話である
操作の対象(operand)
ソースオペランド:入力
ディスティネーションオペランド:出力
EFLAGSレジスタ
https://gyazo.com/f7bc089e56df22ab8c43eb4639bc3915
0. CF : キャリーフラグ。最後の算術演算操作で加算においてレジスタの大きさを越えてビットのキャリー(桁上がり)かボロー(桁借り)をした場合にセットされる。これは、キャリーの生じた加算やボローの生じた減算の次の操作がされた場合に、1個のレジスタだけ扱うことのできる値であるか確認するのに使われる。
2. PF : パリティフラグ。結果の最下位バイトに値1 のビットが偶数個含まれている場合にセットされ、奇数個の場合にはクリアされる。
4. AF : 調整フラグ。2進化10進 (BCD) 演算の算術演算でキャリーまたはボローが生じたらセットされる。
6. ZF : ゼロフラグ。演算の結果がゼロ (0) になった場合にセットされる。演算結果がゼロ(全部のビットが0)のとき1,それ以外のとき0になる.
7. SF : 符号フラグ。操作の結果が負となった場合にセットされる。
8. TF : トラップフラグ。ステップバイステップのデバッギングをする場合にセットする。
9. IF : 割り込み可能フラグ。割り込みを有効化したい場合にセットする。
10. DF : 方向フラグ。ストリームの方向を制御する。セットするとストリング命令においてポインタがデクリメントされる(通常はインクリメントされる)。
11. OF : オーバーフローフラグ。符号付き算術演算の結果がレジスタに格納できないほど大きい値になった場合にセットされる。
12-13. IOPL : I/O特権レベルフィールド(2ビット)。現在のプロセスのI/O特権レベルを示す。
14. NT : ネストタスクフラグ。割り込みチェーンを制御する。現在のプロセスが次のプロセスにリンクされている場合にセットされる。
16. RF : 再開フラグ。デバッグ例外への応答を制御する。
17. VM : 仮想8086モード。8086互換モードにある場合にセットされる。
18. AC : アラインメントチェックフラグ。メモリチェックでアラインメントチェックが有効な場合にセットされる。
19. VIF : 仮想割り込みフラグ。IFの仮想イメージ。
20. VIP : 仮想割り込み保留フラグ。割り込みが保留されている場合にセットされる。
21. ID : 識別フラグ。セットできればCPUID命令がサポートされる。
レジスタ
rsp は 汎用レジスタ兼スタックポインタ
EAXレジスタは、RAXレジスタの下位32ビット
MOVZX
インテル表記
インテル表記は、WindowsアセンブラやMicrosoft Visual Studioで使用されます。この表記法では、ソースと宛先の順序がAT&T表記と異なります。
mov eax, 1 ; eaxに1を格納する
add ebx, eax ; eaxの値をebxに加算する
インテル表記は [A] <- [B]
つまり [ディスティネーションオペランド] <- [ソースオペランド]
AT&T表記
AT&T表記は、GNUアセンブラやUnix系OSで使用されます。この表記法では、ソースと宛先の順序がインテル表記に対して逆転しています。
movl $1, %eax # %eaxに1を格納する
addl %eax, %ebx # %eaxの値を%ebxに加算する
AT&T表記は [A] -> [B]
つまり [ソースオペランド] -> [ディスティネーションオペランド]
高速化
以下の情報は検証中のものなので、鵜呑みにしないように
eflagsが変更される条件
add命令で結果が負の値になった時
[CF AF SF]が立ち、[ZF]が消える?
imul命令で結果が桁溢れしない程度の正の整数値になった時
[CF AF SF ZF]が消える?
[PF IF]はそのまま?