x86-64の命令
何個あるねん
pushとpopは共に一つの引数を取るが、それぞれ意味しているものは別である
push
引数をスタックに入れる
asmpush 2 // `2`をスタックにpush
pop
スタックから取ったものを引数の場所へ入れる
asmpop rdi // スタックのトップにあるものをrdiレジスタへ移動
add
asmadd R1 R2 // R1+R2の結果をR1へ
sub
減算
mul
ex. mul rdi
↑rdiは例だよ
暗黙のうちにRAXを取ってそれを rdi
の値にかけて、その結果の上位32ビットをRDXに、下位32ビットをRAXにセットする
仕様がトリッキー
imul
符号付き乗算
暗黙的にRAXの値を引数の値に掛けて
その上位64bitをRDXへ
下位64bitをRAXへセットする
asmimul rdi // rax * rdi の結果の上位64bit→RDXへ、下位64bit→RAXへ
idiv
符号付き除算
ex. idiv 引数
暗黙のうちにRDXとRAXを取り、それを連結したものを128ビット整数とみなして、それを引数のレジスタの64ビットの値で割り、商をRAXへ、余りをRDXへセットする
cqo
RAXに入っている64bitの値を128bitに伸ばしてRDXとRAXにセット
cmp
スタックからpopした2つの整数を比較し、同一なら1、そうでなければ0をRAXにセット
結果はフラグレジスタにセットされる
フラグレジスタのみを更新する (減算命令の)sub
のようなもの
subでも大小関係がわかるが、subを使うとRAXが更新されてしまう
sete
引数に8ビットレジスタのレジスタ名を取る
ex. sete al
al
レジスタを引数にとっている
例えば直前のcmp命令の結果がtrueならalレジスタに1をセットする
直前のcmp命令の結果であるビットを、引数のレジスタにセットする
seteの最後のeはequalのe
setl
seteの <
版
setle
seteの <=
版
setne
seteの !=
版
movzb
ex. movzb rax al
al経由でraxを更新する
raxの上位56ビットを0にする
なんでこれ引数にal必要なの?

movzb rax
でraxを0クリアにする、じゃだめなの
#??asmsete al # alにフラグをセット
movzb rax # raxを0クリア
関数を呼び出す
callの次の命令のアドレスをスタックにpush
callの引数として与えられたアドレスにジャンプ
return
スタックからアドレスを1つポップ
そのアドレスにジャンプ
callの対になるもの
lea
Load Effective Address
sourceの値(Effective Address)をdestinationにコピーして入れる
?
任意のアドレスから値をロードする
s// sourceレジスタの値をアドレスとみなしてそこから値をロードし,Destinationに保存する
mov <Destination>, [source]
参考