やまものブログ

メモ書きブログです (^_^;A

ARM アセンブラの定数

Cortex-A プログラマーズガイド(ARM DEN0013C)によると、アセンブラで扱える定数は
8-bit 定数を右に4-bit値(0-15)*2bit ローテートした値
だそうです。例えば、0xFF とか 0xFF000000 など。
それとは別に、MOVW/MOVT の2命令を使うと任意の32bit値も扱えるそうです。

あまり美しくないですが、以下のコードで試してみました。

#include <stdio.h>

int main(int argc, char *argv[])
{
        register unsigned int i0;
        asm volatile("MOV r0, #0xFF;");
        asm volatile("MOV r0, #0xFC000003;");
        asm volatile("MOV r0, #0xFF000000;");
        //asm volatile("MOV r0, #0xFE000001;"); // Error: invalid constant
        asm volatile("MOVW r0, #:lower16:0x12345678;");
        asm volatile("MOVT r0, #:upper16:0x12345678;");
        asm volatile("MOV %0, r0;" : "=r"(i0));
        printf("%x\n", i0);
        return 0;
}

最後の printf で、0xFE000001 以外の 0xFF ~ 0x12345678 の値が期待通り表示されることを確認できました