ARM 簡易マニュアル


目次


ARM ステートと THUMB ステート

ARM ステートは命令長 32 ビット、THUMB ステートは命令長 16 ビット。
それぞれ .code 32、.code 16 という疑似命令で書き始める。

データの扱い

GBA ではリトルエンディアン(Intel と同じ並び)になっている。
ビット数 名称 データ記述 メモリ確保記述
8 byte .byte .ds.b
16 halfword .hword .ds.w
32 word .word .ds.l

オペレーティングモード

モード 略称 モードビット 説明
User usr 10000 通常モード
FIQ fiq 10001 データ転送用高速割り込み
IRQ irq 10010 汎用割り込み
Supervisor svc 10011 OS 用プロテクトモード
Abort mode abt 10111 データ/命令フェッチ失敗時
Undefined und 11011 未定義命令実行時
System sys 11111 OS 用特権モード

レジスタ

基本的に R0-R15 と PSR があり、オペレーティングモードによって バンク切り替えされるレジスタがいくつかある。全て 32 ビット。
R14 は bl 命令(Branch with Link:サブルーチンコール命令) の戻り先を格納する。
R15 はプログラムカウンタ。
PSR はステータスレジスタ。詳しくは後述。

ARM ステート時

usr,sys fiq irq svc abt und
R0 R0 R0 R0 R0 R0
R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2
R3 R3 R3 R3 R3 R3
R4 R4 R4 R4 R4 R4
R5 R5 R5 R5 R5 R5
R6 R6 R6 R6 R6 R6
R7 R7 R7 R7 R7 R7
R8 R8_fiq R8 R8 R8 R8
R9 R9_fiq R9 R9 R9 R9
R10 R10_fiq R10 R10 R10 R10
R11 R11_fiq R11 R11 R11 R11
R12 R12_fiq R12 R12 R12 R12
R13 R13_fiq R13_irq R13_svc R13_abt R13_und
R14 R14_fiq R14_irq R14_svc R14_abt R14_und
R15(PC) R15(PC) R15(PC) R15(PC) R15(PC) R15(PC)
CPSR CPSR CPSR CPSR CPSR CPSR
  SPSR_fiq SPSR_irq SPSR_svc SPSR_abt SPSR_und

THUMB ステート時

ARM ステートと名前が同じものは、実体も同じ。
SP(Stack Pointer)は R13、LR(Link Register)は R14 に 割り当てられている。
R8〜R12 へのアクセスも、いくつかの命令で可能。
usr,sys fiq irq svc abt und
R0 R0 R0 R0 R0 R0
R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2
R3 R3 R3 R3 R3 R3
R4 R4 R4 R4 R4 R4
R5 R5 R5 R5 R5 R5
R6 R6 R6 R6 R6 R6
R7 R7 R7 R7 R7 R7
SP SP_fiq SP_irq SP_svc SP_abt SP_und
LR LR_fiq LR_irq LR_svc LR_abt LR_und
PC PC PC PC PC PC
CPSR CPSR CPSR CPSR CPSR CPSR
  SPSR_fiq SPSR_irq SPSR_svc SPSR_abt SPSR_und

アセンブラでの記述

CPSR、SPSR は cpsr、spsr と小文字で書く必要がある。 また _fiq などのモードは付けない。その代わり _all や _flg を付ける。詳しくは mrs、msr 命令参照。
R10〜R15 に関しては、以下の記述でも同じ。
レジスタ 別名
R10 SL
R11 FP
R12 IP
R13 SP
R14 LR
R15 PC

PSR(Program Status Registers)

CPSR は Current〜、SPSR は Saved〜の略。
普段は CPSR が使用され、SPSR は CPSR の待避に使われる。
3322
1098       76543210
NZCV... ...IFTMMMMM

N : Negative/Less Than
Z : Zero
C : Carry/Borrow/Extend
    減算時、Z80 や 68000 などとは値が逆なので注意。
    たとえば a-b を計算した場合、a<b だと 0 になる。
V : Overflow
I : IRQ disable
F : FIQ disable
T : State bit
    0 で ARM ステート、1 で THUMB ステート。
    CPSR 操作命令で書き換えてはいけない。必ず bx 命令を使う。
M : Mode bits
  10000 User
  10001 FIQ(Fast Interrupt reQuest)
  10010 IRQ(Interrupt ReQuest)
  10011 Supervisor
  10111 Abort
  11011 Undefined
  11111 System

割り込み

割り込み発生時、以下の番地にジャンプする。
ベクタ 割り込み種類 モード
0x00000000 Reset Supervisor
0x00000004 Undefined instruction Undefined
0x00000008 Software interrupt Supervisor
0x0000000c Abort(prefetch) Abort
0x00000010 Abort(data) Abort
0x00000014 reserved -
0x00000018 IRQ IRQ
0x0000001c FIQ FIQ

割り込み優先順位は以下の通り。









Reset
Data abort
FIQ
IRQ
Prefetch abort
Data abort
Undefined instruction, Software interrupt

ARM・THUMB 共通事項


ARM 命令一覧

注意事項

命令一覧


THUMB 命令一覧

注意事項

命令一覧

