RealView® Compilation Tools アセンブラガイド

バージョン 4.0


Table of Contents

1. 序章
本書について
対象読者
本書の構成
表記規則
参考資料
フィードバック
RealView Compilation Tools に関するフィードバック
本書に関するフィードバック
1. はじめに
1.1. RealView Compilation Tools アセンブラについて
1.1.1. ARM アセンブリ言語
1.1.2. ワイヤレス MMX テクノロジの命令
1.1.3. NEON Technology
1.1.4. サンプルの使用方法
2. ARM アセンブリ言語の記述
2.1. はじめに
2.1.1. サンプルコード
2.2. ARM アーキテクチャの概要
2.2.1. アーキテクチャのバージョン
2.2.2. ARM、Thumb、Thumb‑2、および Thumb‑2EE の命令セット
2.2.3. ARM、Thumb、および ThumbEE 状態
2.2.4. プロセッサモード
2.2.5. レジスタ
2.2.6. 命令セットの概要
2.2.7. 命令の機能
2.3. アセンブリ言語モジュールの構造
2.3.1. アセンブリ言語ソースファイルのレイアウト
2.3.2. ARM アセンブリ言語モジュールのサンプル
2.3.3. サブルーチンの呼び出し
2.4. 条件実行
2.4.1. ALU ステータスフラグ
2.4.2. 条件実行
2.4.3. 条件実行の使用
2.4.4. 条件実行の使用例
2.4.5. Q フラグ
2.5. レジスタへの定数のロード
2.5.1. MOV と MVN を使用した直接ロード
2.5.2. MOV32 を使用したロード
2.5.3. LDR Rd, =const を使用したロード
2.5.4. 浮動小数点定数のロード
2.6. レジスタへのアドレスのロード
2.6.1. ADR と ADRL を使用した直接ロード
2.6.2. LDR Rd, =label を使用したアドレスのロード
2.7. 多重レジスタロード/ストア命令
2.7.1. ARM と Thumb で利用できる多重ロード/ストア命令
2.7.2. LDM と STM によるスタックの実装
2.7.3. LDM および STM によるブロックコピー
2.8. マクロの使用
2.8.1. Test‑and‑Branch (テスト - 分岐)マクロのサンプル
2.8.2. 符号なし整数除算マクロのサンプル
2.9. シンボルバージョンの追加
2.10. フレームディレクティブの使用
2.11. アセンブリ言語に関する変更
3. アセンブラに関する参考情報
3.1. コマンド構文
3.1.1. 利用可能なオプションのリストを取得する
3.1.2. 環境変数を使用してコマンドラインオプションを指定する
3.1.3. AAPCS
3.1.4. 浮動小数点モデル
3.1.5. CPU 名
3.1.6. FPU 名
3.1.7. メモリアクセス属性
3.1.8. SET ディレクティブを事前に実行する
3.1.9. 長い LDM と STM を分割する
3.1.10. リストをファイルに出力する
3.1.11. プロジェクトテンプレートオプション
3.1.12. 診断メッセージの出力の制御
3.1.13. 例外テーブル生成を制御する
3.2. ソース行の形式
3.3. 定義済みのレジスタおよびコプロセッサ名
3.3.1. 事前宣言されているレジスタ名
3.3.2. 事前宣言されている拡張レジスタ名
3.3.3. 事前宣言されている XScale レジスタ名
3.3.4. 事前宣言されているコプロセッサ名
3.4. 組み込み変数および定数
3.4.1. armasm のバージョンの検出
3.5. シンボル
3.5.1. シンボルの命名ルール
3.5.2. 変数
3.5.3. 数値定数
3.5.4. アセンブリ時の変数代入
3.5.5. ラベル
3.5.6. ローカルラベル
3.6. 式、リテラル、演算子
3.6.1. 文字列式
3.6.2. 文字列リテラル
3.6.3. 数値式
3.6.4. 数値リテラル
3.6.5. 浮動小数点リテラル
3.6.6. レジスタ相対式とプログラム相対式
3.6.7. 論理式
3.6.8. 論理リテラル
3.6.9. 演算子の優先順位
3.6.10. 単項演算子
3.6.11. 2 項演算子
3.7. 診断メッセージ
3.7.1. インターロック
3.7.2. IT ブロック生成
3.7.3. Thumb 分岐ターゲットのワード境界整列
3.8. C プリプロセッサを使用する
4. ARM 命令と Thumb 命令
4.1. 命令の概要
4.2. メモリアクセス命令
4.2.1. アドレス境界調整
4.2.2. LDR と STR (イミディエートオフセット)
4.2.3. LDR と STR (レジスタオフセット)
4.2.4. LDR と STR (ユーザモード)
4.2.5. LDR (pc 相対)
4.2.6. ADR
4.2.7. PLD、PLDW、PLI
4.2.8. LDM、STM
4.2.9. PUSH および POP
4.2.10. RFE
4.2.11. SRS
4.2.12. LDREX と STREX
4.2.13. CLREX
4.2.14. SWP と SWPB
4.3. 汎用データ処理命令
4.3.1. フレキシブル第 2 オペランド
4.3.2. ADD、SUB、RSB、ADC、SBC、RSC
4.3.3. SUBS PC、lr
4.3.4. AND、ORR、EOR、BIC、ORN
4.3.5. CLZ
4.3.6. CMP、CMN
4.3.7. MOV、MVN
4.3.8. MOVT
4.3.9. TST、TEQ
4.3.10. SEL
4.3.11. REV、REV16、REVSH、RBIT
4.3.12. ASR、LSL、LSR、ROR、RRX
4.3.13. SDIV、UDIV
4.4. 乗算命令
4.4.1. MUL、MLA、MLS
4.4.2. UMULL、UMLAL、SMULL、SMLAL
4.4.3. SMULxy、SMLAxy
4.4.4. SMULWy、SMLAWy
4.4.5. SMLALxy
4.4.6. SMUAD{X}、SMUSD{X}
4.4.7. SMMUL、SMMLA、SMMLS
4.4.8. SMLAD、SMLSD
4.4.9. SMLALD、SMLSLD
4.4.10. UMAAL
4.4.11. MIA、MIAPH、MIAxy
4.5. サチュレート命令
4.5.1. サチュレート算術演算
4.5.2. QADD、QSUB、QDADD、QDSUB
4.5.3. SSAT、USAT
4.6. 並列命令
4.6.1. 並列加算と並列減算
4.6.2. USAD8、USADA8
4.6.3. SSAT16、USAT16
4.7. パック命令と展開命令
4.7.1. BFC、BFI
4.7.2. SBFX、UBFX
4.7.3. SXT、SXTA、UXT、UXTA
4.7.4. PKHBT、PKHTB
4.8. 分岐命令と制御命令
4.8.1. B、BL、BX、BLX、BXJ
4.8.2. IT
4.8.3. CBZ、CBNZ
4.8.4. TBB、TBH
4.9. コプロセッサ命令
4.9.1. CDP、CDP2
4.9.2. MCR、MCR2、MCRR、MCRR2
4.9.3. MRC、MRC2、MRRC、MRRC2
4.9.4. LDC、LDC2、STC、STC2
4.10. その他の命令
4.10.1. BKPT
4.10.2. SVC
4.10.3. MRS
4.10.4. MSR
4.10.5. CPS
4.10.6. SMC
4.10.7. SETEND
4.10.8. NOP、SEV、WFE、WFI、YIELD
4.10.9. DBG、DMB、DSB、ISB
4.10.10. MAR、MRA
4.11. Thumb での命令の幅の選択
4.11.1. 命令の幅の指定子: .W と .N
4.11.2. 異なる動作を持つ命令
4.11.3. 診断警告
4.12. ThumbEE 命令
4.12.1. ENTERX、LEAVEX
4.12.2. CHKA
4.12.3. HB、HBL、HBLP、HBP
4.13. 疑似命令
4.13.1. ADRL 疑似命令
4.13.2. MOV32 疑似命令
4.13.3. LDR 疑似命令
4.13.4. UND 疑似命令
5. NEON と VFP プログラミング
5.1. 命令の概要
5.1.1. NEON 命令
5.1.2. 共通の NEON 命令と VFP 命令
5.1.3. VFP 命令
5.2. NEON と VFP 向けのアーキテクチャサポート
5.2.1. 半精度拡張
5.3. 拡張レジスタバンク
5.3.1. レジスタバンクの NEON ビュー
5.3.2. 拡張レジスタバンクの VFP ビュー
5.4. 条件コード
5.5. 一般的な情報
5.5.1. 浮動小数点の例外
5.5.2. NEON データ型および VFP データ型
5.5.3. NEON の Normal、Long、Wide、Narrow、およびサチュレート命令
5.5.4. NEON スカラ
5.5.5. 拡張表記
5.5.6. {0,1} を超える多項式算術演算
5.5.7. VFP コプロセッサ
5.6. NEON と VFP に共通の命令
5.6.1. VLDR および VSTR
5.6.2. VLDM、VSTM、VPOP、VPUSH
5.6.3. VMOV (2 本の ARM レジスタと拡張レジスタ間)
5.6.4. VMOV(ARM レジスタと NEON スカラの間)
5.6.5. VMOV(1 本の ARM レジスタと単精度 VFP の間)
5.6.6. VMRS および VMSR
5.7. NEON 論理演算と比較演算
5.7.1. VAND、VBIC、VEOR、VORN、および VORR (レジスタ)
5.7.2. VBIC および VORR (イミディエート)
5.7.3. VBIF、VBIT、VBSL
5.7.4. VMOV、VMVN (レジスタ)
5.7.5. VACGE および VACGT
5.7.6. VCEQ、VCGE、VCGT、VCLE、および VCLT
5.7.7. VTST
5.8. NEON 汎用データ処理命令
5.8.1. VCVT (固定小数点または整数と浮動小数点との間)
5.8.2. VCVT (半精度浮動小数点数と単精度浮動小数点数間の変換)
5.8.3. VDUP
5.8.4. VEXT
5.8.5. VMOV、VMVN (イミディエート)
5.8.6. VMOVL, V{Q}MOVN, VQMOVUN
5.8.7. VREV
5.8.8. VSWP
5.8.9. VTBL, VTBX
5.8.10. VTRN
5.8.11. VUZP、VZIP
5.9. NEON シフト命令
5.9.1. VSHL、VQSHL、VQSHLU、および VSHLL (イミディエートによる)
5.9.2. V{Q}{R}SHL(符号付き変数による)
5.9.3. V{R}SHR{N}, V{R}SRA(イミディエートによる)
5.9.4. VQ{R}SHR{U}N(イミディエートによる)
5.9.5. VSLI および VSRI
5.10. NEON 汎用算術命令
5.10.1. VABA{L} および VABD{L}
5.10.2. V{Q}ABS および V{Q}NEG
5.10.3. V{Q}ADD、VADDL、VADDW、V{Q}SUB、VSUBL、VSUBW
5.10.4. V{R}ADDHN および V{R}SUBHN
5.10.5. V{R}HADD および VHSUB
5.10.6. VPADD{L}、VPADAL
5.10.7. VMAX、VMIN、VPMAX、VPMIN
5.10.8. VCLS、VCLZ、VCNT
5.10.9. VRECPE および VRSQRTE
5.10.10. VRECPS および VRSQRTS
5.11. NEON 乗算命令
5.11.1. VMUL{L}、VMLA{L}、VMLS{L}
5.11.2. VMUL{L}、VMLA{L}、VMLS{L}(スカラによる)
5.11.3. VQDMULL、VQDMLAL、VQDMLSL(ベクタまたはスカラによる)
5.11.4. VQ{R}DMULH(ベクタまたはスカラによる)
5.12. NEON 要素と構造体のロード / ストア命令
5.12.1. インターリーブ
5.12.2. ロードとストア命令、要素と構造体の命令における境界調整の制約
5.12.3. VLDn および VSTn (1 レーンへの 1 つの n 要素構造体)
5.12.4. VLDn (全レーンへの 1 つの n 要素構造体)
5.12.5. VLDn および VSTn (複数の n 要素構造体)
5.13. NEON 疑似命令および VFP 疑似命令
5.13.1. VLDR 疑似命令
5.13.2. VLDR と VSTR (ポストインクリメントとプレデクリメント)
5.13.3. VMOV2
5.13.4. VAND および VORN (イミディエート)
5.13.5. VACLE および VACLT
5.13.6. VCLE および VCLT
5.14. NEON / VFP システムレジスタ
5.14.1. FPSCR:浮動小数点ステータス / 制御レジスタ
5.14.2. FPEXC:浮動小数点例外レジスタ
5.14.3. FPSID:浮動小数点システム ID レジスタ
5.14.4. NEON / VFP システムレジスタの各ビットの変更
5.15. ゼロクリアモード
5.15.1. ゼロクリアモードをいつ使用すべきか
5.15.2. ゼロクリアモードの使用による影響
5.15.3. ゼロクリアモードの影響を受けない演算
5.16. VFP 命令
5.16.1. VABS、VNEG、VSQRT
5.16.2. VADD、VSUB、VDIV
5.16.3. VMUL、VMLA、VMLS、VNMUL、VNMLA、VNMLS
5.16.4. VCMP
5.16.5. VCVT (単精度と倍精度の間)
5.16.6. VCVT (浮動小数点と整数間の変換)
5.16.7. VCVT (浮動小数点と固定小数点間)
5.16.8. VCVTB、VCVTT (半精度拡張)
5.16.9. VMOV
5.17. VFP ベクタモード
5.17.1. レジスタバンク
5.17.2. ベクタ
5.17.3. VFP ベクタ演算とスカラ演算
5.17.4. VFP ディレクティブとベクタ表記
6. ワイヤレス MMX テクノロジの命令
6.1. はじめに
6.2. ワイヤレス MMX テクノロジに対する ARM のサポート
6.2.1. レジスタ
6.2.2. ディレクティブ、WRN と WCN
6.2.3. Frame ディレクティブ
6.2.4. ワイヤレス MMX ロード/ストア命令
6.2.5. ワイヤレス MMX テクノロジの命令と XScale の命令
6.3. ワイヤレス MMX の命令
6.3.1. 疑似命令
7. ディレクティブリファレンス
7.1. ディレクティブの一覧(アルファベット順)
7.2. シンボル定義ディレクティブ
7.2.1. GBLA、GBLL、GBLS
7.2.2. LCLA、LCLL、LCLS
7.2.3. SETA、SETL、SETS
7.2.4. RELOC
7.2.5. RN
7.2.6. RLIST
7.2.7. CN
7.2.8. CP
7.2.9. QN、DN、および SN
7.3. データ定義ディレクティブ
7.3.1. LTORG
7.3.2. MAP
7.3.3. FIELD
7.3.4. SPACE または FILL
7.3.5. DCB
7.3.6. DCD、DCDU
7.3.7. DCDO
7.3.8. DCFD、DCFDU
7.3.9. DCFS、DCFSU
7.3.10. DCI
7.3.11. DCQ、DCQU
7.3.12. DCW、DCWU
7.3.13. COMMON
7.3.14. DATA
7.4. アセンブリ制御ディレクティブ
7.4.1. ネスティングディレクティブ
7.4.2. MACRO、MEND
7.4.3. MEXIT
7.4.4. IF、ELSE、ENDIF、ELIF
7.4.5. WHILE、WEND
7.5. Frame ディレクティブ
7.5.1. FRAME ADDRESS
7.5.2. FRAME POP
7.5.3. FRAME PUSH
7.5.4. FRAME REGISTER
7.5.5. FRAME RESTORE
7.5.6. FRAME RETURN ADDRESS
7.5.7. FRAME SAVE
7.5.8. FRAME STATE REMEMBER
7.5.9. FRAME STATE RESTORE
7.5.10. FRAME UNWIND ON
7.5.11. FRAME UNWIND OFF
7.5.12. FUNCTION、PROC
7.5.13. ENDFUNC、ENDP
7.6. 通知ディレクティブ
7.6.1. ASSERT
7.6.2. INFO
7.6.3. OPT
7.6.4. TTL、SUBT
7.7. 命令セットと構文選択のディレクティブ
7.7.1. ARM、THUMB、THUMBX、CODE16、CODE32
7.8. その他のディレクティブ
7.8.1. ALIGN
7.8.2. AREA
7.8.3. ATTR
7.8.4. END
7.8.5. ENTRY
7.8.6. EQU
7.8.7. EXPORT、GLOBAL
7.8.8. EXPORTAS
7.8.9. GET、INCLUDE
7.8.10. IMPORT、EXTERN
7.8.11. INCBIN
7.8.12. KEEP
7.8.13. NOFP
7.8.14. REQUIRE
7.8.15. REQUIRE8、PRESERVE8
7.8.16. ROUT

