-
Notifications
You must be signed in to change notification settings - Fork 5
OpeLa Compiler MultiArch
OpeLa コンパイラ(opelac)は当初 x86-64 専用のコンパイラとして開発されましたが、2020/12/25 現在は AArch64 にも対応しています。 このページは OpeLa コンパイラのマルチアーキテクチャ対応状況を説明します。
opelac は -target-arch <arch>
オプションで出力アーキテクチャを変更できます。
現在対応しているのは x86_64
(デフォルト)と aarch64
です。
AArch64 は Arm プロセッサの動作モードの名前です。64 ビットレジスタが使えるモードです。
opelac が対応しているのは M1 Mac です。 AArch64 が使えるコンピュータは他にも Raspberry Pi 等がありますが、opelac が出力するアセンブラは今のところ Mach-O 形式専用なので、M1 Mac でしか動作しません。
複数のアーキテクチャに対応する際、考慮すべきポイントは次の通りです。
- 命令セット:x86-64 で実行できる命令セットか、AArch64 で実行できる命令セットか
- 実行可能ファイル形式:ELF か Mach-O か
- OS システムコール:どのように OS のシステムコールを呼ぶか
-
Introduction - OS X Assembler Reference: Mac OS X のアセンブラリファレンス。Mach-O バイナリを作るときの参考になる。
-
Assembler Directives: Mach-O のセクションの説明。
__TEXT,__text,regular,pure_instructions
の意味などが載っている。
-
Assembler Directives: Mach-O のセクションの説明。
- ARM64 ABI 規則の概要: 一般的な ARM64 ABI の説明
- Writing ARM64 Code for Apple Platforms: Mac 特有の ARM64 ABI の説明
int printf(const char* format, ...);
の ...
は引数省略の記号で、可変長引数を表すのに使われる。
...
には 0 個以上の引数を渡せる。
OpeLa で上記の関数の型は func (format *byte, ...) int
のように書く。
SystemV AMD64 ABI では可変長引数かどうかに関わらず、先頭から 6 個まではレジスタ渡し。
AArch64 でよく使われる EABI でも同様らしいが、M1 Mac が採用する ABI はそれとは異なっており、可変長引数は全てスタックで渡す。
printf
の例では format
が x0 レジスタで渡され、それ以降の引数はスタックで渡す事になる。