AArch64でHello, World!
AArch64とは
Armアーキテクチャの64bit拡張。ARMv8-Aアーキテクチャより導入されている。
環境構築
いつも通り、GCCとQEMUのユーザーモードエミュレーションを使用する。
$ sudo apt install gcc-aarch64-linux-gnu qemu-user
コード
コメントアウトする時は//
を使用する。
.text .global main main: str x30, [sp, #-8]! ldr x0, =msg bl printf mov x0, #0 // return 0 ldr x30, [sp], #8 ret .data msg: .asciz "Hello, World!\n"
実行
$ aarch64-linux-gnu-gcc hello.s $ qemu-aarch64 -L /usr/aarch64-linux-gnu/ a.out Hello, World!
解説
str x30, [sp, #-8]!
x30をスタックに積んでいる。x30はリンクレジスタの役割を果たすため、Armでいうところのpush {lr}
である。
ldr x0, =msg
x0にmsgラベルのアドレスをロードしている。これはprintfの第一引数として使用される。
bl printf
printfを呼び出す。
mov x0, #0
C言語でいうreturn 0
。正常終了であることを意味する。
ldr x30, [sp], #8
スタックに積んでいたリンクレジスタの値を元に戻す。Armでいうpop {lr}
。
ret
関数終了。オペランドに何も指定しない場合は、ret x30
と同じ意味になる。