Thumb® 16 ビット命令セット クイックリファレンスカード

Thumb® 16 ビット命令セット
クイックリファレンスカード
このカードには、ARM®v6T2 より前の Thumb 対応プロセッサで使用できる全ての Thumb 命令が記載されています。その他、Thumb-2 のすべての 16 ビット命令が記載されています。
このカードに記載されている命令は、別途注記がない限り Thumb-2 では全て 16 ビット命令です。
すべてのレジスタは、特に明記されている場合を除き Lo (R0 ~ R7)です。Hi レジスタは R8 ~ R15 です。
表のヒント
§
表「ARM アーキテクチャのバージョン」を参照して下さい。
<loreglist+LR>
中括弧({ および })で囲まれ、コンマで区切られた Lo レジスタと LR のリスト。
<loreglist>
中括弧({ および })で囲まれ、コンマで区切られた Lo レジスタのリスト。
<loreglist+PC>
中括弧({ および })で囲まれ、コンマで区切られた Lo レジスタと PC のリスト。
§
命令
移動
イミディエート
アセンブラ
MOVS Rd, #<imm>
Lo から Lo
MOVS Rd, Rm
Hi から Lo、Lo から Hi、Hi から Hi
MOV Rd, Rm
6
LSLS Rd, Rm, #0 の同義語です。
「Lo から Lo」以外です。
Rd := Rm
任意のレジスタから任意のレジスタです。
Z
C
V
Rd := Rn + imm
imm の範囲は 0 ~ 7 です。
すべてのレジスタが Lo
ADDS Rd, Rn, Rm
N
Z
C
V
Rd := Rn + Rm
T2
MOV Rd, Rm
ADD Rd, Rd, Rm
Rd := Rd + Rm
ADD Rd, Rd, Rm
Rd := Rd + Rm
任意のレジスタから任意のレジスタです。
「Lo から Lo」以外です。
イミディエート 8
ADDS Rd, Rd, #<imm>
N
Z
C
V
Rd := Rd + imm
imm の範囲は 0 ~ 255 です。
キャリー付き
ADCS Rd, Rd, Rm
N
Z
C
V
SP の操作
ADD SP, SP, #<imm>
Rd := Rd + Rm + C-ビット
SP := SP + imm
imm の範囲は 0 ~ 508 です(ワード境界で整列します)。
SP からのフォームアドレス
ADD Rd, SP, #<imm>
Rd := SP + imm
imm の範囲は 0 ~ 1020 です(ワード境界で整列します)。
PC からのフォームアドレス
ADR Rd, <label>
Rd := label
label の範囲は PC ~ PC+1020 です(ワード境界で整列します)
。
Lo と Lo
SUBS Rd, Rn, Rm
N
Z
C
V
Rd := Rn – Rm
イミディエート 3
SUBS Rd, Rn, #<imm>
N
Z
C
V
Rd := Rn – imm
imm の範囲は 0 ~ 7 です。
イミディエート 8
SUBS Rd, Rd, #<imm>
N
Z
C
V
Rd := Rd – imm
imm の範囲は 0 ~ 255 です。
キャリー付き
SBCS Rd, Rd, Rm
N
Z
C
V
SP からの値
SUB SP, SP, #<imm>
Rd := Rd – Rm – NOT C-ビット
SP := SP – imm
imm の範囲は 0 ~ 508 です(ワード境界で整列します)。
否定
RSBS Rd, Rn, #0
N
Z
C
V
Rd := – Rn
同義語:NEG Rd, Rn
乗算
MULS Rd, Rd, Rm
N
Z
*
*
Rd := Rm * Rd
* C フラグと V フラグは §4T では予測不能、
§5T 以上では不変です。
CMP Rn, Rm
N
Z
C
V
Rn – Rm の CPSR フラグを更新
Lo から Lo、Lo から Hi、Hi から Lo、または Hi から Hi が可能
です。
否定
CMN Rn, Rm
N
Z
C
V
Rn + Rm の CPSR フラグを更新
イミディエート
AND
CMP Rn, #<imm>
N
Z
C
V
ANDS Rd, Rd, Rm
N
Z
Rn – imm の CPSR フラグを更新
Rd := Rd AND Rm
比較
論理演算
Rd := Rm
Rd := Rm
N
任意から任意
乗算
Z
ADDS Rd, Rn, #<imm>
Hi から Lo、Lo から Hi、Hi から Hi
減算
N
注
imm の範囲は 0 ~ 255 です。
イミディエート 3
任意から任意
加算
更新されるフラグ アクション
N
Z
Rd := imm
EORS Rd, Rd, Rm
N
Z
Rd := Rd EOR Rm
ORRS Rd, Rd, Rm
N
Z
Rd := Rd OR Rm
ビットクリア
BICS Rd, Rd, Rm
N
Z
Rd := Rd AND NOT Rm
NOT 転送
MVNS Rd, Rd, Rm
N
Z
Rd := NOT Rm
テストビット
TST Rn, Rm
N
Z
LSLS Rd, Rm, #<shift>
N
Z
排他的 OR
OR
シフト / ロテート 論理左シフト
C*
Rn AND Rm の CPSR フラグを更新
Rd := Rm << shift
imm の範囲は 0 ~ 255 です。
0 ~ 31 ビットのシフトが可能です。* シフトが 0 の場合、
C フラグに影響はありません。
LSLS Rd, Rd, Rs
N
Z
C*
Rd := Rd << Rs[7:0]
* Rs[7:0] が 0 の場合、C フラグに影響はありません。
論理右シフト
LSRS Rd, Rm, #<shift>
N
Z
C
Rd := Rm >> shift
1 ~ 32 のシフトが可能です。
LSRS Rd, Rd, Rs
N
Z
C*
Rd := Rd >> Rs[7:0]
* Rs[7:0] が 0 の場合、C フラグに影響はありません。
算術右シフト
ASRS Rd, Rm, #<shift>
N
Z
C
Rd := Rm ASR shift
1 ~ 32 のシフトが可能です。
ASRS Rd, Rd, Rs
N
Z
C*
Rd := Rd ASR Rs[7:0]
* Rs[7:0] が 0 の場合、C フラグに影響はありません。
RORS Rd, Rd, Rs
N
Z
C*
Rd := Rd ROR Rs[7:0]
* Rs[7:0] が 0 の場合、C フラグに影響はありません。
右ロテート
Thumb 16 ビット命令セット
クイックリファレンスカード
§
演算
ロード
アセンブラ
LDR Rd, [Rn, #<imm>]
イミディエートオフセット付き、
ワード
imm の範囲は 0 ~ 124 の 4 の倍数です。
ハーフワード
LDRH Rd, [Rn, #<imm>]
Rd := ZeroExtend([Rn + imm][15:0])
ビット 31:16 をクリアします。imm の範囲は 0 ~ 62 の偶数です。
LDRB Rd, [Rn, #<imm>]
Rd := ZeroExtend([Rn + imm][7:0])
ビット 31:8 をクリアします。imm の範囲は 0 ~ 31 です。
LDR Rd, [Rn, Rm]
Rd := [Rn + Rm]
ハーフワード
LDRH Rd, [Rn, Rm]
Rd := ZeroExtend([Rn + Rm][15:0])
ビット 31:16 をクリアします。
符号付きハーフワード
LDRSH Rd, [Rn, Rm]
Rd := SignExtend([Rn + Rm][15:0])
ビット 31:16 をビット 15 に設定します。
バイト
LDRB Rd, [Rn, Rm]
Rd := ZeroExtend([Rn + Rm][7:0])
ビット 31:8 をクリアします。
符号付きバイト
LDRSB Rd, [Rn, Rm]
Rd := SignExtend([Rn + Rm][7:0])
ビット 31:8 をビット 7 に設定します。
PC 相対
LDR Rd, <label>
Rd := [label]
label の範囲は PC ~ PC+1020 です(ワード境界で整列します)。
SP 相対
LDR Rd, [SP, #<imm>]
Rd := [SP + imm]
imm の範囲は 0 ~ 1020 の 4 の倍数です。
複数(ベースを含まない)
LDM Rn!, <loreglist>
レジスタリスト(Rn を除く)のロード
常にポストインクリメントでベースレジスタを更新します。
複数(ベースを含む)
LDM Rn, <loreglist>
イミディエートオフセット付き、
ワード
STR Rd, [Rn, #<imm>]
レジスタリスト(Rn を含む)のロード
[Rn + imm] := Rd
imm の範囲は 0 ~ 124 の 4 の倍数です。
ポストインクリメントでベースレジスタの更新が行われることはありません。
ハーフワード
STRH Rd, [Rn, #<imm>]
[Rn + imm][15:0] := Rd[15:0]
Rd[31:16] を無視します。imm の範囲は 0 ~ 62 の偶数です。
バイト
STRB Rd, [Rn, #<imm>]
[Rn + imm][7:0] := Rd[7:0]
Rd[31:8] を無視します。imm の範囲は 0 ~ 31 です。
STR Rd, [Rn, Rm]
[Rn + Rm] := Rd
ハーフワード
STRH Rd, [Rn, Rm]
[Rn + Rm][15:0] := Rd[15:0]
Rd[31:16] を無視します。
バイト
STRB Rd, [Rn, Rm]
[Rn + Rm][7:0] := Rd[7:0]
Rd[31:8] を無視します。
SP 相対、ワード
STR Rd, [SP, #<imm>]
[SP + imm] := Rd
imm の範囲は 0 ~ 1020 の 4 の倍数です。
複数
STM Rn!, <loreglist>
レジスタリストを保存
常にポストインクリメントでベースレジスタを更新します。
プッシュ
PUSH <loreglist>
レジスタを Full Descending スタックにプッシュします。
リンク付きプッシュ
PUSH <loreglist+LR>
LR およびレジスタを Full Descending スタックにプッ
シュします。
レジスタオフセット付き、ワード
プッシュ
注
バイト
レジスタオフセット付き、ワード
ストア
アクション
Rd := [Rn + imm]
POP <loreglist>
レジスタを Full Descending スタックからポップします。
ポップと復帰
4T
POP <loreglist+PC>
レジスタをポップし、PC にロードしたアドレスに分岐
します。
切り替え付きポップと復帰
5T
POP <loreglist+PC>
address[0] = 0 の場合、ARM 状態のポップ、分岐、およ
び変更を行います。
If-Then
If-Then
T2
IT{pattern} {cond}
分岐
条件分岐
CB{N}Z Rn,<label>
pattern に応じた、4 つの後続条件命令から構成されます。 IT の後の最初の命令には条件 cond が付きます。後続の
pattern は最大 3 文字から構成される文字列
命令には、対応する文字が T の場合は条件 cond が付き、
です。各文字は T (Then)または E (Else)です。
対応する文字が E の場合は条件 cond の逆が付きます。
詳細については、表「条件フィールド」を参照して下さい。
If {cond} then PC := label
label は、現在の命令から – 252 ~ + 258 バイトの範囲内である必要があります。
詳細については、表「条件フィールド」を参照して下さい。
If Rn {== | !=} 0 then PC := label
label は、現在の命令から +4 ~ +130 バイトの範囲内である必要があります。
無条件分岐
B <label>
PC := label
label は、現在の命令から ± 2KB の範囲内である必要があります。
リンク付き長分岐
BL <label>
LR := 次の命令のアドレス、PC := label
これは 32 ビット命令です。
label は、現在の命令から ± 4MB (T2:±16MB)の範囲内である必要があり
ます。
ポップ
ポップ
比較し、0 の(または 0 でない)
場合に分岐
B{cond} <label>
T2
BX Rm
PC := Rm AND 0xFFFFFFFE
Rm[0] = 0 の場合、ARM 状態に変更されます。
リンクと切り替え付き分岐
5T
BLX <label>
LR := 次の命令のアドレス、PC := label
ARM に変更
これは 32 ビット命令です。
label は、現在の命令から ± 4MB (T2:±16MB)の範囲内である必要があり
ます。
リンクと切り替え付き分岐
5T
BLX Rm
LR := 次の命令のアドレス、
PC := Rm AND 0xFFFFFFFE
Rm[0] = 0 の場合、ARM 状態に変更されます。
符号付き、ハーフワードからワード
6
SXTH Rd, Rm
Rd[31:0] := SignExtend(Rm[15:0])
符号付き、バイトからワード
6
SXTB Rd, Rm
Rd[31:0] := SignExtend(Rm[7:0])
符号なし、ハーフワードからワード
6
UXTH Rd, Rm
Rd[31:0] := ZeroExtend(Rm[15:0])
符号なし、バイトからワード
6
UXTB Rd, Rm
Rd[31:0] := ZeroExtend(Rm[7:0])
ワード内のバイト
6
REV Rd, Rm
Rd[31:24] := Rm[7:0]、Rd[23:16] := Rm[15:8]、Rd[15:8] := Rm[23:16]、Rd[7:0] := Rm[31:24]
2 つのハーフワード内のバイト
6
REV16 Rd, Rm
Rd[15:8] := Rm[7:0]、Rd[7:0] := Rm[15:8]、Rd[31:24] := Rm[23:16]、Rd[23:16] := Rm[31:24]
下位ハーフワード内のバイト、符号
拡張
6
REVSH Rd, Rm
Rd[15:8] := Rm[7:0]、Rd[7:0] := Rm[15:8]、Rd[31:16] := Rm[7] * &FFFF
分岐と切り替え
拡張
反転
Thumb 16 ビット命令セット
クイックリファレンスカード
§
命令
プロセッサ
状態
変更
アセンブラ
アクション
注
SWI <immed_8>
ソフトウェア割り込みプロセッサ例外
8 ビットのイミディエート値が命令にエンコードされます。
6
CPSID <iflags>
指定された割り込みのディセーブル
6
CPSIE <iflags>
指定された割り込みのイネーブル
エンディアン方式の設定
6
SETEND <endianness>
ロードおよび保存用にエンディアン方式を設定します。
<endianness> は BE (ビッグエンディアン)または LE (リトルエ
ンディアン)のいずれかを指定できます。
8 ビットのイミディエート値が命令にエンコードされます。
ソフトウェア割り込み
プロセッサ状態の変更
ブレークポイント
5T BKPT <immed_8>
プリフェッチアボートまたはデバッグ状態への移行
Op なし
操作なし
6
なし。時間も消費しない可能性があります。
ヒント
イベントの設定
T2 SEV
マルチプロセッサシステムのイベントを信号で送信します。
未実装の場合、アクションは発生しません。
イベント待機
T2 WFE
イベント、IRQ、FIQ、不正確なアボート、デバッグエントリ要求を待機
します。
未実装の場合、アクションは発生しません。
割り込み待機
T2 WFI
IRQ、FIQ、不正確なアボート、デバッグエントリ要求を待機します。
未実装の場合、アクションは発生しません。
明け渡し
T2 YIELD
他のスレッドに制御を明け渡します。
未実装の場合、アクションは発生しません。
NOP
条件フィールド
ニーモニック
説明
EQ
等しい
NE
等しくない
CS / HS
キャリー設定 / 大きいか等しい
(符号なし)
CC / LO
キャリークリア / 小さい(符号なし)
ARMv6T2 より前のプロセッサの Thumb コードでは、cond を条件分岐(B{cond})命令以外の場
所で使用しないようにして下さい。
Thumb-2 コードでは、cond はどの命令で使用してもかまいません(ただし CBZ、CBNZ、CPSID、
CPSIE、IT、および SETEND は除きます)。
条件は、先行する IT 命令でエンコードされます(B{cond} 命令の場合は除きます)。
アセンブリ言語ソースファイルに IT 命令が明示的に記述してある場合、
命令内の条件は対応する IT 命令と一致する必要があります。
MI
負
PL
正または 0
VS
オーバフロー
VC
オーバフローなし
HI
大きい(符号なし)
LS
小さいか等しい(符号なし)
4T
ARM v4 以上の Thumb のすべてのバージョン
GE
大きいか等しい(符号付き)
5T
ARM v5 以上の Thumb のすべてのバージョン
LT
小さい(符号付き)
6
ARM v6 以上の Thumb のすべてのバージョン
GT
大きい(符号付き)
T2
ARM v6 以上の Thumb-2 のすべてのバージョン
LE
小さいか等しい(符号付き)
AL
無条件、B{cond} では使用しない
ARM アーキテクチャのバージョン
著作権
文書番号
®
または ™ のマークが付いた言葉およびロゴは、ARM Limited が所有する登録商標または商標です。本書に
記載されている他の製品名は、各社の所有する商標です。
ARM QRC 0006AJ
本書に記載されている情報の全部または一部、ならびに本書で紹介する製品は、著作権所有者の文書による
事前の許可を得ない限り、転用・複製することを禁じます。
変更履歴
本書に記載されている製品は、今後も継続的に開発・改良の対象となります。本書に含まれる製品およびそ
の利用方法についての情報は、ARM が利用者の利益のために提供するものです。したがって当社では、製品
の市販性または利用の適切性を含め、暗示的・明示的に関係なく一切の責任を負いません。
発行
A
B
C
日付
2004 年 11 月
2005 年 5 月
2006 年 3 月
変更
第1版
RVCT 2.2 SP1 リリース
RCVT 3.0 リリース
本リファレンスカードは、本製品の利用者をサポートすることだけを目的としています。本リファレンス
カードに記載されている情報の使用、情報の誤りまたは省略、あるいは本製品の誤使用によって発生したい
かなる損失・損傷についても、ARM Limited は一切責任を負いません。
www.arm.com