浮動小数点数の扱い方(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
解説
今回は初めて登場したvldr
とvmov
について解説。
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
となる。