generated at
x86-64の命令


x86_64の命令 = Intel記法の命令?であってる?

何個あるねん

pushとpopは共に一つの引数を取るが、それぞれ意味しているものは別である
push
引数をスタックに入れる
asm
push 2 // `2`をスタックにpush
pop
スタックから取ったものを引数の場所へ入れる
asm
pop rdi // スタックのトップにあるものをrdiレジスタへ移動


add
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へセットする
x86_64には2つのレジスタを取る乗算命令はない
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
movzb rax でraxを0クリアにする、じゃだめなの #??
asm
sete 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]



参考