ARM アセンブラの定数
Cortex-A プログラマーズガイド(ARM DEN0013C)によると、アセンブラで扱える定数は
それとは別に、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 の値が期待通り表示されることを確認できました
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 の値が期待通り表示されることを確認できました