RealView ® CompilationTools アセンブラガイド

バージョン 3.0


Table of Contents

序章
本書について
対象読者
本書の構成
表記規則
参考資料
フィードバック
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.2. ソース行の形式
3.3. 定義済みのレジスタおよびコプロセッサ名
3.3.1. 事前宣言されているレジスタ名
3.3.2. 事前宣言されているプログラムステータスレジスタ名
3.3.3. 事前宣言されている浮動小数点レジスタ名
3.3.4. 事前宣言されている NEON レジスタ名
3.3.5. 事前宣言されているコプロセッサ名
3.4. 組み込み変数および定数
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.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、STR(ポストインデクスレジスタオフセット)
4.2.6. LDR (プログラムカウンタ相対)
4.2.7. ADR
4.2.8. PLD、PLI
4.2.9. LDM、STM
4.2.10. PUSH および POP
4.2.11. RFE
4.2.12. SRS
4.2.13. LDREX、STREX
4.2.14. CLREX
4.2.15. SWP、SWPB
4.3. 汎用データ処理命令
4.3.1. フレキシブル第 2 オペランド
4.3.2. ADD、SUB、RSB、ADC、SBC、RSC
4.3.3. SUBS PC, LR (Thumb-2のみ)
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. IT
4.3.14. 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. CBZ、CBNZ
4.8.3. 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、STC
4.9.5. LDC2、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.10.11. ENTERX、LEAVEX
4.10.12. CHKA
4.10.13. HB、HBL、HBLP、HBP
4.11. 擬似命令
4.11.1. ADRL 擬似命令
4.11.2. MOV32 擬似命令
4.11.3. LDR 擬似命令
5. NEON と VFP プログラミング
5.1. NEON / VFP レジスタバンク
5.1.1. レジスタバンクの NEON ビュー
5.1.2. レジスタバンクの VFPv3 ビュー
5.2. 条件コード
5.3. 一般的な情報
5.3.1. 例外
5.3.2. アーキテクチャのバージョン
5.3.3. NEON データ型
5.3.4. NEON の Normal、Long、Wide、Narrow、およびサチュレート命令
5.3.5. NEON スカラ
5.3.6. {0,1} を超える多項式算術演算
5.4. NEON と VFP に共通の命令
5.4.1. VLDR および VSTR
5.4.2. VLDM および VSTM
5.4.3. VMOV(2 本の ARM レジスタとNEON / VFP の間)
5.4.4. VMOV(1 本の ARM レジスタとNEON / VFP の間)
5.4.5. VMOV(1 本の ARM レジスタと単精度VFP の間)
5.4.6. MRS および MSR
5.5. NEON 論理演算と比較演算
5.5.1. VAND、VBIC、VEOR、VORN、およびVORR(レジスタ)
5.5.2. VBIC および VORR(イミディエート)
5.5.3. VBIF、VBIT、VBSL
5.5.4. VNOT
5.5.5. VACGE および VACGT
5.5.6. VCEQ、VCGE、VCGT、VCLE、およびVCLT
5.5.7. VTST
5.6. NEON 汎用データ処理命令
5.6.1. VCVT
5.6.2. VDUP
5.6.3. VEXT
5.6.4. VMOV、VMVN(イミディエート)
5.6.5. VMOV(レジスタ)
5.6.6. VMOVL, V{Q}MOVN, VQMOVUN
5.6.7. VREV
5.6.8. VSWP
5.6.9. VTBL, VTBX
5.6.10. VTRN
5.6.11. VUZP、VZIP
5.7. NEON シフト命令
5.7.1. VSHL、VQSHL、VQSHLU、およびVSHLL(イミディエートによる)
5.7.2. V{Q}{R}SHL(符号付き変数による)
5.7.3. V{R}SHR{N}, V{R}SRA(イミディエートによる)
5.7.4. VQ{R}SHR{U}N(イミディエートによる)
5.7.5. VSLI および VSRI
5.8. NEON 汎用算術命令
5.8.1. VABA{L} および VABD{L}
5.8.2. V{Q}ABS および V{Q}NEG
5.8.3. V{Q}ADD、VADDL、VADDW、V{Q}SUB、VSUBL、VSUBW
5.8.4. V{R}ADDHN および V{R}SUBHN
5.8.5. V{R}HADD および VHSUB
5.8.6. VPADD{L}、VPADAL
5.8.7. VMAX、VMIN、VPMAX、VPMIN
5.8.8. VCLS、VCLZ、VCNT
5.8.9. VRECPE および VRSQRTE
5.8.10. VRECPS および VRSQRTS
5.9. NEON 乗算命令
5.9.1. VMUL{L}、VMLA{L}、VMLS{L}
5.9.2. VMUL{L}、VMLA{L}、VMLS{L}(スカラによる)
5.9.3. VQDMULL、VQDMLAL、VQDMLSL(ベクタまたはスカラによる)
5.9.4. VQ{R}DMULH(ベクタまたはスカラによる)
5.10. NEON 要素と構造体のロード / ストア命令
5.10.1. インターリーブ
5.10.2. 要素と構造体のロード / ストア命令における境界調整の制約
5.10.3. VLDn およびVSTn (1 レーンへの 1 つの n 要素構造体)
5.10.4. VLDn (全レーンへの1 つの n 要素構造体)
5.10.5. VLDn およびVSTn (複数の n 要素構造体)
5.11. NEON 擬似命令
5.11.1. VAND および VORN(イミディエート)
5.11.2. VACLE および VACLT
5.11.3. VCLE および VCLT
5.12. ベクタ浮動小数点コプロセッサ
5.13. VFP レジスタ
5.13.1. レジスタバンク
5.13.2. ベクタ
5.14. VFP ベクタ演算とスカラ演算
5.14.1. スカラ演算、ベクタ演算、および混合演算の制御
5.15. VFP / NEON システムレジスタ
5.15.1. FPSCR:浮動小数点ステータス / 制御レジスタ
5.15.2. FPEXC:浮動小数点例外レジスタ
5.15.3. FPSID:浮動小数点システム ID レジスタ
5.15.4. NEON / VFP システムレジスタの各ビットの変更
5.16. ゼロクリアモード
5.16.1. ゼロクリアモードをいつ使用すべきか
5.16.2. ゼロクリアモードの使用による影響
5.16.3. ゼロクリアモードの影響を受けない演算
5.17. VFP 命令
5.17.1. FABS、FCPY、FNEG
5.17.2. FADD および FSUB
5.17.3. FCMP
5.17.4. FCVTDS
5.17.5. FCVTSD
5.17.6. FDIV
5.17.7. FMAC、FNMAC、FMSC、FNMSC
5.17.8. FMUL、FNMUL
5.17.9. FSITO、FUITO
5.17.10. FSQRT
5.17.11. FTOSI、FTOUI
5.17.12. FCONSTS、FCONSTD
5.17.13. FSHTOS、FSHTOD、FSLTOS、FSLTOD、FUHTOS、FUHTOD、FULTOS、FULTOD
5.17.14. FTOSHS、FTOSHD、FTOSLS、FTOSLD、FTOUHS、FTOUHD、FTOULS、FTOULD
5.18. VFP 擬似命令
5.18.1. VLDR 擬似命令
5.19. VFP ディレクティブとベクタ表記
5.19.1. ベクタ表記
5.19.2. VFPASSERT SCALAR
5.19.3. VFPASSERT VECTOR
6. ワイヤレス MMX テクノロジの命令
6.1. はじめに
6.2. ワイヤレス MMX テクノロジに対する ARM のサポート
6.2.1. レジスタ
6.2.2. ディレクティブ、WRN と WCN
6.2.3. Frame ディレクティブ
6.2.4. ロード命令およびストア命令
6.2.5. ワイヤレス MMX テクノロジの命令と XScale の命令
6.3. 命令の概要
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. DN、SN
7.2.10. QN
7.3. データ定義ディレクティブ
7.3.1. LTORG
7.3.2. MAP
7.3.3. FIELD
7.3.4. SPACE
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. フレームディレクティブ
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. END
7.8.4. ENTRY
7.8.5. EQU
7.8.6. EXPORT、GLOBAL
7.8.7. EXPORTAS
7.8.8. EXTERN
7.8.9. GET、INCLUDE
7.8.10. IMPORT
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.8. MOV 命令に使用できる Thumb 状態のイミディエート定数
2.9. 多重レジスタロード/ストア命令の接尾文字
2.10. 以前の ARM アセンブリ言語からの変更点
2.11. 要件の緩和
2.12. Thumb の古い構文と新しい構文の相違点
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. ブール演算子
4.1. 命令の参照ページ
4.2. 分岐命令の使用可否と分岐の範囲
5.1. NEON 命令の参照ページ
5.2. NEON と VFP に共通の命令の参照ページ
5.3. VFP 命令の参照ページ
5.4. 条件コード
5.5. NEON サチュレーションの範囲
5.6. 使用可能な定数
5.7. 有効範囲外の入力を指定した場合の結果
5.8. 有効範囲外の入力を指定した場合の結果
5.9. パラメータの有効な組み合わせ
5.10. パラメータの有効な組み合わせ
5.11. パラメータの有効な組み合わせ
6.1. ステータスレジスタおよび制御レジスタ
6.2. ワイヤレス MMX テクノロジの命令
6.3. ワイヤレス MMX テクノロジの疑似命令
7.1. 各ディレクティブの参照先
7.2. OPT ディレクティブの設定

著作権

® または ™ のマークが付いた言葉およびロゴは、ARM Limited が所有する登録商標または商標です。本書に記載されている他の製品名は、各社の所有する商標です。

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

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

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

機密保持ステータス

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

製品ステータス

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

Revision History
Revision A 2002年 8 月 第 1.2 版
Revision B 2003年 1 月 第 2.0 版
Revision C 2003年 9 月 RVDS v2.0 リリース(第 2.0.1 版)
Revision D 2004年 1 月 RVDS v2.1 リリース(第 2.1 版)
Revision E 2004年 12 月 RVDS v2.2 リリース(第 2.2 版)
Revision F 2005年 5 月 RVDS v2.2 SP1 リリース(第 2.2版)
Revision G 2006年 3 月 RVDS v3.0 リリース(第 3.0 版)
Copyright © 2002-2006 ARM Limited. All rights reserved. ARM DUI 0204GJ
Non-Confidential