アセンブラでの比較演算
from 比較演算子の実装
アセンブラでの比較演算
code:s
pop rdi
pop rax
cmp rax, rdi
sete al
movzb rax, al
同一なら1、違えば0をRAXに出力する
やってること
cmpでフラグレジスタに結果保存
seteでal (RAXの下位ビット)にコピー
movzbでRAXのal以外の上位ビットをゼロクリア
解説
cmpはフラグレジスタに結果を出力する
フラグレジスタは整数演算や比較演算命令が実行されるたびに更新されるレジスタで、
結果が0かどうかといったビットや、
桁あふれが発生したかどうかというビット、
結果が0未満かどうかといったビットなどを持っています。
フラグレジスタは通常の整数レジスタではない
RAXに比較結果をセットしたい場合、フラグレジスタの特定のビットをRAXにコピーしてくる必要があります。
sete命令で行う
sete命令は、直前のcmp命令で調べた2つのレジスタの値が同じだった場合に、
指定されたレジスタ(ここではAL)に1をセットします。
それ以外の場合は0をセットします。
実はALはRAXの下位8ビットを指す別名レジスタにすぎません。
従ってseteがALに値をセットすると、自動的にRAXも更新されることになります。
ただし、RAXをAL経由で更新するときに上位56ビットは元の値のまま
RAX全体を0か1にセットしたい場合、上位56ビットはゼロクリアする必要があります。
それを行うのがmovzb命令
sete命令が直接RAXに書き込めればよいのですが、seteは8ビットレジスタしか引数に取れない仕様
比較命令では、このように2つの命令を使ってRAXに値をセットすることになります。
https://gyazo.com/9f5b86785413668ceb201b51ae1904d9
seteの代わりに別の命令を使うことで、その他の比較演算子を実装することができます。
<ではsetl、
<=ではsetle、
!=ではsetneを使うようにしてください。