⚔️

習得アセンブリ 64bitレジスタの巻

に公開

86_64の汎用レジスタ偏

頭文字rであれば64bitレジスタである。

後に言うのも何ですが、これらの役割は「絶対」ではないので注意してください。(環境によって変わる)

最後が戻り値(rax)に帰るようになっていれば途中はなんでもいいとのこと。

覚えていたほうがいいのはrax, rbx, rcx, rdxらしい。

予習:スタック

  • caller保存とcallee保存
    • caller保存は壊してもいいもの : rax, rcx, rdx, rsi, rdi, r8~r11
    • callee保存は守る義務 : rbx, rbp, r12~r15
      これらが全てです。それ以上でもそれ以下でもありません。

caller = 呼ぶ側, 自分で関数呼び出しの前後で"値を維持したいレジスタの中身"(別の関数内で値が書き変わってしまう危険性あり)

mov rax, 10     ; この値を後でも使いたい!
call func       ; この関数内でraxという文字列があった場合上のやつが書き換えられてしまう(つまりほぼ確実に書き換えられますね)

callee = 呼ばれる側, 「関数の中」で保存がおきる。

まとめ

レジスタは全員で使っている共有メモ帳です

上のようにraxがcaller保存で関数の中に入ってきたら好きに壊していいですよと。
rbxはcallee保存であり関数内で使うなら元に戻す義務があります。

Discussion