名称 | 意味 |
レジスタ | 計算結果を一時的に格納しておく記憶素子。ARMで汎用的に使えるレジスタはr0〜r15の16個。 (実際にはr0〜r12とも言える。r13:スタックポインタ、r14:リターンアドレス、r15:プログラムカウンタに使用されている) |
スタックポインタ | 一時的にレジスタの内容を逃がしておく場所(スタック)に対する指標。 r0〜r3の4つをスタックに逃がしてポインタを+4(-4)したり、など。 |
リターンアドレス | ARMではr14を「リンクレジスタ(lr)」と呼び、遠くの命令を呼ぶ(サブルーチンコール)前に、 コールの次の行のアドレスをr14に入れ、コール先の最後でr14の情報を便りに元の場所に帰る(bx r14)。 |
プログラムカウンタ | ARMではr15を「プログラムカウンタ(pc)」と呼び、現在の命令の実行アドレスが格納される。 この命令に直接数値を代入してやると、本当に入れた値のアドレスにジャンプさせることもできる。 |
フラグフィールド | 計算した値がマイナスや0などの条件を満たすと変化し、値を利用して条件分岐を行ったりする。 (改造コードサーチに使うのであれば、実はこの動作を知らなくてもあまり問題が無かったりする)。 |
オペコード | 命令名のこと。加算命令add、減算命令sub、ジャンプ命令b、比較命令cmpなど、様々なものが用意されている。 |
オペランド | 命令に与える要素のこと。例えば add r0,r1,r2 (r0=r1+r2) であれば r0,r1,r2 がオペランドとなる。 |
命令名 | 書式 | 効果 | 備考 |
add | add rd,rn,op2 | rd = rn + op2 | 加算命令。add r0,r0,r0 (r0=r0+r0 ..要はr0×2)なんてことも可能。 |
sub | sub rd,rn,op2 | rd = rn - op2 | 減算命令。sub r0,r0,#10 (r0=r0-10)とか。 |
mov | mov rn,op2 | rn = op2 | 代入命令。mov r1,#0x4000000 (r1=0x4000000)とか。 |
cmp | cmp rn,op2 | rn = op2 | 比較命令。フラグフィールドにrn-op2の値を入れる(※詳細は後述) |
ldr | ldr rd,addr_mode1 | rd=*((long)addr_mode1) | ロード命令。アドレスaddr_mode1の値4バイトをレジスタrdに入れる。 |
ldrh | ldrh rd,addr_mode1 | rd=*((short)addr_mode1) | ロード命令。アドレスaddr_mode1の値2バイトをレジスタrdに入れる。 |
ldrb | ldrb rd,addr_mode1 | rd=*((char)addr_mode1) | ロード命令。アドレスaddr_mode1の値1バイトをレジスタrdに入れる。 |
str | str rd,addr_mode1 | *((long)addr_mode1)=rd | ストア命令。レジスタrdの4バイトをアドレスaddr_mode1に書き込む |
strh | strh rd,addr_mode1 | *((short)addr_mode1)=rd | ストア命令。レジスタrdの2バイトをアドレスaddr_mode1に書き込む |
strb | strb rd,addr_mode1 | *((char)addr_mode1)=rd | ストア命令。レジスタrdの1バイトをアドレスaddr_mode1に書き込む |
b | b addr | r15(pc)=addr | アドレスaddrにジャンプする。 |
bl | bl addr | r14(lr)=r15+4 , r15=addr | リターンアドレスをr14に入れてから、アドレスaddrにジャンプする。 |
bx | bx reg | r15=reg | レジスタregの記すアドレスにジャンプ。ARM->THUMB切り替えにも使用。 |
条件コード | 条件式の意味 | C言語風 |
eq | Equal (等しい) | if(rn==op2) |
ne | Not Equal (等しくない) | if(rn!=op2) |
ge | 大きいもしくは等しい(符号あり) | if((signed)rn>=(signed)op2) |
csもしくはhs | 大きいもしくは等しい(符号無し) | if((unsigned)rn>=(unsigned)op2) |
gt | 大きい(符号あり) | if((signed)rn>(signed)op2) |
hi | 大きい(符号無し) | if((unsigned)rn>(unsigned)op2) |
le | 小さいもしくは等しい(符号あり) | if((signed)rn<=(signed)op2) |
ls | 小さいもしくは等しい(符号無し) | if((unsigned)rn<=(unsigned)op2) |
lt | 小さい(符号あり) | if((signed)rn<(signed)op2) |
ccもしくはlo | 小さい(符号無し) | if((unsigned)rn<(unsigned)op2) |
mi | Minus (0未満) | if(rn-op2<0) |
pl | Plus (0以上) | if(rn-op2>=0) |
vs | オーバーフローしている | --- |
vc | オーバーフローしていない | --- |