List of Tables

2.1. ARM プロセッサモード
2.2. 条件コードの接尾文字
2.3. 条件分岐のみの場合
2.4. すべての命令を条件実行する場合
2.5. ARM 状態のイミディエート定数(8 ビット)
2.6. MOV 命令に使用できる ARM 状態のイミディエート定数
2.7. Thumb-2 即値
2.8. MOV 命令に使用できる Thumb-2 状態の即値
2.9. スタック指向接尾文字および同等のアドレッシングモード接尾文字
2.10. 多重ロード/ストア命令の接尾文字
2.11. 以前の ARM アセンブリ言語からの変更点
2.12. 要件の緩和
2.13. UAL 以前の Thumb 構文と UAL 構文の相違点
3.1. 診断メッセージの重大度
3.2. 組み込み変数
3.3. 組み込みブール定数
3.4. armasm における演算子の優先順位
3.5. C における演算子の優先順位
3.6. 文字列を返す単項演算子
3.7. 数値または論理値を返す単項演算子
3.8. 乗算演算子
3.9. 文字列操作演算子
3.10. シフト演算子
3.11. 加算、減算、および論理演算子
3.12. 関係演算子
3.13. ブール演算子
3.14. コマンドラインオプション
3.15. armcc における等価のコマンドラインオプション
4.1. 命令の参照ページ
4.2. オフセットとアーキテクチャ、LDR/STR、ワード、ハーフワード、バイト
4.3. オプションとアーキテクチャ、LDR/STR (レジスタオフセット)
4.4. オフセットとアーキテクチャ、LDR/STR (ユーザモード)
4.5. pc 相対オフセット
4.6. pc 相対オフセット
4.7. 分岐命令の使用可否と分岐の範囲
4.8. expr の範囲とエンコーディング
5.1. NEON 命令の参照ページ
5.2. NEON と VFP に共通の命令の参照ページ
5.3. VFP 命令の参照ページ
5.4. 条件コード
5.5. NEON データ型
5.6. VFP データ型
5.7. NEON サチュレーションの範囲
5.8. 即値のパターン
5.9. 使用可能な定数
5.10. 有効範囲外の入力を指定した場合の結果
5.11. 有効範囲外の入力を指定した場合の結果
5.12. パラメータの有効な組み合わせ
5.13. パラメータの有効な組み合わせ
5.14. パラメータの有効な組み合わせ
5.15. UAL 以前の VFP ニーモニック
5.16. 浮動小数点定数値
6.1. ステータスレジスタおよび制御レジスタ
6.2. ワイヤレス MMX テクノロジの命令
6.3. ワイヤレス MMX テクノロジの疑似命令
7.1. 各ディレクティブの参照先
7.2. OPT ディレクティブの設定

