| ア | イ | ウ | エ | オ |
| カ | キ | ク | ケ | コ |
| サ | シ | ス | セ | ソ |
| タ | チ | ツ | テ | ト |
| ナ | ニ | ヌ | ネ | ノ |
| ハ | ヒ | フ | ヘ | ホ |
| マ | ミ | ム | メ | モ |
| ヤ | ユ | ヨ | ||
| ラ | リ | ル | レ | ロ |
| ワ | ヰ | ヴ | ヱ | ヲ |
| ン |
| A | B | C | D | E |
| F | G | H | I | J |
| K | L | M | N | O |
| P | Q | R | S | T |
| U | V | W | X | Y |
| Z | 数字 | 記号 | ||
AArch32(古い呼称でARMステート)で使われている、32ビット環境用の32ビット固定長の命令セット。
従来からある32ビットの命令セットである。
Thumb命令が登場するまでは唯一の命令セットだった。Thumb命令が登場後、呼び分けが必要となり、従来命令を使うモードを「ARMステート」、新たなThumb命令を使うモードを「Thumbステート」と、各々呼ばれるようになった。
更にARMv8が登場し64ビット化されて以降は、AArch32というアーキテクチャに属する2つの命令セットのうちの一つ「A32」と呼ばれるようになった。
ARMの提供するマニュアルには、使用例としてユークリッドの互除法の計算が掲載されている。
Cで書いた場合、次のような処理になる。
int gcd(int a, int b)
{
while (a != b)
{
if (a > b)
a = a - b;
else
b = b - a;
}
return a;
}
これを、一般的なCPUと同様にARMで記述した場合、次のようになるだろう。
gcd CMP r0, r1
BEQ end
BLT less
SUB r0, r0, r1
B gcd
less
SUB r1, r1, r0
B gcd
end
さて、ARMには全ての命令に実行条件を付けることができるため、次のように、僅か4命令で書くことができる。
gcd CMP r0, r1
SUBGT r0, r0, r1
SUBLT r1, r1, r0
BNE gcd
様々な条件で、コードサイズが小さくなり、実行速度も速くなる。
ただ、一般的なCコンパイラーでは、ここまで最適化する能力を持たないため、必ずしもここまで効率化できるとは限らない。
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| cond | op1 | op | |||||||||||||||||||||||||||||
殆どのARM命令はビット31〜28で実行条件をつけることが可能で、ビット27〜25で主要な細分化が行なわれている。
あとからの拡張の影響で、一部につきビット4を主要な細分化に用いているものがある。
| cond | op1 | op | 命令クラス |
|---|---|---|---|
| 1111 以外 | 00x | x | データ処理とその他の命令 |
| 010 | x | ワードと符号なしバイトのロード/ストア | |
| 011 | 0 | ||
| 011 | 1 | メディア命令 | |
| 10x | x | 分岐、リンク付き分岐、ブロックデータ転送 | |
| 11x | x | システムコール、コプロセッサー命令(VFP/Advanced SIMDを含む) | |
| 1111 | xxx | x | 無条件命令 |
基本的な命令の配列は次の通り。
※付きは、古いARMでは使えない。
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| データ処理 | Cond | 0 | 0 | I | OpCode | S | Rn | Rd | Operand2 | ||||||||||||||||||||||||
| PSR転送 | |||||||||||||||||||||||||||||||||
| 乗算 | Cond | 0 | 0 | 0 | 0 | 0 | 0 | A | S | Rd | Rn | Rs | 1 | 0 | 0 | 1 | Rm | ||||||||||||||||
| ロング乗算※ | Cond | 0 | 0 | 0 | 0 | 1 | U | A | S | RdHi | RdLo | Rs | 1 | 0 | 0 | 1 | Rm | ||||||||||||||||
| SWP | Cond | 0 | 0 | 0 | 1 | 0 | B | 0 | 0 | Rn | Rd | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | Rm | |||||||||||||
| 分岐と切り替え※ | Cond | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | Rn | |||||||
| ハーフワードレジスター※ | Cond | 0 | 0 | 0 | P | U | 0 | W | L | Rn | Rd | 0 | 1 | S | H | 1 | Rm | ||||||||||||||||
| ハーフワード即値※ | Cond | 0 | 0 | 0 | P | U | 1 | W | L | Rn | Rd | Offset1 | 1 | S | H | 1 | Offset2 | ||||||||||||||||
| LDR、STR | Cond | 0 | 1 | I | P | U | B | W | L | Rn | Rd | Offset | |||||||||||||||||||||
| 未定義 | Cond | 0 | 1 | 1 | 1 | ||||||||||||||||||||||||||||
| ブロック転送 | Cond | 1 | 0 | 0 | P | U | S | W | L | Rn | Register List | ||||||||||||||||||||||
| 分岐 | Cond | 1 | 0 | 1 | L | offset | |||||||||||||||||||||||||||
| コプロデータ転送 | Cond | 1 | 1 | 0 | P | U | N | W | L | Rn | CRd | cp_num | offset | ||||||||||||||||||||
| コプロデータ処理 | Cond | 1 | 1 | 1 | 0 | CP opc | CRn | CRd | cp_num | CP | 0 | CRm | |||||||||||||||||||||
| コプロレジスター転送 | Cond | 1 | 1 | 1 | 0 | CP opc | L | CRn | Rd | cp_num | CP | 1 | CRm | ||||||||||||||||||||
| ソフトウェア割り込み | Cond | 1 | 1 | 1 | 1 | 情報欄 | |||||||||||||||||||||||||||
元々cond=0b1111は使用されておらず予約扱いだったが、ARMv5以降に無条件実行のみの拡張命令が配置されるようになり、ARMv6で更に命令が追加された。
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | op1 | Rn | op | |||||||||||||||||||||||||
次のような命令がある。
| op1 | op | Rn | 命令 |
|---|---|---|---|
| 0xxxxxxx | x | その他の命令、メモリーのヒント、Advanced SIMD命令 | |
| 100xx1x0 | x | Store Return State(SRS) [ARMv6〜] | |
| 100xx0x1 | x | Return From Exception(RFE) [ARMv6〜] | |
| 101xxxxx | x | 分岐命令(BL、BLX) | |
| 11000x11 11001xx1 1101xxx1 | x x x | 1111以外 | コプロセッサーのロード (イミディエイト) |
| 1111 | コプロセッサーのロード (リテラル) | ||
| 11000x10 11001xx0 1101xxx0 | x x x | コプロセッサーのストア | |
| 11000100 | x | 2つのARMコアレジスターからコプロセッサーへのデータ移動 [ARMv6〜] | |
| 11000101 | x | コプロセッサーから2つのARMコアレジスターへのデータ移動 [ARMv6〜] | |
| 1110xxxx | 0 | コプロセッサーデータ操作 | |
| 1110xxx0 | 1 | ARMコアレジスターからコプロセッサーへのデータ移動 | |
| 1110xxx1 | 1 | コプロセッサーからARMコアレジスターへのデータ移動 |
コメントなどを投稿するフォームは、日本語対応時のみ表示されます