THUMB 命令 対応する ARM 命令 備考
mov Rd,#Offset8 movs Rd,#Offset8  
mov Rd,Hs mov Rd,Hs  
mov Hd,Rs mov Hd,Rs  
mov Hd,Hs mov Hd,Hs  
mvn Rd,Rs mvns Rd,Rs  
lsl Rd,Rs,#Offset5 movs Rd,Rs,lsl #Offset5  
lsl Rd,Rs movs Rd,Rd,lsl Rs  
lsr Rd,Rs,#Offset5 movs Rd,Rs,lsr #Offset5  
lsr Rd,Rs movs Rd,Rd,lsr Rs  
asr Rd,Rs,#Offset5 movs Rd,Rs,asr #Offset5  
asr Rd,Rs movs Rd,Rd,asr Rs  
ror Rd,Rs movs Rd,Rd,ror Rs  
ldr Rd,[pc,#Imm] ldr Rd,[r15,#Imm] Imm は 4 の倍数で、0〜1020 まで
ldr Rd,[Rb,Ro] ldr Rd,[Rb,Ro]  
ldr Rd,[Rb,#Imm] ldr Rd,[Rb,#Imm] Imm は 4 の倍数で、0〜124 まで
ldr Rd,[sp,#Imm] ldr Rd,[r13,#Imm] Imm は 4 の倍数で、0〜1020 まで
ldrb Rd,[Rb,Ro] ldrb Rd,[Rb,Ro]  
ldrb Rd,[Rb,#Offset5] ldrb Rd,[Rb,#Offset5]  
ldrh Rd,[Rb,Ro] ldrh Rd,[Rb,Ro]  
ldrh Rd,[Rb,#Imm] ldrh Rd,[Rb,#Imm] Imm は 2 の倍数で、0〜62 まで
ldsb Rd,[Rb,Ro] ldrsb Rd,[Rb,Ro] ldrsb と記述してもいい
ldsh Rd,[Rb,Ro] ldrsh Rd,[Rb,Ro] ldrsh と記述してもいい
str Rd,[Rb,Ro] str Rd,[Rb,Ro]  
str Rd,[Rb,#Imm] str Rd,[Rb,#Imm] Imm は 4 の倍数で、0〜124 まで
str Rd,[sp,#Imm] str Rd,[r13,#Imm] Imm は 4 の倍数で、0〜1020 まで
strb Rd,[Rb,Ro] strb Rd,[Rb,Ro]  
strb Rd,[Rb,#Offset5] strb Rd,[Rb,#Offset5]  
strh Rd,[Rb,#Imm] strh Rd,[Rb,#Imm] Imm は 2 の倍数で、0〜62 まで
push <Rlist> stmdb r13!,<Rlist> r0〜r7、lr が指定可能
pop <Rlist> ldmia r13!,<Rlist> r0〜r7、pc が指定可能
ldmia Rb!,<Rlist> ldmia Rb!,<Rlist> r0〜r7 が指定可能
stmia Rb!,<Rlist> stmia Rb!,<Rlist> r0〜r7 が指定可能
b <Raddr> b <Raddr> Raddr は PC+4 から符号付き 12 ビットで表せる範囲
b<Cond> <Raddr> b<Cond> <Raddr> Raddr は PC+4 から符号付き 9 ビットで表せる範囲
bal は存在しない
bl <Raddr> bl <Raddr> Raddr は PC+4 から符号付き 23 ビットで表せる範囲
2 ハーフワード命令
サイクルタイムは 3S+1N
bx Rs bx Rs  
bx Hs bx Hs PC を指定する場合、命令の置かれている位置は、 ワードアラインメントされていなければならない
add Rd,Rs,Rn adds Rd,Rs,Rn  
add Rd,Rs,#Offset3 adds Rd,Rs,#Offset3  
add Rd,#Offset8 adds Rd,Rd,#Offset8  
add Rd,Hs add Rd,Rd,Hs  
add Hd,Rs add Hd,Hd,Rs  
add Hd,Hs add Hd,Hd,Hs  
add Rd,sp,#Imm add Rd,r13,#Imm Imm は 4 の倍数で、0〜1020 まで
add Rd,pc,#Imm add Rd,r15,#Imm PC のビット 1 は 0 として扱われる
Imm は 4 の倍数で、0〜1020 まで
add sp,#Imm
add sp,#-Imm
add r13,r13,#Imm
sub r13,r13,#Imm
sub で記述してもいい
Imm は 4 の倍数で、0〜508 まで
adc Rd,Rs adcs Rd,Rd,Rs  
sub Rd,Rs,Rn subs Rd,Rs,Rn  
sub Rd,Rs,#Offset3 subs Rd,Rs,#Offset3  
sub Rd,#Offset8 subs Rd,Rd,#Offset8  
sbc Rd,Rs sbcs Rd,Rd,Rs  
neg Rd,Rs rsbs Rd,Rs,#0  
cmn Rd,Rs cmn Rd,Rs  
cmp Rd,#Offset8 cmp Rd,#Offset8  
cmp Rd,Rs cmp Rd,Rs  
cmp Rd,Hs cmp Rd,Hs  
cmp Hd,Rs cmp Hd,Rs  
cmp Hd,Hs cmp Hd,Hs  
mul Rd,Rs muls Rd,Rs,Rd  
and Rd,Rs ands Rd,Rd,Rs  
bic Rd,Rs bics Rd,Rd,Rs  
orr Rd,Rs orrs Rd,Rd,Rs  
eor Rd,Rs eors Rd,Rd,Rs  
tst Rd,Rs tst Rd,Rs  
swi <Offset8> swi <Offset8>  
adr Rd,<Raddr> adr Rd,<Raddr> 疑似命令
nop nop 疑似命令
mov r8,r8 に置き換えられる

戻る