bamboo’s blog

Bambooの気まぐれブログ

浮動小数点数の扱い方(Arm)

はじめに

 Armには、浮動小数点数を扱うためのVFPと呼ばれる機構が用意されている。今回はこれを用いて、浮動小数点数の表示をしてみよう。

C言語

 今回例として作成する処理は、C言語で書くと以下のようになる。円周率3.14を表示するというものだ。

#include <stdio.h>

int main(void) {
    printf("%.2f\n", 3.14);
    return 0;
}

アセンブリ

 アセンブリで書くと以下のように書ける。

.fpu vfp
.text
.global main

main:
    push    {lr}
    ldr     r0, =value
    vldr    d0, [r0]
    ldr     r0, =msg
    vmov    r3, r2, d0
    bl      printf
    mov     r0, #0      @ return 0
    pop     {pc}

.data
msg:    .asciz  "%.2f\n"
value:  .double 3.14

実行。

$ arm-linux-gnueabi-gcc pai.s
$ ./a.out
3.14

解説

今回は初めて登場したvldrvmovについて解説。

vldr

 vldrは、指定したメモリから拡張レジスタに値をロードするという役割を持つ。上記の例では、直前にvalue(3.14がある場所)をr0に読み込んでいる。つまり、vldr d0, [r0]valueの実体(3.14)をd0に読み込んでいる。

vmov

 vmovは代入命令である。vmov Rd, Rn, Dmの形式の場合、上位bitはRnに、下位bitはRdに代入される。printfの第二引数にdouble型を指定する場合はr2とr3が使用されるため、vmov r3, r2, d0となる。