x86_64: x86_64 プログラミング
文法
mov w0, #5
右から左に代入される。
メモリアクセス
[x0]
はx0のアドレスのメモリを読む。Arm64 Assembly Languageの「A64 メモリアドレッシング」のところを見てしまうのが早い。
レジスタ
- 汎用レジスタ: 64bit 29個。X0-X29 (64bit) または W0-W28 (32bit)。
- フレームポインタ(FP): 汎用レジスタX29
- リンクレジスタ(LR): 汎用レジスタX30。関数呼出命令(BL)の実行後、戻り番地が入る。
- スタックポインタ(SP): 汎用レジスタX31。16バイトalign。
- FPUレジスタ: 128bit 32個。V0-V31 (128bit)。FPU命令からは64-bit以下でしかアクセスできない。 D0-D31(64bit), F0-F31(32bit), H0-H31(16bit), B0-B31(8bit)。
プレフィクス
-
X
: 64bit (例: X0) -
W
: 32bit (例: W0)
スタック
TODO
関数呼び出し
- 関数呼出しでは、整数の実引数は8個まではレジスタ(X0-X7 or W0-W7)に入れて、それ以上はスタックに積んで渡す。
- 関数呼出しでは、実数の実引数は8個まではレジスタ(V0-X7)に入れて、それ以上はスタックに積んで渡す。
- 関数呼出の返り値はX0 (W0) に入れて返す。構造体を返す場合は、構造体のアドレスをX8に入れて返す。浮動小数点数の場合は V0に入れて返す。
- 関数呼出しでは、X0-X18の値は保存されない(volatile)。X19-X29とSP(X31)は保存する必要がある(non-volatile)。
- 関数呼出しでは、V0-X7およびV16-V31の値は保存されない(volatile)。V8-V15は保存する必要がある(non-volatile)。
命令
TODO
命令サフィックス
TODO
開発環境
実行方法
a.s
.globl _main
.p2align 2
_main:
mov w0, #0
ret
$ clang a.s
$ ./a.out