x86-64の命令
何個あるねん
pushとpopは共に一つの引数を取るが、それぞれ意味しているものは別である
push
引数をスタックに入れる
code:asm
push 2 // 2をスタックにpush
pop
スタックから取ったものを引数の場所へ入れる
code:asm
pop rdi // スタックのトップにあるものをrdiレジスタへ移動
add
code:asm
add R1 R2 // R1+R2の結果をR1へ
sub
減算
mul
ex. mul rdi
↑rdiは例だよ
暗黙のうちにRAXを取ってそれをrdiの値にかけて、その結果の上位32ビットをRDXに、下位32ビットをRAXにセットする
仕様がトリッキー
imul
符号付き乗算
暗黙的にRAXの値を引数の値に掛けて
その上位64bitをRDXへ
下位64bitをRAXへセットする
code:asm
imul 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必要なの?mrsekut.icon
movzb raxでraxを0クリアにする、じゃだめなの #?? code:asm
sete al # alにフラグをセット
movzb rax # raxを0クリア
関数を呼び出す
callの次の命令のアドレスをスタックにpush
callの引数として与えられたアドレスにジャンプ
return
スタックからアドレスを1つポップ
そのアドレスにジャンプ
callの対になるもの
lea
Load Effective Address
sourceの値(Effective Address)をdestinationにコピーして入れる
?
任意のアドレスから値をロードする
code:s
// sourceレジスタの値をアドレスとみなしてそこから値をロードし,Destinationに保存する
参考