ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
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コアレジスターへのデータ移動 |
コメントなどを投稿するフォームは、日本語対応時のみ表示されます