bamboo’s blog

Bambooの気まぐれブログ

AArch64でHello, World!

AArch64とは

 Armアーキテクチャの64bit拡張。ARMv8-Aアーキテクチャより導入されている。

環境構築

 いつも通り、GCCQEMUユーザーモードエミュレーションを使用する。

$ 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と同じ意味になる。