ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
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 | 数字 | 記号 |
Thumb-1の拡張で、追加の16ビットのオペコードを加えることで、16ビットまたは32ビットの可変長命令としたもの。
従来の16ビット長で未使用部分に命令を追加するほか、上位3ビットが111で、続く2ビットが00でない時に、もう16ビットを追加する可変長命令とし、ここにも命令を追加した。
元々、Thumb-1では11110がロング分岐命令で、この場合は追加で11111から始まる16ビットの命令とペアとする長距離の分岐命令があり、このためThumb-1の時点で既に16ビット単位の可変長であった。
Thumb-2ではここに目をつけた拡張をしており、11100以外の111から始まる命令を可変長命令とした。
RISCなのに可変長にしてまで命令を増やし、更にARM CortexではThumb-2を標準にするあたり、相変わらずARMはRISCらしくない。
Thumbは流石に縮小しすぎたため、高機能な32ビット命令も加えた。
命令は計32ビットとなるが、しかし純粋な32ビットよりは効率が落ちる。
16ビット×2で32ビットになるが、あくまでもThumb-1の拡張であるため、従来のARM命令とは機械語は全く異なる。これは、32ビットThumb命令(32-bit Thumb instruction)と呼ばれている。
32ビットThumb命令では、従来同様にレジスターが16本利用できる。
15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
opcode |
opcodeの定義は次の通りである。Thumb-1の上位互換の拡張だが、命令追加のため定義が若干広げられているものもある。
opcode | 命令または命令クラス |
---|---|
00xxxx | シフト(イミディエイト)、加算、減算、移動、比較 |
010000 | データ処理 |
010001 | 特殊なデータ命令、分岐、交換 |
01001x | リテラルプールからのロード (PC相対ロード) |
0101xx | 単一データアイテムのロード/ストア |
011xxx | |
100xxx | |
10100x | PC相対アドレスの生成 |
10101x | SP相対アドレスの生成 |
1011xx | その他の16ビット命令 |
11000x | マルチプルレジスターストア |
11001x | マルチプルレジスターロード |
1101xx | 条件分岐とスーパーバイザーコール |
11100x | 無条件分岐 |
15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 | 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 1 | op1 | op2 | op |
Thumb-2命令の符号化方法は次の通り。なお、op1=00はThumb-1と同じ無条件分岐命令である。
Thumb-2命令は、ARMv6で導入されて以降、命令は徐々に増えており、多機能化している。
op1 | op2 | op | 命令クラス |
---|---|---|---|
01 | 00xx0xx | x | マルチプルロード/ストア命令 |
01 | 00xx1xx | x | デュアルまたは排他的ロード/ストア命令 |
01 | 01xxxxx | x | データ処理(レジスターシフト) |
01 | 1xxxxxx | x | コプロセッサー命令 |
10 | x0xxxxx | 0 | データ処理(イミディエイト) |
10 | x1xxxxx | 0 | データ処理(プレーンバイナリイミディエイト) |
10 | xxxxxxx | 1 | 分岐とその他の制御 |
11 | 000xxx0 | x | 単一のデータ項目の格納 |
11 | 001xxx0 | x | Advanced SIMD(NEON)要素または構造体のロード/ストア命令 |
11 | 00xx001 | x | バイトのロード、メモリーのヒント |
11 | 00xx011 | x | ハーフワードのロード、メモリーのヒント |
11 | 00xx101 | x | ワードのロード |
11 | 00xx111 | x | ※未定義※ |
11 | 010xxxx | x | データ処理(レジスター) |
11 | 0110xxx | x | 乗算、積和演算、差の絶対値 |
11 | 0111xxx | x | ロング乗算、ロング積和演算、除算 |
11 | 1xxxxxx | x | コプロセッサー命令 |
Thumb-2命令セット(T32)とARM命令セット(A32)の大きな違いは、32ビットThumb命令の機械語ビット列の殆どに条件指定がないことである。
そこでThumb-2では、条件付き実行命令としてITが追加されている。
一つのIT命令で、後続する1〜4命令を条件付きにすることができる。
IT{x{y{z}}} <firstcond>
オペコードは次の通り。
15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | firstcond | mask |
具体的な使用例は、次の通り、
ITTE NE ITT AL IT NE
ITのあと、最大3文字でTまたはEを附すことが出来る。
ただし、通常はアセンブリ言語でIT命令を書く必要はなく、各命令に対して条件を指定することで、アセンブラーが自動的にIT命令を出力する。
IT命令を普通に用いた場合は必ず4ビットあるmaskのビットのどれか1つ以上が1となりmask≠0となるが、もしmask=='0000'の場合、firstcond領域をオペコードとする拡張命令となる。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます