AArch64アセンブリでフィボナッチ数を求める
AArch64(ARM 64ビットアーキテクチャ)の練習がてら、M1 Mac上のAArch64アセンブリでフィボナッチ数を求めるプログラムを作成した。
適当な数字を出力
まずは適当な数字を画面へ出力してみる
code:fibonacci.S
.text
.globl _main
.align 2
_main:
// fpとlrをスタックへ退避
// 適当な数字を出力
mov x0, 4649
bl print_int
// fpとlrをスタックから復元
ldp fp, lr, sp, 16 // pop {fp, lr} // exit
mov x0, 0 // return code
mov x16, 1 // terminate = 1
svc 0x80
print_int:
stp fp, lr, sp, -16! // fpとlrをスタックへ退避 mov x2, x0
adr x0, printf_fmt // フォーマット文字列
bl _printf
add SP, SP, 16 // スタックをクリア
ldp fp, lr, sp, 16 // fpとlrをスタックから復元 ret
printf_fmt: .asciz "%d\n"
実行すると「4649」が出力される
code:sh
$ gcc fibonacci.S -o fibonacci
$ ./fibonacci
4649
フィボナッチ数を求める
次はフィボナッチ数を求める
code:fibonacci.S
// fibonacci.S
.text
.globl _main
.align 2
_main:
// fpとlrをスタックへ退避
// fib(10) を求める
mov x0, 10
bl fibonacci
bl print_int
// fpとlrをスタックから復元
ldp fp, lr, sp, 16 // pop {fp, lr} // exit
mov x0, 0 // return code
mov x16, 1 // terminate = 1
svc 0x80
fibonacci:
stp fp, lr, sp, -16! // fpとlrをスタックへ退避 mov x19, x0 // nの値をx19へ退避
mov x1, 1
cmp x0, x1
bgt greater_than_1
beq eq_1
smaller_than_1: // x < 1
mov x0, 0
b fibonacci_fin
eq_1: // x = 1
mov x0, 1
b fibonacci_fin
greater_than_1: // x > 1
mov x20, 0
mov x21, 0
// x20 = fib(n-1)
sub x0, x19, 1
bl fibonacci
mov x20, x0
// x21 = fib(n-2)
sub x0, x19, 2
bl fibonacci
mov x21, x0
// result(x0) = x20 + x21
add x0, xzr, x20
add x0, x0, x21
fibonacci_fin:
ldr x21, sp, 16 // x21をスタックから復元 ldr x20, sp, 16 // x20をスタックから復元 ldr x19, sp, 16 // x19をスタックから復元 ldp fp, lr, sp, 16 // fpとlrをスタックから復元 ret
print_int:
stp fp, lr, sp, -16! // fpとlrをスタックへ退避 mov x2, x0
adr x0, printf_fmt // フォーマット文字列
bl _printf
add SP, SP, 16 // スタックをクリア
ldp fp, lr, sp, 16 // fpとlrをスタックから復元 ret
printf_fmt: .asciz "%d\n"
ビルドして実行すると、10番目のフィボナッチ数の55が出力される
code:sh
$ gcc fibonacci.S -o fibonacci
$ ./fibonacci
55
参考リンク