著作権

® または ™ のマークが付いた言葉およびロゴは、この著作権情報で別段に規定されている場合を除き、ARM Limited の EU またはその他の国における登録商標および商標です。 本書に記載されている他の製品名は、各社の所有する商標です。

本書に記載されている情報の全部または一部、ならびに本書で紹介する製品は、著作権所有者の文書による事前の許可を得ない限り、転用・複製することを禁じます。

本書に記載されている製品は、今後も継続的に開発・改良の対象となります。 本書に含まれる製品およびその利用方法についての情報は、ARM が利用者の利益のために提供するものです。 したがって当社では、製品の市販性または利用の適切性を含め、暗示的・明示的に関係なく一切の責任を負いません。

本書は、本製品の利用者をサポートすることだけを目的としています。 本書に記載されている情報の使用、情報の誤りまたは省略、あるいは本製品の誤使用によって発生したいかなる損失・損傷についても、ARM Limited は一切責任を負いません。

ARM という用語が使用されている場合は、“ARM または必要に応じてその子会社” を指します。

機密保持ステータス

本書は非機密扱いであり、本書を使用、複製、および開示する権利は、ARM および ARM が本書を提供した当事者との間で締結した契約の条項に基づいたライセンスの制限により異なります。

アクセス制限は、ARM 社内による分類です。

製品ステータス

本書の情報は最終版であり、開発済み製品に対応しています。

Revision History
Revision A2002 年 8 月第 1.2 版
Revision B2003 年 1 月第 2.0 版
Revision C2003 年 9 月RealView Development Suite v2.0 向けリリース 2.0.1
Revision D2004 年 1 月RealView Development Suite v2.1 向けリリース 2.1
Revision E2004 年 12 月RealView Development Suite v2.2 向けリリース 2.2
Revision F2005 年 5 月RealView Development Suite v2.2 SP1 向けリリース 2.2
Revision G2006 年 3 月RealView Development Suite v3.0 向けリリース 3.0
Revision H2007 年 3 月RealView Development Suite v3.1 向けリリース 3.1
Revision I2008 年 9 月RealView Development Suite v4.0 向けリリース 4.0
Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IJ
Non-Confidential