ARM® デベロッパスイート - ARM Information Center

ARM デベロッパスイート
®
バージョン 1.2
アセンブラガイド
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM デベロッパスイート
アセンブラガイド
Copyright © 2000, 2001 ARM Limited. All rights reserved.
リリース情報
本書の改訂履歴は以下の通りです。
改訂履歴
日付
発行
変更内容
2000 年 11 月
A
リリース 1.1
2001 年 11 月
B
リリース 1.2
著作権
または ™ のマークが付いた言葉およびロゴは、ARM Limited が所有する登録商標または商標です。
本書に記載されている他の製品名は、各社の所有する商標です。
®
本書に記載されている情報の全部または一部、ならびに本書で紹介する製品は、著作権所有者の
文書による事前の許可を得ない限り、転用・複製することを禁じます。
本書に記載されている製品は、今後も継続的に開発・改良の対象となります。本書に含まれる製
品およびその利用方法についての情報は、ARM が利用者の利益のために提供するものです。した
がって当社では、製品の市販性または利用の適切性を含め、暗示的・明示的に関係なく一切の責
任を負いません。
本書は、本製品の利用者をサポートすることだけを目的としています。本書に記載されている情
報の使用、情報の誤りまたは省略、あるいは本製品の誤使用によって発生したいかなる損失・損
傷についても、ARM Limited は一切責任を負いません。
ii
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
目次
ARM デベロッパスイートアセンブラガイド
序章
本書について .........................................................................................................vi
ご意見・ご質問......................................................................................................ix
第1章
はじめに
1.1
第2章
ARM および Thumb アセンブリ言語の記述
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
第3章
はじめに ............................................................................................................. 2-2
ARM アーキテクチャの概要............................................................................... 2-3
アセンブリ言語モジュールの構造.................................................................... 2-12
C プリプロセッサの使用 .................................................................................. 2-19
条件付き実行 .................................................................................................... 2-20
レジスタへの定数のロード............................................................................... 2-25
レジスタへのアドレスのロード ....................................................................... 2-30
多重レジスタロード / ストア命令..................................................................... 2-39
マクロの使用 .................................................................................................... 2-48
MAP ディレクティブと FIELD ディレクティブを使用したデータ構造の記述 2-51
フレームディレクティブの使用 ....................................................................... 2-66
アセンブラについて
3.1
ARM DUI0068BJ-00
ARM デベロッパスイートのアセンブラについて .............................................. 1-2
コマンド構文 ...................................................................................................... 3-2
Copyright © 2000, 2001 ARM Limited. All rights reserved.
iii
目次
3.2
3.3
3.4
3.5
3.6
第4章
ARM 命令について
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
第5章
Thumb メモリアクセス命令............................................................................... 5-4
Thumb 算術命令............................................................................................... 5-15
Thumb 汎用データ処理命令............................................................................. 5-22
Thumb 分岐命令............................................................................................... 5-31
Thumb ソフトウェア割り込み命令とブレークポイント命令 .......................... 5-37
Thumb 擬似命令............................................................................................... 5-39
ベクタ浮動小数点プログラミング
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
6.9
第7章
条件付き実行...................................................................................................... 4-4
ARM メモリアクセス命令 .................................................................................. 4-6
ARM 汎用データ処理命令 ................................................................................ 4-23
ARM 乗算命令 .................................................................................................. 4-39
ARM 飽和算術命令........................................................................................... 4-55
ARM 分岐命令 .................................................................................................. 4-57
ARM コプロセッサ命令.................................................................................... 4-62
その他の ARM 命令.......................................................................................... 4-71
ARM 擬似命令 .................................................................................................. 4-78
Thmub 命令について
5.1
5.2
5.3
5.4
5.5
5.6
第6章
ソース行の形式 .................................................................................................. 3-8
事前定義されるレジスタ名とコプロセッサ名 ................................................... 3-9
ビルトイン変数 ................................................................................................ 3-10
シンボル........................................................................................................... 3-12
式、リテラル、演算子 ..................................................................................... 3-18
ベクタ浮動小数点コプロセッサ......................................................................... 6-4
浮動小数点レジスタ........................................................................................... 6-5
ベクタ演算とスカラ演算.................................................................................... 6-7
VFP と条件コード.............................................................................................. 6-8
VFP システムレジスタ..................................................................................... 6-10
ゼロフラッシュモード ..................................................................................... 6-13
VFP 命令 .......................................................................................................... 6-15
VFP 擬似命令 ................................................................................................... 6-38
VFP ディレクティブとベクタ表記................................................................... 6-40
ディレクティブについて
7.1
7.2
7.3
7.4
7.5
7.6
7.7
ディレクティブ一覧(アルファベット順)......................................................... 7-2
シンボル定義ディレクティブ ............................................................................ 7-3
データ定義ディレクティブ .............................................................................. 7-13
アセンブリ制御ディレクティブ....................................................................... 7-26
フレーム記述ディレクティブ .......................................................................... 7-33
通知ディレクティブ......................................................................................... 7-44
その他のディレクティブ.................................................................................. 7-49
用語集
iv
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
序章
本章では、ARM デベロッパスイート(ADS)のアセンブラとアセンブリ言語に関する
説明書を紹介します。本章は以下のセクションから構成されています。
•
本書について:P. vi
•
ARM DUI0068BJ-00
ご意見・ご質問:P. ix
Copyright © 2000, 2001 ARM Limited. All rights reserved.
v
序章
本書について
本書は、ADS アセンブラ(独立型アセンブラ「armasm」および C コンパイラや C++
コンパイラのインラインアセンブラ)に関する情報を記載した解説書です。また、ア
センブラに指定できるコマンドラインオプション、アセンブリ言語プログラミングに
使用できる擬似命令やディレクティブ、および ARM、Thumb®、ベクタ浮動小数点
(VFP)の各命令セットについても説明します。
対象読者
本書は、ADS を使用してアプリケーションを開発する全ての開発者を対象としていま
す。したがって本書の内容は、「ADS スタートアップガイド」に記載されている ARM
開発ツールを熟知した経験豊富なソフトウェア開発者を想定して書かれています。
本書の構成
本書は以下の章から構成されています。
第1章
「はじめに」
ADS v1.2 のアセンブラおよびアセンブリ言語について概説します。
第2章
「ARM および Thumb アセンブリ言語の記述」
ARM アセンブラおよびアセンブリ言語を使用する際の参考情報を記載
しています。
第3章
「アセンブラについて」
ARM アセンブラで使用できる言語の構文と構造について詳しく説明し
ます。
第4章
「ARM 命令について」
ARM 命令セットについて詳しく説明します。
第5章
「Thmub 命令について」
Thumb 命令セットについて詳しく説明します。
第6章
「ベクタ浮動小数点プログラミング」
VFP 命令セットおよび他の VFP 固有のアセンブリ言語について説明し
ます。
第7章
「ディレクティブについて」
ARMアセンブラarmasmで使用できるアセンブラディレクティブについ
て説明します。
vi
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
序章
表記規則
本書では以下の表記規則を使用しています。
monospace コマンド、ファイル名、プログラム名、ソースコード等、キーボードか
ら入力可能なテキストを示しています。
monospace コマンドまたはオプションに使用可能な略語を示しています。コマンド
名またはオプション名を全て入力する代わりに、下線部分の文字だけを
入力してこれらを指定することができます。
monospace italic
コマンドまたは関数への引数で、特定の値に置き換えることが可能なも
のを示しています。
monospace bold
サンプルコード以外に使用される言語キーワードを示しています。
italic
重要事項、重要用語、相互参照、引用箇所を斜体で記載しています。
bold
メニュー名等のインタフェース要素を太字で記載しています。また、必
要に応じて記述リスト内の重要箇所や ARM プロセッサのシグナル名に
も太字を使用しています。
参考資料
ここでは、ARM プロセッサファミリ向け開発コードに関する補足情報を記載した ARM
Limited および各社の出版物を紹介します。
ARM は自社出版物の定期的な更新・修正を行っています。最新の正誤表および追補表
については、http://www.arm.com をご覧下さい。
また、よくある質問とその答えをまとめた FAQ リストを以下のサイトでご覧頂けます。
http://www.arm.com/DevSupp/Sales+Support/faq.html
ARM の出版物
本書に記載されている情報は、ADS に含まれている開発ツールに関するものです。本
スイートには本書の他に以下の資料が同梱されています。
ARM DUI0068BJ-00
•
ADS インストール / ライセンス管理ガイド(ARM DUI 0139)
•
スタートアップガイド(ARM DUI 0064)
•
ADS コンパイラ / ライブラリガイド(ARM DUI 0067)
Copyright © 2000, 2001 ARM Limited. All rights reserved.
vii
序章
•
ADS リンカ / ユーティリティガイド(ARM DUI 0151)
•
CodeWarrior IDE Guide(ARM DUI 0065)
•
AXD/armsd デバッガガイド(ARM DUI 0066)
•
ADS デバッグターゲットガイド(ARM DUI 0058)
•
ADS デベロッパガイド(ARM DUI 0056)
•
ARM Applications Library Programmer's Guide(ARM DUI 0081)
ARM デベロッパスイートには上記の他に以下の文書も収録されています。
•
ARM Architecture Reference Manual(ARM DDI 0100)。DynaText 形式のオンライン
ブック、および PDF 形式で
install_directory\PDF\ARM-DDI0100B_armarm.pdf に収録しています。
•
ARM ELF specification(SWS ESPC 0003)。PDF 形式で
install_directory\PDF\specs\ARMELF.pdf に収録しています。
•
TIS DWARF 2 仕様書。PDF 形式で
install_directory\PDF\specs\TIS-DWARF2.pdf に収録しています。
•
ARM/Thumb プロシージャコール仕様書(SWS ESPC 0002)。PDF 形式で
install_directory\PDF\specs\ATPCS.pdf に収録しています。
また、ARM 製品に関連する特定の情報については、以下の出版物を参照して下さい。
•
ARM Reference Peripheral Specification(ARM DDI 0062)
•
ご使用のハードウェアデバイスに関する ARM データシートまたはテクニカルリ
ファレンスマニュアル
他の出版物
ARM アーキテクチャに関する一般的な情報については、以下の出版物を参照して下さ
い。
•
viii
ARM System-on-chip Architecture, Furber, S., (2nd Edition, 2000). Addison Wesley
Longman, Harlow, England. ISBN 0-201-67519-6.
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
序章
ご意見・ご質問
ARM Limited では、ADS および本書に関するご意見等をお待ちしています。
ARM デベロッパスイートに関するご意見・ご質問
ADS に関するご意見・ご質問等がございましたら、製品購入元までご連絡下さい。そ
の際、迅速かつ適切な対応をさせて頂くために、以下の情報をご用意下さい。
•
会社名と名前
•
製品のシリアル番号
•
ご使用になっている製品のリリース情報
•
ご使用のコンピュータのプラットフォームの詳細(ハードウェアプラットフォー
ム、オペレーティングシステムの種類とバージョン等)
•
当該の問題が繰り返し発生するコードの小さなスタンドアロンサンプル
•
当初の目的と、実際に起こったことに関する詳しい説明
•
コマンドラインオプションを含め、使用した全てのコマンド
•
問題を例示するサンプル出力
•
バージョン番号やビルド番号を含め、使用しているツールのバージョン情報
本書に関するご意見
本書に関するご意見等がございましたら、電子メールに以下の情報をご記入の上、
errata@arm.com までお寄せ下さい。
•
•
•
•
資料名
資料番号
ご意見のあるページ番号
問題点の詳しい説明
補足または向上すべき点についてのご提案もお待ちしています。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ix
序章
x
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
第1章
はじめに
本章では、ARM デベロッパスイート(ADS)v1.2 に提供されているアセンブラについ
て説明します。本章は以下のセクションから構成されています。
•
ARM デベロッパスイートのアセンブラについて:P. 1-2
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
1-1
はじめに
1.1
ARM デベロッパスイートのアセンブラについて
ARM デベロッパスイート(ADS)には以下のアセンブラが提供されています。
•
独立型アセンブラ armasm
•
C および C++ コンパイラに組み込まれた最適化インラインアセンブラ
これらのアセンブラへの入力に使用する言語は基本的には同じですが、インラインア
センブラで使用できる言語の機能には制限があります。インラインアセンブラの詳細
については、ADS デベロッパガイドの「C、C++、アセンブリ言語の混合」を参照して
下さい。
第 2 章以降は主に armasm について説明します。
1-2
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
第2章
ARM および Thumb アセンブリ言語の記述
本章では、ARM および Thumb アセンブリ言語を記述する際の一般原則を説明します。
本章は以下のセクションから構成されています。
•
はじめに:P. 2-2
•
ARM アーキテクチャの概要:P. 2-3
•
アセンブリ言語モジュールの構造:P. 2-12
C プリプロセッサの使用:P. 2-19
条件付き実行:P. 2-20
レジスタへの定数のロード:P. 2-25
レジスタへのアドレスのロード:P. 2-30
多重レジスタロード / ストア命令:P. 2-39
マクロの使用:P. 2-48
MAP ディレクティブと FIELD ディレクティブを使用したデータ構造の記述:
P. 2-51
フレームディレクティブの使用:P. 2-66
•
•
•
•
•
•
•
•
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-1
ARM および Thumb アセンブリ言語の記述
2.1
はじめに
本章では、ARM および Thumb アセンブリ言語モジュールの基本的かつ実践的な記述方
法を説明します。また、ARM アセンブラ(armasm)の機能についても説明します。
本章では、ARM、Thumb、VFP の各命令セットについては詳しく説明していません。各
命令セットの詳細については、第 4 章「ARM 命令について」、第 5 章「Thmub 命令につ
いて」、第 6 章「ベクタ浮動小数点プログラミング」を参照して下さい。また、その他
の関連情報については ARM Architecture Reference Manual を参照して下さい。
2.1.1
サンプルコード
本章ではいくつかのサンプルコードを紹介しています。これらの多くは、ADS の
examples\asm ディレクトリに収録されています。
アセンブリ言語ファイルの作成、リンク、実行を行うには、以下の手順に従って下さい。
1.
コマンドプロンプトで armasm -g filename.s と入力してファイルをアセン
ブルし、デバッグテーブルを生成します。
2.
armlink filename.o -o filename と入力してオブジェクトファイルをリン
クし、ELF 実行ファイルを生成します。
3.
armsd filename と入力して、イメージファイルをデバッガにロードします。
4.
armsd: プロンプトで go と入力し、イメージを実行します。
5.
armsd: プロンプトで quit と入力すると、コマンドラインに戻ります。
アセンブラがソースコードを変換する様子を確認するには、以下のように入力します。
fromelf -text/c filename.o
または、インタリーブを有効にして、AXD でこのモジュールを実行します。
詳細については以下を参照して下さい。
2-2
•
armsd および AXD:AXD/armsd デバッガガイド
•
armlink および fromelf:ADS リンカ / ユーティリティガイド
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.2
ARM アーキテクチャの概要
このセクションでは、ARM アーキテクチャについて簡単に説明します。
ARM プロセッサはロード / ストアアーキテクチャを実装している典型的な RISC プロ
セッサです。メモリにアクセスできるのは、ロード命令とストア命令だけです。デー
タ処理命令は、レジスタ内容のみに作用します。
2.2.1
アーキテクチャのバージョン
本書に掲載している情報およびサンプルは、ARM アーキテクチャ v3 以上のアーキテ
クチャを実装したプロセッサの使用を前提としています。各アーキテクチャバージョ
ンの詳細については、ARM Architecture Reference Manual を参照して下さい。
上記のどのプロセッサも 32 ビットのアドレシング範囲を使用します。
2.2.2
ARM 状態と Thumb 状態
ARM アーキテクチャv4T 以上では、
Thumb 命令セットと呼ばれる 16 ビットの命令セッ
トを定義しています。Thumb 命令セットの機能は、32 ビット ARM 命令セットの機能
のサブセットです。詳細については、P. 2-9「Thumb 命令セットの概要」を参照して下
さい。
Thumb 命令セットを実行するプロセッサは、Thumb 状態で動作します。ARM 命令セッ
トを実行するプロセッサは、ARM 状態で動作します。
ARM 状態のプロセッサは Thumb 命令を実行できません。また、Thumb 状態のプロセッ
サは、ARM 命令を実行できません。現在の状態とは異なる命令セットの命令をプロ
セッサが受け取らないようにする必要があります。
どちらの命令セットにも、プロセッサ状態を変更する命令が含まれています。
また、CODE16 ディレクティブおよび CODE32 ディレクティブを使用して、正しいオ
ペコードを生成するアセンブラモードに切り替える必要があります。詳細については、
P. 7-54「CODE16 と CODE32」を参照して下さい。
ARM プロセッサは必ず ARM 状態でコードの実行を開始します。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-3
ARM および Thumb アセンブリ言語の記述
2.2.3
プロセッサモード
ARM プロセッサは、アーキテクチャのバージョンに応じて、7 つまでのプロセッサモー
ドをサポートします。サポートしているモードは以下の通りです。
•
ユーザ
•
FIQ - 高速割り込み要求
•
IRQ - 割り込み要求
•
•
•
•
スーパバイザ
アボート
未定義
システム(ARM アーキテクチャ v4 以上)
ユーザモード以外の全モードは、特権モードと呼ばれています。
通常、タスク保護が必要なアプリケーションはユーザモードで実行します。組み込み
アプリケーションの中には、スーパーバイザモードまたはシステムモードだけで実行
するものもあります。
ユーザモード以外のモードは、例外処理の目的で、あるいは特権付きリソースにアク
セスする目的で使用されます。詳細については、ADS デベロッパガイドの「プロセッ
サ例外処理」および ARM Architecture Reference Manual を参照して下さい。
2.2.4
レジスタ
ARM プロセッサには、37 個のレジスタがあります。これらのレジスタは、部分的に
オーバラップしているバンクに配列されます。プロセッサモードごとに異なるレジス
タバンクが使用されます。プロセッサ例外または特権命令を処理するとき、バンクレ
ジスタは高速コンテキストスイッチを行います。レジスタバンクの構成については、
ARM Architecture Reference Manual を参照して下さい。
ARM アーキテクチャ v3 以上では、以下のレジスタを使用することができます。
•
30 個の汎用 32 ビットレジスタ
•
プログラムカウンタ(pc):P. 2-5
カレントプログラムステータスレジスタ(CPSR):P. 2-5
5 本の保存プログラムステータスレジスタ(SPSR):P. 2-5
•
•
30 個の汎用 32 ビットレジスタ
現在のプロセッサモードに応じて、一度に 15 個(r0、r1、...、r13、r14)までの汎用レ
ジスタが認識されます。
原則として、ARM アセンブリ言語では r13 がスタックポインタ(sp)として使用され
ます。C コンパイラと C++ コンパイラでは、必ず r13 がスタックポインタとして使用
されます。
2-4
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
ユーザモードでは、r14 がリンクレジスタ(lr)として使用され、サブルーチンコール
が行われたときにリターンアドレスがストアされます。リターンアドレスがスタック
にストアされる場合は、r14 を汎用レジスタとして使用することもできます。
例外処理モードでは、r14 が例外のリターンアドレス(または例外内でサブルーチン
コールが実行される場合はサブルーチンのリターンアドレス)を保持します。リター
ンアドレスがスタックにストアされる場合は、r14を汎用レジスタとして使用できます。
プログラムカウンタ(pc)
)
プログラムカウンタは、r15(pc)としてアクセスされます。ARM 状態では、1 命令ご
とに 1 ワード(4 バイト)ずつインクリメントされ、Thumb 状態では 2 バイトずつイン
クリメントされます。分岐命令は、デスティネーションアドレスをプログラムカウン
タにロードします。データ処理命令を使用して、プログラムカウンタを直接ロードす
ることもできます。例えば、サブルーチンから戻るには、以下のコマンドを使用して、
リンクレジスタをプログラムカウンタにコピーします。
MOV
pc,lr
実行中は、r15 は現在実行中の命令のアドレスを保持しません。通常、実行中の命令の
アドレスは、ARM 命令では pc-8、Thumb 命令では pc-4 になります。
カレントプログラムステータスレジスタ(CPSR)
)
CPSR は以下を保持します。
•
•
•
論理演算装置(ALU)ステータスフラグのコピー
現在のプロセッサモード
割り込みディセーブルフラグ
条件付き命令を実行するかどうかは、CPSR 内の ALU ステータスフラグによって決定
されます。詳細については、P. 2-20「条件付き実行」を参照して下さい。
Thumb 対応プロセッサでは、CPSR が現在のプロセッサ状態(ARM または Thumb)も
保持します。
ARM アーキテクチャ v5TE の場合、CPSR は Q フラグも保持します(P. 2-20「ALU ス
テータスフラグ」参照)。
5 本の保存プログラムステータスレジスタ(SPSR)
)
SPSR は、例外発生時に CPSR をストアする目的で使用されます。各例外処理モードで、
1 つの SPSR にアクセスできます。ユーザモードとシステムモードは例外処理モードで
はないため、SPSR は使用されません。詳細については、ADS デベロッパガイドの「プ
ロセッサ例外処理」を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-5
ARM および Thumb アセンブリ言語の記述
2.2.5
ARM 命令セットの概要
ARM 命令は全て 32 ビット長です。命令はワード境界整列でストアされるため、ARM
状態では命令アドレスの最下位 2 ビットが常に 0 になります。最下位ビットを使用し
て、分岐先のコードが Thumb コードか ARM コードかを決定する命令もあります。
ARM 命令セットの構文については、第 4 章「ARM 命令について」を参照して下さい。
ARM 命令は、いくつかの機能グループに分類することができます。
•
•
分岐命令
データ処理命令
単一レジスタロード / ストア命令:P. 2-7
•
多重レジスタロード / ストア命令:P. 2-7
•
ステータスレジスタアクセス命令:P. 2-7
•
セマフォ命令:P. 2-7
•
コプロセッサ命令:P. 2-7
•
分岐命令
分岐命令は以下の目的に使用します。
•
逆方向に分岐してループを形成する。
•
条件構造内で順方向に分岐する。
•
サブルーチンへ分岐する。
•
プロセッサを ARM 状態から Thumb 状態に切り替える。
データ処理命令
データ処理命令は汎用レジスタに作用します。データ処理命令は、2 個のレジスタの内
容に対して加算、減算、ビットごとの論理演算などを実行し、3 つ目のレジスタにその
結果を返します。これらの命令は、単一レジスタの値、またはレジスタの値と命令内
で渡される定数(イミディエート値)に対して演算を実行することもできます。
ロング乗算命令(一部のアーキテクチャでは使用不可)は、64 ビットの結果を 2 個の
レジスタに分けて返します。
2-6
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
単一レジスタロード / ストア命令
単一レジスタロード / ストア命令は、単一レジスタとメモリ間で値のロード / ストアを
行います。これらの命令を使用して、32 ビットワードまたは 8 ビット符号なしバイト
のロード / ストアを行うことができます。ARM アーキテクチャ v4 以上では、16 ビッ
ト符号なしハーフワードのロードとストア、あるいは 16 ビットハーフワードまたは 8
ビットバイトのロードと符号拡張も行うことができます。
多重レジスタロード / ストア命令
多重レジスタロード / ストア命令は、汎用レジスタのサブセットをメモリからロード、
またはメモリにストアします。多重レジスタロード / ストア命令の詳細については、
P. 2-39「多重レジスタロード / ストア命令」を参照して下さい。
ステータスレジスタアクセス命令
これらの命令は、CPSR または SPSR の内容を汎用レジスタとの間で転送します。
セマフォ命令
これらの命令は、メモリセマフォのロードおよび変更を行います。
コプロセッサ命令
コプロセッサ命令は、ARM アーキテクチャの一般的な拡張方法をサポートします。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-7
ARM および Thumb アセンブリ言語の記述
2.2.6
ARM 命令の機能
ARM 命令には以下の基本事項が適用されます。
•
•
•
条件付き実行
レジスタアクセス
インラインバレルシフタへのアクセス
条件付き実行
ほぼ全ての ARM 命令は、CPSR 内の ALU ステータスフラグの値に基づいて条件付き
で実行することができます。分岐を使用して条件付き命令をスキップする必要はあり
ませんが、一連の命令が同じ条件に依存する場合はそうした方が良い場合もあります。
データ処理命令がこれらのフラグの状態をセットするかどうかは指定することができ
ます。2 つの命令の間に数多くの命令が存在する場合でも、一方の命令でセットされた
フラグを使用して、他方の命令の実行を制御することができます。
詳細については、P. 2-20「条件付き実行」を参照して下さい。
レジスタアクセス
ARM 状態では、全ての命令が r0 ~ r14 にアクセスできます。また、ほとんどの命令が
r15(pc)にアクセスできます。MRS 命令および MSR 命令で CPSR と SPSR の内容を汎
用レジスタに移動し、通常のデータ処理命令でその内容を操作することができます。詳
細については、P. 4-73「MRS」および P. 4-74「MSR」を参照して下さい。
インラインバレルシフタへのアクセス
ARM 論理演算装置(ALU)には、シフト演算とロテート演算を可能にする 32 ビット
バレルシフタがあります。全ての ARM データ処理命令および単一レジスタデータ転送
命令の第 2 オペランドは、データ処理またはデータ転送の実行前に、それぞれの命令
の中でシフトすることができます。これにより、以下のようなことが可能になります。
•
位取りアドレシング
•
定数による乗算
•
定数の構成
バレルシフタを使用して定数を生成する方法については、P. 2-25「レジスタへの定数
のロード」を参照して下さい。
2-8
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.2.7
Thumb 命令セットの概要
Thumb 命令セットの機能は、ARM 命令セットの機能のサブセットとほぼ同じです。
Thumb 命令セットは、C コンパイラまたは C++ コンパイラによる生成を目的として最
適化されています。
Thumb 命令は全て 16 ビット長で、ハーフワード境界整列でメモリにストアされます。
このため、Thumb 状態では、命令のアドレスの最下位ビットが常に 0 になります。命
令の中には、最下位ビットを使用して、分岐先のコードが Thumb コードか ARM コー
ドかを決定するものもあります。
全ての Thumb データ処理命令が以下を行います。
•
レジスタ内の完全 32 ビット値に作用する。
•
データアクセスと命令フェッチに完全 32 ビットアドレスを使用する。
Thumb 命令セットの構文および Thumb 命令と ARM 命令の相違点については、第 5 章
「Thmub 命令について」を参照して下さい。
2.2.8
Thumb 命令の機能
Thumb 命令には以下の基本事項が適用されます。
•
•
•
条件付き実行
レジスタアクセス
バレルシフタへのアクセス:P. 2-10
条件付き実行
CPSR 内の ALU ステータスフラグに基づいて条件付きで実行できる Thumb 命令は、条
件付き分岐命令だけです。全てのデータ処理命令が ALU 状態フラグを更新します。MOV
命令または ADD 命令のオペランドとして 1 つ以上の上位レジスタが指定されている場
合は、フラグを更新することができません。
条件を設定する命令とその条件に依存する条件付き分岐の間にデータ処理命令を使用
することはできません。条件付き分岐は、条件付きにしたい命令があるところで使用
して下さい。
レジスタアクセス
Thumb 状態では、ほとんどの命令が r0 ~ r7 にしかアクセスできません。レジスタ r0
~ r7 は、下位レジスタとして参照されます。
レジスタ r8 ~ r15 へのアクセスは制限されています。Thumb 状態では、r8 ~ r15 が上
位レジスタとして参照されます。レジスタ r8 ~ r15 は高速一時記憶域などに使用でき
ます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-9
ARM および Thumb アセンブリ言語の記述
上位レジスタにアクセス可能なThumbデータ処理命令の一覧については、第5章
「Thmub
命令について」を参照して下さい。
バレルシフタへのアクセス
Thumb 状態では、LSL、LSR、ASR、ROR のいずれかの命令を使用した個々の演算での
み、バレルシフタを使用できます。
2.2.9
Thumb 命令セットと ARM 命令セットの違い
Thumb 命令セットと ARM 命令セットの一般的な違いについては、以下のセクションで
説明しています。
•
分岐命令
•
データ処理命令
•
単一レジスタロード / ストア命令:P. 2-11
•
多重レジスタロード / ストア命令:P. 2-11
Thumb コプロセッサ命令、Thumb セマフォ命令、CPSR または SPSR にアクセスする
Thumb 命令はありません。
分岐命令
分岐命令は以下の目的に使用します。
•
逆方向に分岐してループを形成する。
•
条件付き構造内で順方向に分岐する。
•
サブルーチンへ分岐する。
•
プロセッサを Thumb 状態から ARM 状態に切り替える。
条件付き分岐をはじめとするプログラム相対分岐の範囲はARMコードの場合よりも限
定され、サブルーチンへの分岐は無条件分岐だけに限られています。
データ処理命令
データ処理命令は汎用レジスタに作用します。多くの場合、演算結果は第 3 のレジス
タではなく、オペランドレジスタのいずれか 1 つに返す必要があります。Thumb 状態
で使用できるデータ処理命令は、ARM 状態ほど多くありません。これらのデータ処理
命令によるレジスタ r8 ~ r15 へのアクセスは制限されます。
MOV命令またはADD命令がレジスタr8~r15にアクセスする場合を除き、CPSR内のALU
ステータスフラグはデータ処理命令によって必ず更新されます。レジスタ r8 ~ r15 に
アクセスする Thumb データ処理命令は、このフラグを更新できません。
2-10
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
単一レジスタロード / ストア命令
これらの命令は、1 つの下位レジスタの値をメモリからロード、またはメモリにストア
します。Thumb 状態の場合、単一レジスタロード / ストア命令がアクセスできるのはレ
ジスタ r0 ~ r7 のみです。
多重レジスタロード / ストア命令
LDM と STM は、レジスタ r0 ~ r7 のサブセットをメモリからロード、またはメモリにスト
アします。
PUSH 命令と POP 命令は、ベースとしてスタックポインタ(r13)を使用し、フル下降ス
タックを実装します。r0 ~ r7 の転送に加え、PUSH 命令でリンクレジスタをストアし、
POP 命令でプログラムカウンタをロードすることができます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-11
ARM および Thumb アセンブリ言語の記述
2.3
アセンブリ言語モジュールの構造
アセンブリ言語とは、オブジェクトコードを生成するために、ARM アセンブラ
(armasm)が解析、アセンブルする言語です。このアセンブリ言語としては以下を使
用することができます。
•
ARM アセンブリ言語
2.3.1
•
Thumb アセンブリ言語
•
ARM アセンブリ言語と Thumb アセンブリ言語の混合
アセンブリ言語ソースファイルのレイアウト
以下はアセンブリ言語で記述するソース行の汎用形式です。
{label} {instruction|directive|pseudo-instruction} {;comment}
注
ラベルが指定されていない場合でも、命令、擬似命令ならびにディレクティブの前に
は、スペースやタブ等のスペースを挿入する必要があります。
ソース行の 3 つのセクションは全てオプションです。コードを読みやすくするため、空
白行を使用してもかまいません。
大文字・小文字の規則
命令ニーモニック、ディレクティブ、シンボリックレジスタ名は、大文字と小文字の
どちらで記述してもかまいませんが、大文字と小文字を混ぜることはできません。
行の長さ
ソースファイルを読みやすくするには、行末に逆クラッシュ(\)を挿入して長いソー
ス行を複数行に分割します。逆スラッシュの後に文字(スペースやタブも含む)を挿
入してはなりません。アセンブラは、逆スラッシュ / 行末シーケンスをスペースとして
処理します。
注
引用符が付いたストリング内で逆スラッシュ / 行末シーケンスを使用しないで下さい。
逆スラッシュを使用した伸張分も含め、行の長さの正確な限界は行の内容によって異
なりますが、128 ~ 255 文字の間が一般的です。
2-12
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
ラベル
ラベルは、アドレスを表すシンボルです。ラベルで指定されたアドレスはアセンブル
時に計算されます。
アセンブラは、ラベルが定義されているセクションの起点を基準としてラベルのアド
レスを計算します。同じセクション内のラベルへの参照には、プログラムカウンタ +/オフセットの値を使用できます。これをプログラム相対アドレシングと呼びます。
ラベルはマップ内で定義することができます。詳細については、P. 2-51「MAP ディレ
クティブと FIELD ディレクティブを使用したデータ構造の記述」を参照して下さい。
このマップの起点を指定レジスタ内にランタイムに配置すると、ラベルへの参照に指定
レジスタ + オフセットが使用されます。これをレジスタ相対アドレシングと呼びます。
他のセクションに含まれるラベルのアドレスはリンク時に計算されます。このとき、リ
ンカは各セクションにメモリ内の特定の位置を割り当てます。
ローカルラベル
ローカルラベルは、ラベルのサブクラスです。ローカルラベルは、0 ~ 99 の値で始ま
ります。他のラベルとは異なり、ローカルラベルは何度でも定義することができます。
ローカルラベルはマクロを使用してラベルを生成するときに便利です。アセンブラは
ローカルラベルへの参照を検出すると、そのローカルラベルに近いインスタンスに参
照をリンクします。
ローカルラベルの有効範囲は、AREA ディレクティブによって制限されます。ROUT ディ
レクティブを使用すると、この有効範囲をさらに厳密に制限することができます。
以下に関する詳しい説明については、P. 3-16「ローカルラベル」を参照して下さい。
•
•
ローカルラベル宣言の構文
アセンブラがローカルラベルへの参照とラベルを関連付ける方法
コメント
行内の最初のセミコロンは、ストリング定数の中に出現する場合を除き、コメントの
開始を意味します。その行の終わりがコメントの終わりです。コメントのみの行も有
効です。アセンブラは、全てのコメントを無視します。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-13
ARM および Thumb アセンブリ言語の記述
定数
定数には、数値、ブール、文字、ストリングのいずれかを使用することができます。
数値定数には以下の 3 つの形式を使用することができます。
数値
2-14
•
10 進数(例:123)
•
16 進数(例:0x7B)
•
n_xxx
n
xxx
2 ~ 9 の基数
その基数の数値
ブール
ブール定数 TRUE と FALSE は、{TRUE} および {FALSE} と記述する必
要があります。
文字
文字定数は、引用符(' ')で囲まれた 1 文字または 1 拡張文字(標準 C
拡張文字を使用)で構成されます。
ストリング
ストリングは、二重引用符に囲まれた文字とスペースで構成されます。
ストリング内で二重引用符またはドル記号をリテラルテキスト文字とし
て使用する場合、該当する文字を対で使用する必要があります。例えば、
ストリング内で 1 つの $ を使用する場合は、$$ と記述する必要がありま
す。ストリング定数内では標準 C エスケープシーケンスを使用できます。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.3.2
ARM アセンブリ言語モジュールのサンプル
例 2-1 は、アセンブリ言語モジュールの主要構成要素のいくつかを示しています。この
サンプルは ARM アセンブリ言語で記述されています。このサンプルは、ADS の
examples\asm サブディレクトリ内の armex.s に収録されています。このサンプルの
アセンブル、リンクならびに実行方法については、P. 2-2「サンプルコード」を参照し
て下さい。
以下のセクションでは、このサンプルの構成要素について詳しく説明します。
例 2-1
AREA
ENTRY
ARMex, CODE, READONLY
; Name this block of code ARMex
; Mark first instruction to execute
MOV
MOV
ADD
r0, #10
r1, #3
r0, r0, r1
; Set up parameters
MOV
LDR
SWI
r0, #0x18
r1, =0x20026
0x123456
; angel_SWIreason_ReportException
; ADP_Stopped_ApplicationExit
; ARM semihosting SWI
start
; r0 = r0 + r1
stop
END
; Mark end of file
ELF セクションと AREA ディレクティブ
ELF セクションは、命名された不可分かつ独立したコードシーケンスまたはデータシー
ケンスから構成されます。アプリケーションを作成するには少なくとも 1 つのコード
セクションが必要です。
アセンブリまたはコンパイルからの出力には、以下を含めることができます。
•
1 つ以上のコードセクション。通常、これらは読み出し専用セクションです。
•
1 つ以上のデータセクション。通常、これらは読み出し / 書き込みセクションで
あり、ゼロ初期化(ZI)することが可能です。
リンカはセクション配置規則に基づいて各セクションをプログラムイメージ内に配置
します。ソースファイル内で隣接するセクションが、アプリケーションイメージ内で
も隣接しているとは限りません。リンカによるセクションの配置方法については、ADS
リンカ / ユーティリティガイドの「リンカ」を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-15
ARM および Thumb アセンブリ言語の記述
ARMアセンブリ言語ソースファイルでは、セクションの開始位置をAREAディレクティ
ブによってマーキングします。このディレクティブでセクションに名前を付け、属性
を設定します。属性は、名前の後にカンマで区切って配置します。AREA ディレクティ
ブの構文については、P. 7-52「AREA」を参照して下さい。
セクションには任意の名前を指定することができます。しかしながら、非アルファベッ
ト文字で始まる名前はバーで囲む必要があります。それを行わない場合 AREA name
missing エラーが生成されます。例:|1_DataArea|
P. 2-15 例 2-1 では、コードを保持し、READONLY とマーキングされた ARMex と呼ばれ
る 1 つのセクションを定義しています。
ENTRY ディレクティブ
ENTRY ディレクティブは、最初に実行される命令をマーキングします。C コードを含
むアプリケーションでは、エントリポイントが C ライブラリ初期化コード内にも含ま
れます。初期化コードと例外ハンドラにもエントリポイントが含まれます。
アプリケーションの実行
P. 2-15 例 2-1 に示したアプリケーションコードは、ラベル start で実行を開始し、10
進数の 10 と 3 をレジスタ r0 と r1 にロードします。次に、これらのレジスタを加算し、
結果を r0 に返します。
アプリケーションの終了
メインコードの実行後、このアプリケーションは制御をデバッガに戻すことによって
終了します。この動作は、以下のパラメータを設定した ARM セミホスティング SWI
(デフォルトでは 0x123456)を使用して行われます。
•
r0 = angel_SWIreason_ReportException (0x18)
•
r1 = ADP_Stopped_ApplicationExit (0x20026)
詳細については、ADS デバッグターゲットガイドの「セミホスティング SWI」を参照
して下さい。
END ディレクティブ
このディレクティブは、ソースファイルの処理を停止するようアセンブラに指示しま
す。各アセンブリ言語ソースモジュールは、END ディレクティブのある行で必ず自己
終了します。
2-16
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.3.3
サブルーチンの呼び出し
サブルーチンを呼び出すには、分岐リンク(BL)命令を使用します。以下は BL 命令
の構文です。
BL
destination
destination にはサブルーチンの最初の命令に付けたラベルを指定するのが一般的
ですが、プログラム相対式またはレジスタ相対式を指定することも可能です。詳細に
ついては、P. 4-58「B と BL」を参照して下さい。
BL 命令は以下を実行します。
•
•
リンクレジスタ(lr)にリターンアドレスを配置する。
pc にサブルーチンのアドレスをセットする。
サブルーチンコードの実行後、MOV pc,lr 命令を使用して復帰できます。原則として、
レジスタ r0 ~ r3 を使用してパラメータをサブルーチンに渡し、結果を呼び出し元に返
します。
注
別々にアセンブルまたはコンパイルされたモジュール間の呼び出しは、プロシージャ
コール標準で定義されている制約条件や規則に準拠する必要があります。詳細につい
ては、ADS デベロッパガイドの「プロシージャコール標準の使用」を参照して下さい。
例 2-2 は、2 つのパラメータ値を加算して、その結果を r0 に返すサブルーチンを示して
います。このサンプルは ADS の examples\asm サブディレクトリに subrout.s の
名前で収録されています。サンプルのアセンブル、リンクならびに実行方法について
は、P. 2-2「サンプルコード」を参照して下さい。
例 2-2
AREA
start
stop
doadd
ENTRY
MOV
MOV
BL
MOV
LDR
SWI
ADD
MOV
END
ARM DUI0068BJ-00
subrout, CODE, READONLY
; Name this block of code
; Mark first instruction to execute
r0, #10
; Set up parameters
r1, #3
doadd
; Call subroutine
r0, #0x18
; angel_SWIreason_ReportException
r1, =0x20026
; ADP_Stopped_ApplicationExit
0x123456
; ARM semihosting SWI
r0, r0, r1
pc, lr
; Subroutine code
; Return from subroutine
; Mark end of file
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-17
ARM および Thumb アセンブリ言語の記述
2.3.4
Thumb アセンブリ言語モジュールのサンプル
例 2-3 は、Thumb アセンブリ言語モジュールの主要構成要素のいくつかを示していま
す。このサンプルは subrout.s をベースにしたものであり、ADS の examples\asm
サブディレクトリに thumbsub.s の名前で収録されています。
サンプルのアセンブル、
リンクならびに実行方法については、P. 2-2「サンプルコード」を参照して下さい。
例 2-3
header
AREA ThumbSub, CODE, READONLY
ENTRY
CODE32
ADR
r0, start + 1
BX
r0
CODE16
;
;
;
;
;
;
;
Name this block of code
Mark first instruction to execute
Subsequent instructions are ARM
Processor starts in ARM state,
so small ARM code header used
to call Thumb main program
Subsequent instructions are Thumb
start
MOV
MOV
BL
r0, #10
r1, #3
doadd
; Set up parameters
MOV
LDR
SWI
r0, #0x18
r1, =0x20026
0xAB
; angel_SWIreason_ReportException
; ADP_Stopped_ApplicationExit
; Thumb semihosting SWI
ADD
MOV
END
r0, r0, r1
pc, lr
; Subroutine code
; Return from subroutine
; Mark end of file
; Call subroutine
stop
doadd
CODE32 ディレクティブと CODE16 ディレクティブ
これらのディレクティブは、後続の命令を ARM(CODE32)命令または Thumb(CODE16)
命令としてアセンブルするようアセンブラに指示します。この 2 つのディレクティブ
は、プロセッサ状態をランタイムに変更する命令にはアセンブルされません。これら
のディレクティブはアセンブラの状態を変更するだけです。
ARM アセンブラ armasm は、デフォルトで ARM モードで起動します。Thumb モード
で起動するには、コマンドラインに -16 オプションを指定します。
BX 命令
この命令は、ランタイムにプロセッサ状態を変更することができる分岐命令です。ター
ゲットアドレスの最下位ビットによって、ARM 命令(クリア)と Thumb 命令(セッ
ト)のどちらであるかが決定されます。この例では、このビットが ADR 擬似命令でセッ
トされています。
2-18
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.4
C プリプロセッサの使用
C プリプロセッサコマンド #include をアセンブリ言語ソースファイルに組み込むこ
とができます。その場合、armasm を使用してファイルをアセンブルする前に、C プリ
プロセッサを使用してそのファイルを前処理する必要があります。詳細については、
ADS コンパイラ / ライブラリガイドを参照して下さい。
armasm は、出力ファイルの #line コマンドを正確に解釈します。また、#line コマン
ド内の情報を使用して、エラーメッセージと debug_line テーブルを生成できます。
例 2-4 は、sourcefile.s ファイルの前処理とアセンブルに必要なコマンドを示して
います。この例では、プリプロセッサが preprocessed.s という名前のファイルを出
力し、armasm が preprocessed.s ファイルをアセンブルします。
例 2-4 アセンブリ言語ソースファイルの前処理
armcpp -E < sourcefile.s > preprocessedfile.s
armasm preprocessedfile.s
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-19
ARM および Thumb アセンブリ言語の記述
2.5
条件付き実行
ARM 状態では、どのデータ処理命令にも演算結果に従ってカレントプログラムステー
タスレジスタ(CPSR)内の ALU ステータスフラグを更新するオプションを使用でき
ます。
ARM データ処理命令に CPSR 内の ALU ステータスフラグを更新させるには、命令に
接尾文字 S を付けます。
CMP、CMN、TST、TEQ には、接尾文字 S を使用しないで下さい。これらの比較命令は必
ずフラグを更新します。これらの命令による作用はフラグの更新だけです。
Thumb 状態の場合は選択肢がありません。MOV 命令と ADD 命令で 1 つ以上の上位レジ
スタが使用される場合を除き、全てのデータ処理命令が CPSR 内の ALU ステータスフ
ラグを更新します。上記のようなケースでは、MOV と ADD がステータスフラグを更新
することはできません。
ほぼ全ての ARM 命令は、CPSR 内の ALU ステータスフラグの状態に応じて条件付き
で実行することができます。条件付きにする命令に付ける接尾文字の一覧については、
P. 2-21 表 2-1 を参照して下さい。
ARM 状態では、以下を行うことができます。
•
データ演算結果に基づいて、CPSR 内の ALU ステータスフラグを更新する。
•
•
フラグを更新しないまま、他のデータ演算を実行する。
最初の演算で更新されたフラグの状態に応じて、次の命令を実行するかどうかを
判断する。
Thumb 状態の場合、ほとんどのデータ命令が必ずフラグを更新し、条件付き実行は条
件付き分岐命令(B)を使用した場合にのみ行われます。この命令に追加する接尾文字
は、ARM 状態の場合と同じです。他の命令を条件付きにすることはできません。
2.5.1
ALU ステータスフラグ
CPSR は以下の ALU ステータスフラグを保持します。
N
演算結果が負の場合にセットされます。
Z
演算結果がゼロの場合にセットされます。
C
演算によってキャリーが行われた場合にセットされます。
V
演算によってオーバフローが生じた場合にセットされます。
Q
ARM アーキテクチャ v5E のみ。スティッキーフラグです(P. 4-5「Q フ
ラグ」を参照)。
キャリーは、加算結果が 232 以上の場合、減算結果が正の場合、あるいは移動命令また
は論理命令によるインラインバレルシフタ演算の結果として発生します。
オーバフローは、加算、減算あるいは比較の結果が 231 以上または -231 未満の場合に発
生します。
2-20
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.5.2
実行条件
表 2-1 は、条件コードの接尾文字と N、Z、C、V フラグとの関係を示しています。
表 2-1 条件コードの接尾文字
接尾文字 フラグ
意味
EQ
Z セット
等
NE
Z クリア
不等
CS/HS
C セット
以上(符号なし >=)
CC/LO
C クリア
未満(符号なし <)
MI
N セット
負
PL
N クリア
正またはゼロ
VS
V セット
オーバフロー
VC
V クリア
オーバフローなし
HI
C セットかつ Z クリア
より大きい(符号なし >)
LS
C クリアまたは Z セット
以下(符号なし <=)
GE
N と V は等しい
符号付き >=
LT
N と V は等しくない
符号付き <
GT
Z クリア、かつ N と V が等しい 符号付き >
LE
Z セット、N と V は等しくない 符号付き <=
AL
任意
この接尾文字は通常は省略します。
例
ARM DUI0068BJ-00
ADD
r0, r1, r2
; r0 = r1 + r2, don't update flags
ADDS
r0, r1, r2
; r0 = r1 + r2, and update flags
ADDCSS r0, r1, r2
; If C flag set then r0 = r1 + r2, and update flags
CMP
; update flags based on r0-r1.
r0, r1
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-21
ARM および Thumb アセンブリ言語の記述
2.5.3
ARM 状態での条件付き実行の使用
ARM 命令の条件付き実行を使用すると、コード内の分岐命令の数を減らすことができ
ます。これによりコード密度が向上します。
また、分岐命令はプロセッササイクル面でもコストがかかります。分岐予測ハードウェ
アを搭載していない ARM プロセッサは、分岐が発生するたびに、プロセッサパイプラ
インを再充填するのに通常 3 プロセッササイクルを必要とします。
ARM10™ や StrongARM® 等の一部の ARM プロセッサには、分岐予測ハードウェアが搭
載されています。これらのプロセッサを使用しているシステムでは、予測を誤った場
合でもパイプラインをフラッシュして再充填するだけで済みます。
2.5.4
条件付き実行の使用例
この例では、ユークリッドの最大公約数(gcd:Greatest Common Divisor)アルゴリズ
ムの 2 つの実装を使用し、条件付き実行を使用してコード密度と実行速度を向上させ
る方法を示しています。実行速度の詳細分析はARM7™ プロセッサのみに適用されます。
コード密度の計算は、全ての ARM プロセッサに適用されます。
C では、このアルゴリズムを以下のように表すことができます。
int gcd(int a, int b)
{
while (a != b) do
{
if (a > b)
a = a - b;
else
b = b - a;
}
return a;
}
以下のように、分岐の条件付き実行のみを使用して gcd 関数を実装できます。
gcd
CMP
BEQ
BLT
SUB
B
r0, r1
end
less
r0, r0, r1
gcd
SUB
B
r1, r1, r0
gcd
less
end
2-22
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
分岐の数が原因で、このコードは 7 命令分の長さがあります。分岐が発生するたびに、
プロセッサはパイプラインを再充填し、新しい位置から実行を継続する必要がありま
す。他の命令と未実行分岐にはそれぞれ 1 サイクルが使用されます。
ARM 命令セットの条件付き実行機能を使用することにより、わずか 4 命令で gcd 関数
を実装できます。
gcd
CMP
SUBGT
SUBLT
BNE
r0, r1
r0, r0, r1
r1, r1, r0
gcd
ほとんどの場合、コードサイズが小さくなる他、コードの実行速度も向上します。表
2-2 および P. 2-24 表 2-3 は、r0 = 1、r1 = 2 の場合に各実装で使用されるサイクル数を示
しています。この場合、全ての分岐命令を条件付き実行に置き換えることにより、3 サ
イクルを省くことができます。
このコードの条件付きバージョンは、r0 = r1 である限り常に同じサイクル数で実行し
ます。それ以外の場合では、必ず条件付きコードの方が少ないサイクル数で実行され
ます。
表 2-2 条件付き分岐のみ
r0: a
r1: b
命令
サイクル(ARM7)
)
サイクル(
1
2
CMP r0, r1
1
1
2
BEQ end
1(非実行)
1
2
BLT less
3
1
2
SUB r1, r1, r0
1
1
2
B gcd
3
1
1
CMP r0, r1
1
1
1
BEQ end
3
合計 = 13
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-23
ARM および Thumb アセンブリ言語の記述
表 2-3 条件付き命令
r0: a
r1: b
命令
サイクル(ARM7)
)
サイクル(
1
2
CMP r0, r1
1
1
2
SUBGT r0,r0,r1
1(非実行)
1
1
SUBLT r1,r1,r0
1
1
1
BNE gcd
3
1
1
CMP r0,r1
1
1
1
SUBGT r0,r0,r1
1(非実行)
1
1
SUBLT r1,r1,r0
1(非実行)
1
1
BNE gcd
1(非実行)
合計 = 10
Thumb への変換
条件付きで実行できる Thumb 命令は B のみのため、Thumb コードでは gcd アルゴリズ
ムを条件付き分岐で記述する必要があります。
ARM コードの条件付き分岐の実装と同様に、Thumb コードの場合にも 7 つの命令が必
要です。しかし、Thumb 命令の長さは 16 ビットしかないため全体のコードサイズは 14
バイトとなり、ARM コードを実装した場合の 16 バイトと比較すると小さくなります。
さらに、16 ビットメモリを使用しているシステムでは、Thumb の実行速度が ARM の
実装を上回ります。これは、1 つの ARM 命令には 2 回のフェッチが必要であるのに対
し、1 つの Thumb 命令には 1 回のメモリアクセスで済むためです。
分岐予測とキャッシュ
実行速度を上げるためにコードを最適化するには、命令のタイミング、分岐予測ロジッ
ク、ターゲットシステムのキャッシュ動作をよく理解しておく必要があります。詳細
については、ARM Architecture Reference Manual、および各プロセッサのテクニカルリ
ファレンスマニュアルを参照して下さい。
2-24
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.6
レジスタへの定数のロード
メモリからデータをロードせずに、1 つの命令で任意の 32 ビットイミディエート定数
をレジスタにロードすることはできません。これは ARM 命令が 32 ビット長しかない
ためです。
Thumb 命令にも同様の制限があります。
データロード命令を使用して 32 ビット値をレジスタにロードすることはできますが、
多くの汎用定数はより簡単かつ効率的な方法でロードすることができます。また、多
くの汎用定数は別のロード命令を使用しなくても、データ処理命令内にオペランドと
して含めることもできます。
以下のセクションではいくつかのロード方法について説明します。
•
MOV 命令と MVN 命令を使用したイミディエート値のロード方法:P. 2-26「MOV
と MVN を使用した直接ロード」参照。
•
•
ARM DUI0068BJ-00
LDR 擬似命令を使用した 32 ビット定数のロード方法:P. 2-27「LDR Rd, =const を
使用したロード」参照。
浮動小数点定数のロード方法:P. 2-29「浮動小数点定数のロード」参照。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-25
ARM および Thumb アセンブリ言語の記述
2.6.1
MOV と MVN を使用した直接ロード
ARM 状態では、MOV 命令と MVN 命令を使用することにより、8 ビット定数値をレジス
タに直接ロードできます。
•
MOV は、0x0 ~ 0xFF(0 ~ 255)の範囲内であれば、どのような 8 ビット定数値
でもロードできます。
これらの値は偶数ごとに値をロテートすることもできます。表 2-4 は、この命令
に使用できる値の範囲を示しています。
•
MVN は、8 ビット定数値のビットごとの補数をロードできます。この補数の値は
-(n+1) となり、表 2-4 は n に使用できる値を示しています。
ロテートをユーザが計算する必要はありません。この計算はアセンブラが行います。
MOV と MVN のどちらを使用するかを決める必要はありません。アセンブラがどちらか適
切な方を使用します。この機能はアセンブリ時に値が変わる場合に便利です。
構成不可能な定数を使用して命令を記述している場合、アセンブラは以下のエラーを
通知します。
Immediate n out of range for this operation.
表 2-4 が示す値の範囲は、データ処理演算のオペランドの 1 つとして使用することもで
きます。しかし、これらの値のビットごとの補数をオペランドに使用することも、こ
れらの値を乗算命令のオペランドに使用することもできません。
表 2-4 ARM 状態のイミディエート定数
ロテート
2 進数
10 進数
ステップ 16 進数
ロテートなし
000000000000000000000000xxxxxxxx
0-255
1
0-0xFF
右 30 ビット
0000000000000000000000xxxxxxxx00
0-1020
4
0-0x3FC
右 28 ビット
00000000000000000000xxxxxxxx0000
0-4080
16
0-0xFF0
右 26 ビット
000000000000000000xxxxxxxx000000
0-16320
64
0-0x3FC0
...
...
...
...
右 8 ビット
xxxxxxxx000000000000000000000000
0-255 x 224
224
0-0xFF000000
右 6 ビット
xxxxxx000000000000000000000000xx
-
-
-
右 4 ビット
xxxx000000000000000000000000xxxx
-
-
-
右 2 ビット
xx000000000000000000000000xxxxxx
-
-
-
2-26
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
Thumb 状態で MOV を使用した直接ロード
Thumb 状態では、MOV 命令を使用して 0 ~ 255 の定数をロードできます。以下の理由
により、この範囲外の定数を生成することはできません。
•
Thumb MOV 命令では、バレルシフタへのインラインアクセスが不可能である。
ARM 状態とは異なり、定数を右ロテートできない。
•
Thumb MVN 命令はレジスタのみに作用し、定数値には作用しない。ARM 状態と
は異なり、ビットごとの補数を直接ロードできない。
0 ~ 255 の範囲外の値を使用して MOV 命令の実行を試みると、アセンブラは以下のエ
ラーを通知します。
Immediate n out of range for this operation.
2.6.2
LDR Rd, =const を使用したロード
LDR Rd,=const 擬似命令を使用することにより、1 つの命令で 32 ビット数値定数を
構成することができます。MOV 命令および MVN 命令の範囲外の定数を生成するには、
この擬似命令を使用します。
LDR 擬似命令は、特定の定数に対して最も効率的なコードを生成します。
•
この定数を MOV 命令または MVN 命令を使用して構成できる場合、アセンブラは
どちらか適切な方の命令を生成します。
•
この定数を MOV 命令または MVN 命令を使用して構成できない場合、アセンブラ
は以下を行います。
—
リテラルプール(コードに組み込まれた、定数値を保持するためのメモリ
の部分)に値を配置する。
—
リテラルプールから定数を読み出す、プログラム相対アドレスを使用する
LDR 命令を生成する。
例:
LDR
rn, [pc, #offset to literal pool]
; load register n with one word
; from the address [pc + offset]
リテラルプールは、アセンブラが生成した LDR 命令の範囲内にあることを確認
する必要があります。詳細については、P. 2-28「リテラルプールの配置」を参照
して下さい。
LDR 擬似命令の構文の説明については、P. 4-82「LDR ARM 疑似命令」を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-27
ARM および Thumb アセンブリ言語の記述
リテラルプールの配置
アセンブラは、各セクションの最後にリテラルプールを配置します。これらは次のセ
クションの開始位置にある AREA ディレクティブによって、またはアセンブリの最後で
END ディレクティブによって定義されます。インクルードされたファイルの最後にあ
る END ディレクティブは、セクションの終わりを示しているわけではありません。
大きなセクションでは、デフォルトのリテラルプールが 1 つ以上の LDR 命令の範囲内
に収まらない可能性があります。pc から定数までのオフセットは、以下の規則に従う
必要があります。
•
ARM 状態の場合:順方向または逆方向に 4KB 未満
•
Thumb 状態の場合:順方向に 1KB 未満
LDR Rd,=const 擬似命令が定数をリテラルプールに配置するように要求している場
合、アセンブラは以下を行います。
•
その定数が前のリテラルプール内に存在し、かつそこからアドレス指定が可能
であるかどうかをチェックします。可能であれば、既存の定数でアドレス指定
します。
•
定数が既存のリテラルプールに存在しない場合は、次のリテラルプールへの配置
を試みます。
次のリテラルプールが範囲外の場合、アセンブラはエラーメッセージを生成します。こ
の場合は LTORG ディレクティブを使用して、コード内に別のリテラルプールを配置す
る必要があります。LTORG ディレクティブは失敗した LDR 擬似命令の後で 4KB
(ARM)
以内または 1KB(Thumb)以内の位置に配置します。詳細については、P. 7-14「LTORG」
を参照して下さい。
リテラルプールは、プロセッサがリテラルプールを命令として実行しそうにない位置
に配置する必要があります。リテラルプールは無条件分岐命令の後、またはサブルー
チンの最後にある復帰命令の後に配置して下さい。
例 2-5 は、上記を反映させたコードを示しています。このサンプルは、ADS の
examples\asm サブディレクトリに loadcon.s の名前で収録されています。コメント
として記載されている命令は、アセンブラが生成する ARM 命令です。サンプルのアセ
ンブル、リンクならびに実行方法については、P. 2-2「サンプルコード」を参照して下
さい。
例 2-5
start
stop
AREA
ENTRY
BL
BL
MOV
LDR
SWI
Loadcon, CODE, READONLY
LDR
LDR
r0, =42
r1, =0x55555555
func1
func2
r0, #0x18
r1, =0x20026
0x123456
;
;
;
;
;
;
Mark first instruction to execute
Branch to first subroutine
Branch to second subroutine
angel_SWIreason_ReportException
ADP_Stopped_ApplicationExit
ARM semihosting SWI
func1
2-28
; => MOV R0, #42
; => LDR R1, [PC, #offset to
; Literal Pool 1]
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
LDR
MOV
LTORG
r2, =0xFFFFFFFF
pc, lr
LDR
r3, =0x55555555
; => MVN R2, #0
; Literal Pool 1 contains
; literal Ox55555555
func2
; LDR r4, =0x66666666
MOV
LargeTable
SPACE
END
2.6.3
;
;
;
;
;
=> LDR R3, [PC, #offset to
Literal Pool 1]
If this is uncommented it
fails, because Literal Pool 2
is out of reach
;
;
;
;
Starting at the current location,
clears a 4200 byte area of memory
to zero
Literal Pool 2 is empty
pc, lr
4200
浮動小数点定数のロード
FLD 擬似命令を使用すると、単精度または倍精度の浮動小数点定数を 1 つの命令でロー
ドすることができます。
詳細については、P. 6-38「FLD 擬似命令」を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-29
ARM および Thumb アセンブリ言語の記述
2.7
レジスタへのアドレスのロード
アドレスをレジスタにロードしなければならない場合がよくあります。変数のアドレ
ス、ストリング定数のアドレス、あるいはジャンプテーブルの開始位置のアドレスを
ロードしなければならない場合もあります。
アドレスは現在のpcまたは他のレジスタからのオフセットで表現するのが一般的です。
このセクションでは、アドレスをレジスタにロードする 2 通りの方法を説明します。
2.7.1
•
「ADR と ADRL を使用した直接ロード:P. 2-30」参照。
レジスタへの直接ロード:
•
リテラルプールからのアドレスのロード:P. 2-35「LDR Rd, = label を使用したア
ドレスのロード」参照。
ADR と ADRL を使用した直接ロード
ADR 擬似命令と ADRL 擬似命令を使用することにより、データロード命令を使用しな
くても特定の範囲内にアドレスを生成できます。ADR と ADRL には以下のどちらかを
使用することができます。
•
プログラム相対式。任意のオフセットに付けるラベルであり、このラベルのアド
レスが現在の pc の相対アドレスとなります。
•
レジスタ相対式。任意のオフセットに付けるラベルであり、このラベルのアドレ
スが指定した汎用レジスタに保持されるアドレスの相対アドレスとなります。レ
ジスタ相対式を指定する方法については、P. 2-51「MAP ディレクティブと FIELD
ディレクティブを使用したデータ構造の記述」を参照して下さい。
アセンブラは、以下を生成することによって ADR rn,label 擬似命令を変換します。
•
アドレスが範囲内にある場合は、そのアドレスをロードする 1 つの ADD 命令ま
たは SUB 命令を生成します。
•
1 つの命令でアドレスに到達できない場合は、エラーメッセージを生成します。
非ワード境界整列アドレスへのオフセットの範囲は ±255 バイトで、ワード境界整列ア
ドレスへのオフセットの範囲は ±1020 バイト(255 ワード)です。(Thumb では、アド
レスをワード境界で整列させ、オフセットに正の値を指定する必要があります)。
アセンブラは、以下を生成して ADRL rn,label 擬似命令を変換します。
•
•
アドレスが範囲内にある場合は、そのアドレスをロードする 2 つのデータ処理命
令を生成します。
2 つの命令でアドレスを構成できない場合は、エラーメッセージを生成します。
ADRL 擬似命令の範囲は、非ワード境界整列アドレスでは ±64KB、ワード境界整列アド
レスでは ±256KB となります(Thumb には ADRL 擬似命令がありません。)
成功すると、ADRL は 2 つの命令をアセンブルします。そのアドレスを 1 つの命令で
ロードできる可能性がある場合でも、アセンブラは 2 つの命令を生成します。
ADRL 擬似命令の範囲外にあるアドレスをロードする方法については、P. 2-35「LDR Rd,
= label を使用したアドレスのロード」を参照して下さい。
2-30
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
注
ADR または ADRL に使用するラベルは、同一コードセクション内に記述する必要があり
ます。同一セクション内に存在しないラベルへの参照を検出すると、アセンブラはエ
ラーを生成します。リンカは、他のコードセクション内に存在しないラベルへの参照
を検出するとエラーを生成します。
Thumb 状態では、ADR が生成できるのはワード境界整列のアドレスだけです。
Thumb コードで ADRL を使用することはできません。ADRL は ARM コードのみで使用
して下さい。
例 2-6 は、ADR 擬似命令と ADRL 擬似命令のアセンブル時にアセンブラが生成するコー
ドのタイプを示しています。このサンプルは、ADS の examples\asm サブディレク
トリ内に adrlabel.s の名前で収録されています。このサンプルのアセンブル、リン
クならびに実行方法については、P. 2-2「サンプルコード」を参照して下さい。
コメントで記載されている命令は、アセンブラが生成する ARM 命令です。
例 2-6
AREA
ENTRY
adrlabel, CODE,READONLY
BL
MOV
LDR
SWI
LTORG
ADR
ADR
; ADR
func
r0, #0x18
r1, =0x20026
0x123456
ADRL
r2, DataArea+4300
MOV
SPACE
pc, lr
8000
; Mark first instruction to execute
Start
stop
func
DataArea
r0, Start
r1, DataArea
r2, DataArea+4300
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Branch to subroutine
angel_SWIreason_ReportException
ADP_Stopped_ApplicationExit
ARM semihosting SWI
Create a literal pool
=> SUB r0, PC, #offset to Start
=> ADD r1, PC, #offset to DataArea
This would fail because the offset
cannot be expressed by operand2
of an ADD
=> ADD r2, PC, #offset1
ADD r2, r2, #offset2
Return
Starting at the current location,
clears a 8000 byte area of memory
to zero
END
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-31
ARM および Thumb アセンブリ言語の記述
ADR を使用したジャンプテーブルの実装
P. 2-33 例 2-7 は、ジャンプテーブルを実装する ARM コードを示しています。このサン
プルは、ADS の examples\asm サブディレクトリ内に jump.s の名前で収録されて
います。このサンプルのアセンブル、リンクならびに実行方法については、P. 2-2「サ
ンプルコード」を参照して下さい。
ADR 擬似命令は、ジャンプテーブルのアドレスをロードします。
この例では、arithfunc 関数が 3 つの引数を取り、r0 に結果を返します。最初の引数
によって、2 番目と 3 番目の引数に対して実行される演算が決まります。
引数 1=0
結果 = 引数 2+ 引数 3
引数 1=1
結果 = 引数 2- 引数 3
ジャンプテーブルは、以下の命令とアセンブラディレクティブを使用して実装します。
2-32
EQU
アセンブラディレクティブ。このディレクティブを使用してシンボルに
値を指定します。この例では、num に値 2 を割り当てます。コード内の
どこかで num が使用されると、値 2 に置き換えられます。EQU のこのよ
うな使用方法は、#define を使用して C の定数を定義する方法と似てい
ます。
DCD
ストアする 1 つ以上のワードを宣言します。この例では、各 DCD がジャ
ンプテーブルの特定の節を処理するルーチンのアドレスをストアします。
LDR
LDR pc,[r3,r0,LSL#2] 命令は、指定されたジャンプテーブルの節の
アドレスを pc にロードします。この命令は以下を実行します。
•
r0 が保持する節の数に 4 を掛けてワードオフセットを求める。
•
•
結果をジャンプテーブルのアドレスに加算する。
加算したアドレスの内容をプログラムカウンタにロードする。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
例 2-7 ARM コードのジャンプテーブル
num
AREA
CODE32
EQU
ENTRY
Jump, CODE, READONLY
2
start
MOV
MOV
MOV
BL
stop
MOV
LDR
SWI
arithfunc
CMP
MOVHS
ADR
LDR
JumpTable
DCD
DCD
r0, #0
r1, #3
r2, #2
arithfunc
r0, #0x18
r1, =0x20026
0x123456
DoAdd
r0,
pc,
r0,
pc,
DoSub
ADD
MOV
SUB
MOV
END
ARM DUI0068BJ-00
r0,
pc,
r3,
pc,
#num
lr
JumpTable
[r3,r0,LSL#2]
;
;
;
;
;
;
Name this block of code
Following code is ARM code
Number of entries in jump table
Mark first instruction to execute
First instruction to call
Set up the three parameters
;
;
;
;
;
;
;
;
;
Call the function
angel_SWIreason_ReportException
ADP_Stopped_ApplicationExit
ARM semihosting SWI
Label the function
Treat function code as unsigned integer
If code is >= num then simply return
Load address of jump table
Jump to the appropriate routine
;
;
;
;
;
Operation 0
Return
Operation 1
Return
Mark the end of this file
DoAdd
DoSub
r1, r2
lr
r1, r2
lr
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-33
ARM および Thumb アセンブリ言語の記述
Thumb への変換
例 2-8 は、ジャンプテーブルの実装を Thumb コードに変換する方法を示します。
Thumb バージョンの大部分は、ARM コードと同じです。異なる部分は、Thumb バー
ジョンにコメントで示しています。
Thumb 状態では、以下を行うことができません。
•
LDR 命令と STR 命令のベースレジスタをインクリメントする。
•
LDR 命令を使用して値を pc にロードする。
•
レジスタが保持する値のインラインシフトを実行する。
例 2-8 Thumb コードのジャンプテーブル
num
AREA
CODE16
EQU
ENTRY
Jump, CODE, READONLY
; Following code is Thumb code
2
start
MOV
MOV
MOV
BL
stop
MOV
LDR
SWI
arithfunc
CMP
BHS
ADR
LSL
LDR
MOV
ALIGN
JumpTable
DCD
DCD
DoAdd
exit
DoSub
2-34
ADD
MOV
SUB
MOV
END
r0, #0
r1, #3
r2, #2
arithfunc
r0, #0x18
r1, =0x20026
0xAB
r0, #num
exit
r3, JumpTable
r0, r0, #2
r0, [r3,r0]
pc, r0
; Thumb semihosting SWI
; MOV pc, lr cannot be conditional
; 3 instructions needed to replace
; LDR pc, [r3,r0,LSL#2]
; Ensure that the table is aligned on a
; 4-byte boundary
DoAdd
DoSub
r0,
pc,
r0,
pc,
r1, r2
lr
r1, r2
lr
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.7.2
LDR Rd, = label を使用したアドレスのロード
LDR Rd,= 擬似命令を使用すると、どのような 32 ビット定数でもレジスタにロードす
ることができます。詳細については、P. 2-27「LDR Rd, =const を使用したロード」を参
照して下さい。この擬似命令には、ラベルやオフセット付きラベルなどのプログラム
相対式も使用できます。
アセンブラは以下を行うことによって LDR r0,=label 擬似命令を変換します。
•
label のアドレスをリテラルプール(コードに組み込まれた、定数値を保持する
ためのメモリの部分)に配置する。
•
リテラルプールからアドレスを読み出すプログラム相対 LDR 命令を生成する。
例:
LDR
rn [pc, #offset to literal pool]
; load register n with one word
; from the address [pc + offset]
リテラルプールが範囲内にあることを確認する必要があります。詳細について
は、P. 2-28「リテラルプールの配置」を参照して下さい。
ADR 疑似命令や ADRL 擬似命令とは異なり、LDR は現在のセクションに含まれないラベ
ルに使用することができます。ラベルが現在のセクションの範囲外にある場合には、ア
センブラがソースファイルのアセンブル時に再配置ディレクティブをオブジェクト
コード内に配置します。この再配置ディレクティブは、リンク時にアドレスを解決す
るようにリンカに指示します。このアドレスは、リンカが LDR とリテラルプールを含
むセクションをどこに配置しても有効です。
例 2-9 は、上 記 を 反映 させたコードを示しています。このサンプルは、ADS の
examples\asm サブディレクトリ内に ldrlabel.s の名前で収録されています。サン
プルのアセンブル、リンクならびに実行方法については、P. 2-2「サンプルコード」を
参照して下さい。
コメントに記載されている命令は、アセンブラが生成する ARM 命令です。
例 2-9
AREA
ENTRY
LDRlabel, CODE,READONLY
BL
BL
MOV
LDR
SWI
func1
func2
r0, #0x18
r1, =0x20026
0x123456
;
;
;
;
;
LDR
r0, =start
; => LDR R0,[PC, #offset into
; Mark first instruction to execute
start
stop
Branch to first subroutine
Branch to second subroutine
angel_SWIreason_ReportException
ADP_Stopped_ApplicationExit
ARM semihosting SWI
func1
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-35
ARM および Thumb アセンブリ言語の記述
LDR
r1, =Darea + 12
LDR
r2, =Darea + 6000
MOV
LTORG
pc,lr
LDR
r3, =Darea + 6000
; LDR
r4, =Darea + 6004
MOV
SPACE
pc, lr
8000
;
;
;
;
;
;
;
Literal Pool 1]
=> LDR R1,[PC, #offset into
Literal Pool 1]
=> LDR R2, [PC, #offset into
Literal Pool 1]
Return
Literal Pool 1
;
;
;
;
;
;
;
;
;
;
;
=> LDR r3, [PC, #offset into
Literal Pool 1]
(sharing with previous literal)
If uncommented produces an error
as Literal Pool 2 is out of range
Return
Starting at the current location,
clears a 8000 byte area of memory
to zero
Literal Pool 2 is out of range of
the LDR instructions above
func2
Darea
END
2-36
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
LDR Rd, =label の使用例:ストリングのコピー
例 2-10 は、1 つのストリングを別のストリングで上書きする ARM コードルーチンを示
しています。ここでは、LDR 模擬命令を使用してデータセクションから 2 つのストリ
ングのアドレスをロードします。以下は特に重要です。
DCB
DCB ディレクティブは、ストアする 1 バイト以上の値を定義します。DCB
には、整数値だけでなく、引用符で囲んだストリングも使用できます。
ストリングの各文字は、連続したバイトに配置されます。詳細について
は、P. 7-18「DCB」を参照して下さい。
LDR/STR
LDR 命令と STR 命令は、ポストインデクスアドレシングを使用して、アド
レスレジスタを更新します。例えば、命令
LDRB
r2,[r1],#1
は、r1 が指すアドレスの内容を r2 にロードし、r1 を 1 ずつインクリメン
トします。
例 2-10 ストリングのコピー
start
stop
AREA
ENTRY
LDR
LDR
BL
MOV
LDR
SWI
StrCopy, CODE, READONLY
r1, =srcstr
r0, =dststr
strcopy
r0, #0x18
r1, =0x20026
0x123456
;
;
;
;
;
;
;
Mark first instruction to execute
Pointer to first string
Pointer to second string
Call subroutine to do copy
angel_SWIreason_ReportException
ADP_Stopped_ApplicationExit
ARM semihosting SWI
LDRB
STRB
CMP
BNE
MOV
r2, [r1],#1
r2, [r0],#1
r2, #0
strcopy
pc,lr
;
;
;
;
;
Load byte and update address
Store byte and update address
Check for zero terminator
Keep going if not
Return
AREA
DCB
DCB
END
Strings, DATA, READWRITE
"First string - source",0
"Second string - destination",0
strcopy
srcstr
dststr
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-37
ARM および Thumb アセンブリ言語の記述
Thumb への変換
Thumb の LDR 命令と STR 命令では、ポストインデクスアドレシングモードは使用でき
ません。このため、LDR 命令と STR 命令の後でアドレスレジスタをインクリメントす
るには ADD 命令を使用する必要があります。例:
LDRB
ADD
2-38
r2, [r1]
r1, #1
; load register 2
; increment the address in
; register 1.
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.8
多重レジスタロード / ストア命令
ARM 命令セットと Thumb 命令セットには、メモリとの間で複数レジスタのロードとス
トアを実行する命令があります。
多重レジスタ転送命令を使用すると、複数レジスタの内容をメモリとの間で効率的に移
動することができます。これらの命令は、サブルーチンの入り口と出口におけるブロッ
クコピーやスタック操作によく使用されます。複数の単一データ転送命令を使用する代
わりに多重レジスタ転送命令を使用することには、以下のような利点があります。
•
コードサイズが小さくなる。
•
何度も命令フェッチするのではなく 1 回の命令フェッチで済むため、オーバヘッ
ドが小さい。
•
キャッシュなし ARM プロセッサでは、多重ロード / ストア命令によって転送さ
れるデータの先頭ワードは必ず非シーケンシャルメモリサイクルで処理される
が、その後に転送される全てのワードはシーケンシャルメモリサイクルで処理す
ることが可能。ほとんどのシステムでは、シーケンシャルメモリサイクルの方が
実行速度が速くなります。
注
最も小さな番号のレジスタがアクセス先の最下位メモリアドレスとの間で転送され、
最も大きな番号のレジスタがアクセス先の最上位アドレスとの間で転送されます。命
令のレジスタリスト内でのレジスタの順序は関係ありません。
レジスタリスト内のレジスタが昇順に指定されていることを確認するには、
-checkreglist アセンブラコマンドラインオプションを使用します。詳細について
は、P. 3-2「コマンド構文」を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-39
ARM および Thumb アセンブリ言語の記述
2.8.1
ARM LDM 命令と STM 命令
多重ロード(またはストア)命令は、1 つの命令で 16 個の汎用レジスタのサブセット
をメモリからロード(またはメモリにストア)します。
構文
LDM 命令の構文は以下のとおりです。
LDM{cond}address-mode Rn{!},reg-list{^}
説明:
cond
オプションの条件コード。詳細については、P. 2-20「条件付き実行」を
参照して下さい。
address-mode
命令のアドレシングモードを指定します。詳細については、P. 2-41「LDM
アドレシングモードと STM アドレシングモード」を参照して下さい。
Rn
ロード命令のベースレジスタ。このレジスタにストアされるアドレスは、
ロード命令の開始アドレスです。ベースレジスタには r15(pc)を指定し
ないで下さい。
!
ベースレジスタのライトバックを指定します。! が指定されている場合、
転送後にベースレジスタ内のアドレスが更新されます。レジスタリスト
内の各レジスタに対して 1 ワードずつデクリメントまたはインクリメン
トされます。
register-list
一連のシンボリックレジスタ名とレジスタ範囲をカンマで区切り、括弧
で囲んだリストを指定します。リストには 1 つ以上のレジスタを指定す
る必要があります。レジスタ範囲はダッシュを使用して指定します。例:
{r0,r1,r4-r6,pc}
ベースレジスタ Rn を register-list に含める場合には、ライトバッ
クを指定しないで下さい。
^
このオプションは、ユーザモードとシステムモードでは使用しないで下
さい。特権モードでの使用方法については、ADS デベロッパガイドの「プ
ロセッサ例外処理」と P. 4-18「LDM と STM」を参照して下さい。
STM 命令の構文は、^ オプションの作用が一部異なることを除けば、上記とまったく同
じです。
2-40
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
用法
P. 2-42「LDM および STM によるスタックの実装」、P. 2-44「LDM および STM によるブ
ロックコピー」を参照して下さい。
2.8.2
LDM アドレシングモードと STM アドレシングモード
アドレシングモードには 4 種類あります。ベースレジスタは、命令に使用されるレジ
スタごとに 1 ワードずつインクリメントまたはデクリメントできます。また、インク
リメントとデクリメントは、命令の前と後のどちらでも発生し得ます。これらのオプ
ションに使用する接尾文字は以下のとおりです。
IA
ポストインクリメント(Increment After)
IB
プレインクリメント(Increment Before)
DA
ポストデクリメント(Decrement After)
DB
プレデクリメント(Decrement Before)
この他にも、スタック操作の場合に使用しやすいアドレシングモードの接尾文字があ
ります。詳細については、P. 2-42「LDM および STM によるスタックの実装」を参照し
て下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-41
ARM および Thumb アセンブリ言語の記述
2.8.3
LDM および STM によるスタックの実装
多重ロード / ストア命令はベースレジスタを更新することができます。スタック操作で
は、ベースレジスタには通常スタックポインタ(r13)が使用されます。つまり、多重
ロード / ストア命令により、1 つの命令でいくつかの、場合によっては全てのレジスタ
のプッシュ操作とポップ操作を実装することができます。
多重ロード / ストア命令は、以下のタイプのスタックに使用することができます。
or ascending)
下降または上昇(Descendig
)
下降または上昇(
スタックには、上位アドレスから下位アドレスに下に向かって展開され
る下降スタックと、下位アドレスから上位アドレスに上に向かって展開
される上昇スタックがあります。
or empty)
フルまたはエンプティ(Full
)
フルまたはエンプティ(
スタックポインタは、スタック内の最後の項目か(フルスタック)、ス
タックの次の空き空間(空スタック)のどちらかを指すことができます。
プレ / ポストインクリメントまたはプレ / ポストデクリメントの接尾文字を使用する代
わりにスタック専用の接尾文字を使用することで、プログラミングがさらに容易にな
ります。スタック専用の接尾文字については、表 2-5 を参照して下さい。
表 2-5 多重ロード / ストア命令の接尾文字
スタックのタイプ
プッシュ
ポップ
フル下降
STMFD (STMDB)
LDMFD (LDMIA)
フル上昇
STMFA (STMIB)
LDMFA (LDMDA)
エンプティ下降
STMED (STMDA)
LDMED (LDMIB)
エンプティ上昇
STMEA (STMIA)
LDMEA (LDMDB)
例:
STMFD
LDMFD
r13!, {r0-r5}
r13!, {r0-r5}
; Push onto a Full Descending Stack
; Pop from a Full Descending Stack.
注
ARM-Thumb プロシージャコール標準(ATPCS)、および ARM と Thumb の C/C++ コン
パイラは、常にフル下降スタックを使用します。
2-42
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
ネストされたサブルーチンのレジスタのスタック
スタック操作は、サブルーチンの入り口と出口で行うと有効です。サブルーチン入り
口で必要とする全ての作業レジスタをスタックにプッシュし、出口でこれらをスタッ
クからポップすることができます。
さらに、入り口でリンクレジスタをスタックにプッシュしておけば、リターンアドレ
スを失わずに別のサブルーチンコールを安全に実行することができます。この場合は、
lr をポップしてその値を pc に移動する代わりに、出口でスタックから pc をポップする
ことによってサブルーチンから戻ることができます。例:
subroutine
STMFD
; code
BL
; code
LDMFD
sp!, {r5-r7,lr} ; Push work registers and lr
somewhere_else
sp!, {r5-r7,pc} ; Pop work registers and pc
注
ARM/Thumb 混合システムでこの方法を使用する場合は注意を払う必要があります。
ARM アーキテクチャ v4T システムでは、プログラムカウンタを直接ポップしても状態
を変更することはできません。
しかし、ARM アーキテクチャ v5T 以上では、この方法で状態を変更できます。
ARM と Thumb の混合システムについては、ADS デベロッパガイドの「ARM と Thumb
のインターワーキング」を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-43
ARM および Thumb アセンブリ言語の記述
2.8.4
LDM および STM によるブロックコピー
例 2-11 は、一度に 1 ワードずつコピーすることにより、ソース位置の一連のワードを
デスティネーションにコピーする ARM コードルーチンを示しています。このサンプル
は、ADS の examples\asm サブディレクトリ内に word.s の名前で収録されていま
す。このサンプルのアセンブル、リンクならびに実行方法については、P. 2-2「サンプ
ルコード」を参照して下さい。
例 2-11 ブロックコピー
num
AREA
EQU
ENTRY
Word, CODE, READONLY
20
; name this block of code
; set number of words to be copied
; mark the first instruction to call
LDR
LDR
MOV
LDR
STR
SUBS
BNE
MOV
LDR
SWI
r0, =src
r1, =dst
r2, #num
r3, [r0], #4
r3, [r1], #4
r2, r2, #1
wordcopy
r0, #0x18
r1, =0x20026
0x123456
;
;
;
;
;
;
;
;
;
;
AREA
DCD
DCD
END
BlockData, DATA, READWRITE
1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start
wordcopy
stop
src
dst
r0 = pointer to source block
r1 = pointer to destination block
r2 = number of words to copy
load a word from the source and
store it to the destination
decrement the counter
... copy more
angel_SWIreason_ReportException
ADP_Stopped_ApplicationExit
ARM semihosting SWI
このモジュールは、コピー部分にできる限り LDM と STM を使用することで、さらに効
率化できます。この ARM コードで指定されているレジスタの数から、一度に転送する
ワード数は 8 ワードが妥当です。コピーするブロックに 8 ワードがいくつあるかは、以
下を使用して検出することができます(r2= コピーするワード数の場合)。
MOVS
r3, r2, LSR #3
; number of eight word multiples
この値を使用して、一度に 8 ワードずつコピーするループ内の繰り返し回数を制御で
きます。残りのワード数が 8 ワードに満たない場合は、以下を使用して残りのワード
数が検出することができます(r2 が更新されていないことを前提とした場合)。
ANDS
r2, r2, #7
P. 2-45 例 2-12 は、LDM と STM を使用してコピーを実行できるように書き直したブロッ
クコピーモジュールを示しています。
2-44
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
例 2-12
num
AREA
EQU
ENTRY
Block, CODE, READONLY
20
; name this block of code
; set number of words to be copied
; mark the first instruction to call
LDR
LDR
MOV
MOV
MOVS
BEQ
STMFD
LDMIA
STMIA
SUBS
BNE
LDMFD
r0, =src
r1, =dst
r2, #num
sp, #0x400
r3,r2, LSR #3
copywords
sp!, {r4-r11}
r0!, {r4-r11}
r1!, {r4-r11}
r3, r3, #1
octcopy
sp!, {r4-r11}
ANDS
BEQ
LDR
STR
SUBS
BNE
MOV
LDR
SWI
r2, r2, #7
stop
r3, [r0], #4
r3, [r1], #4
r2, r2, #1
wordcopy
r0, #0x18
r1, =0x20026
0x123456
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
AREA
DCD
DCD
END
BlockData, DATA, READWRITE
1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start
blockcopy
octcopy
copywords
wordcopy
stop
src
dst
ARM DUI0068BJ-00
r0 = pointer to source block
r1 = pointer to destination block
r2 = number of words to copy
Set up stack pointer (r13)
Number of eight word multiples
Less than eight words to move?
Save some working registers
Load 8 words from the source
and put them at the destination
Decrement the counter
... copy more
Don't need these now - restore
originals
Number of odd words to copy
No words left to copy?
Load a word from the source and
store it to the destination
Decrement the counter
... copy more
angel_SWIreason_ReportException
ADP_Stopped_ApplicationExit
ARM semihosting SWI
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-45
ARM および Thumb アセンブリ言語の記述
2.8.5
Thumb LDM 命令と STM 命令
Thumb 命令セットには、以下の 2 組の多重レジスタ転送命令があります。
•
ブロックメモリ転送に使用する LDM と STM
•
スタック操作に使用する PUSH と POP
LDM と STM
これらの命令を使用して、下位レジスタのサブセットをメモリからロード、またはメ
モリにストアできます。ベースレジスタは、多重レジスタ転送命令の最後で必ず更新
されます。!は必ず指定して下さい。これらの命令に使用できる接尾文字はIAだけです。
以下は LDM と STM の使用例です。
LDMIA
STMIA
r1!, {r0,r2-r7}
r4!, {r0-r3}
PUSH と POP
これらの命令を使用すると、下位レジスタのサブセットと(オプションで)リンクレ
ジスタをスタックにプッシュし、下位レジスタのサブセットと(オプションで)pc を
スタックからポップできます。スタックのベースアドレスは、r13 に格納されます。以
下は PUSH と POP の使用例です。
PUSH
POP
PUSH
POP
{r0-r3}
{r0-r3}
{r4-r7,lr}
{r4-r7,pc}
サブルーチンの入り口と出口では、オプションでレジスタリストに lr または pc を追加
できます。
このときのスタックは常にフル下降です。
Thumb 状態のブロックコピーのサンプル
P. 2-44 例 2-11 が示すブロックコピーのサンプルは、Thumb 命令に変換することができ
ます(P. 2-47 例 2-13 参照)。
Thumb の LDM 命令と STM 命令では下位レジスタにしかアクセスできないため、一度の
繰り返しでコピーされるワード数は 8 から 4 に減少します。また、LDM 命令と STM 命
令はアクセスするごとにベースポインタを更新するため、これらの命令を使用して一
度に 1 ワードずつコピーすることもできます。この目的で LDR と STR が使用する場合
には、各ベースポインタを更新する別々の ADD 命令が必要となります。
2-46
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
例 2-13
num
AREA
EQU
ENTRY
Tblock, CODE, READONLY
20
MOV
ADR
BX
sp, #0x400
r0, start + 1
r0
header
CODE16
;
;
;
;
;
;
;
;
;
Name this block of code
Set number of words to be copied
Mark first instruction to execute
The first instruction to call
Set up stack pointer (r13)
Processor starts in ARM state,
so small ARM code header used
to call Thumb main program
Subsequent instructions are Thumb
start
LDR
LDR
MOV
blockcopy
LSR
BEQ
PUSH
quadcopy
LDMIA
STMIA
SUB
BNE
POP
copywords
MOV
AND
BEQ
wordcopy
LDMIA
STMIA
SUB
BNE
stop
MOV
LDR
SWI
src
dst
AREA
DCD
DCD
END
ARM DUI0068BJ-00
r0, =src
r1, =dst
r2, #num
; r0 =pointer to source block
; r1 =pointer to destination block
; r2 =number of words to copy
r3,r2, #2
copywords
{r4-r7}
; Number of four word multiples
; Less than four words to move?
; Save some working registers
r0!, {r4-r7}
r1!, {r4-r7}
r3, #1
quadcopy
{r4-r7}
;
;
;
;
;
r3, #3
r2, r3
stop
; Bottom two bits represent number
; ...of odd words left to copy
; No words left to copy?
r0!, {r3}
r1!, {r3}
r2, #1
wordcopy
r0, #0x18
r1, =0x20026
0xAB
;
;
;
;
;
;
;
Load 4 words from the source
and put them at the destination
Decrement the counter
... copy more
Don't need these now-restore originals
load a word from the source and
store it to the destination
Decrement the counter
... copy more
angel_SWIreason_ReportException
ADP_Stopped_ApplicationExit
Thumb semihosting SWI
BlockData, DATA, READWRITE
1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-47
ARM および Thumb アセンブリ言語の記述
2.9
マクロの使用
マクロ定義は、MACRO ディレクティブと MEND ディレクティブの間にあるコードブロッ
クです。これによってコードブロック全体を繰り返す代わりに使用できる名前を定義
します。マクロは主に以下の目的で使用します。
•
コードブロックを 1 つの有意な名前に置き換えることにより、ソースコードのロ
ジックを追いやすくする。
•
コードブロックの繰り返しを防ぐ。
詳細については、P. 7-27「MACRO と MEND」を参照して下さい。
2.9.1
Test-and-Branch(テスト
(テスト - 分岐)マクロのサンプル
Test-and-Branch(テスト - 分岐)処理には、2 つの ARM 命令を実装する必要があります。
以下のようなマクロ定義を定義できます。
$label
$label
MACRO
TestAndBranch
CMP
B$cc
MEND
$dest, $reg, $cc
$reg, #0
$dest
MACRO ディレクティブの後の行は、マクロプロトタイプステートメントです。マクロ
プロトタイプステートメントは、マクロの呼び出しに使用する名前(TestAndBranch)
を定義します。また、パラメータ($label、$dest、$reg、$cc)も定義します。マ
クロを呼び出す場合は、これらのパラメータに値を指定する必要があります。アセン
ブラは、コード内に指定された値でパラメータを置き換えます。
このマクロは以下のように呼び出すことができます。
test
TestAndBranch
...
...
NonZero, r0, NE
NonZero
代入後には以下のようになります。
test
CMP
BNE
...
...
r0, #0
NonZero
NonZero
2-48
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.9.2
符号なし整数除算マクロのサンプル
例 2-14 は、符号なし整数を除算するマクロを示しています。このマクロは、以下の 4
つのパラメータが必要です。
$Bot
除数を保持するレジスタ。
$Top
命令の実行前に被除数を保持し、命令の実行後に剰余を保持するレジス
タ。
$Div
除算の商が返されるレジスタ。剰余のみが必要な場合は、NULL("")を
指定できます。
$Temp
計算中に使用される一時レジスタ。
例 2-14
$Lab
MACRO
DivMod $Div,$Top,$Bot,$Temp
ASSERT $Top <> $Bot
ASSERT $Top <> $Temp
ASSERT $Bot <> $Temp
IF
"$Div" <> ""
ASSERT $Div <> $Top
ASSERT $Div <> $Bot
ASSERT $Div <> $Temp
ENDIF
; Produce an error message if the
; registers supplied are
; not all different
; These three only matter if $Div
; is not null ("")
;
$Lab
90
91
ARM DUI0068BJ-00
MOV
CMP
MOVLS
CMP
BLS
IF
MOV
ENDIF
CMP
SUBCS
IF
ADC
ENDIF
MOV
CMP
BHS
MEND
$Temp, $Bot
$Temp, $Top, LSR #1
$Temp, $Temp, LSL #1
$Temp, $Top, LSR #1
%b90
"$Div" <> ""
$Div, #0
; Put divisor in $Temp
; double it until
; 2 * $Temp > $Top
$Top, $Temp
$Top, $Top,$Temp
"$Div" <> ""
$Div, $Div, $Div
;
;
;
;
$Temp, $Temp, LSR #1
$Temp, $Bot
%b91
; Halve $Temp,
; and loop until
; less than divisor
; The b means search backwards
; Omit next instruction if $Div is null
; Initialize quotient
Can we subtract $Temp?
If we can, do so
Omit next instruction if $Div is null
Double $Div
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-49
ARM および Thumb アセンブリ言語の記述
このマクロは、複数のパラメータが同一レジスタを使用していないかどうかをチェッ
クします。また、剰余だけが要求されている場合には、生成コードを最適化します。
アセンブラソースで複数の DivMod を使用している場合にラベルの多重定義を防ぐた
め、このマクロはローカルラベル(90、91)を使用します。詳細については、P. 2-13
「ローカルラベル」を参照して下さい。
例 2-15 は、上記のマクロを以下のように呼び出したときに生成されるコードを示して
います。
ratio
DivMod
r0,r5,r4,r2
例 2-15
ASSERT
ASSERT
ASSERT
ASSERT
ASSERT
ASSERT
r5
r5
r4
r0
r0
r0
<>
<>
<>
<>
<>
<>
r4
r2
r2
r5
r4
r2
;
;
;
;
;
;
MOV
CMP
MOVLS
CMP
BLS
MOV
CMP
SUBCS
ADC
r2, r4
r2, r5,
r2, r2,
r2, r5,
%b90
r0, #0
r5, r2
r5, r5,
r0, r0,
MOV
CMP
BHS
r2, r2, LSR #1
r2, r4
%b91
Produce an error if the
registers supplied are
not all different
These three only matter if $Div
is not null ("")
ratio
90
91
2-50
LSR #1
LSL #1
LSR #1
r2
r0
; Put divisor in $Temp
; double it until
; 2 * r2 > r5
;
;
;
;
;
The b means search backwards
Initialize quotient
Can we subtract r2?
If we can, do so
Double r0
; Halve r2,
; and loop until
; less than divisor
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.10
MAP ディレクティブと FIELD ディレクティブを使用したデータ構造の記述
MAP ディレクティブと FIELD ディレクティブを使用してデータ構造を記述することが
できます。この 2 つのディレクティブは、必ず対で使用します。
MAP と FIELD を使用してデータ構造を定義することには、以下の利点があります。
•
•
•
保守が容易である。
この定義を使用して同じ構造の複数のインスタンスを記述することができる。
データに効率的にアクセスできる。
MAP ディレクティブを使用すると、データ構造のベースアドレスを指定できます。詳細
については、P. 7-15「MAP」を参照して下さい。
FIELD ディレクティブを使用すると、データ項目に必要なメモリ量を指定し、データ
項目にラベルを付けることができます。この操作を構造内の全てのデータ項目に繰り
返します。詳細については、P. 7-16「FIELD」を参照して下さい。
注
マップが定義されていると、メモリ空間は割り当てられません。メモリ空間を割り当
てるには、定数定義ディレクティブ(DCD 等)を使用して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-51
ARM および Thumb アセンブリ言語の記述
2.10.1
相対マップ
現在の命令からの距離が 4KB を越すデータにアクセスするには、以下のようなレジス
タ相対命令を使用できます。
LDR
r4,[r9,#offset]
offsetの上限は 4096 であるため、r9は既に 4KB 以内のデータアドレスの値を保持して
います。
例 2-16
consta
constb
x
y
string
MAP
FIELD
FIELD
FIELD
FIELD
FIELD
0
4
4
8
8
256
;
;
;
;
;
consta
constb
x uses
y uses
string
uses four bytes, located at offset 0
uses four bytes, located at offset 4
eight bytes, located at offset 8
eight bytes, located at offset 16
is up to 256 bytes long, starting at offset 24
例 2-16 のマップを使用すると、以下の命令を使用してデータ構造にアクセスできます。
MOV
LDR
r9,#4096
r4,[r9,#constb]
これらのラベルはデータ構造開始位置に相対になっています。マップの開始アドレス
を保持するのに使用されるレジスタ(この場合は r9)は、ベースレジスタと呼ばれます。
このデータ構造では、多くの LDR 命令または STR 命令がデータにアクセスする可能性
があります。
このマップがデータ構造の位置を保持しているわけではありません。構造の位置は、ラ
ンタイムにベースレジスタにロードされる値によって決定されます。
同じマップを使用して、このデータ構造の多くのインスタンスを記述することができ
ます。これらのインスタンスはメモリ内のどこに配置してもかまいません。
MOV 命令を使用してレジスタにロードできるアドレスには制限があります。任意のアド
レスをロードする方法については、P. 2-30「レジスタへのアドレスのロード」を参照し
て下さい。
注
r9 は、ARM-Thumb プロシージャコール標準のスタティックベースレジスタ(sb)で
す。詳細については、ADS デベロッパガイドの「プロシージャコール標準」を参照し
て下さい。
2-52
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.10.2
レジスタベースのマップ
多くの場合、データ構造にアクセスするたびに、同じレジスタをベースレジスタとし
て使用できます。このレジスタの名前はマップのベースアドレスに含めることができ
ます。例 2-17 は、こうしたレジスタベースのマップを示しています。このマップで定
義されているラベルには、レジスタが含まれています。
例 2-17
consta
constb
x
y
string
MAP
FIELD
FIELD
FIELD
FIELD
FIELD
0,r9
4
4
8
8
256
;
;
;
;
;
consta
constb
x uses
y uses
string
uses four bytes, located at offset 0 (from r9)
uses four bytes, located at offset 4
eight bytes, located at offset 8
eight bytes, located at offset 16
is up to 256 bytes long, starting at offset 24
例 2-17 のマップを使用して、以下のデータ構造にアクセスすることができます。
ADR
LDR
r9,datastart
r4,constb
; => LDR r4,[r9,#4]
constb には、データ構造の開始位置からのデータ項目のオフセットが含まれ、ベース
レジスタも含まれています。この場合、ベースレジスタは r9 で、MAP ディレクティブ
で定義されます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-53
ARM および Thumb アセンブリ言語の記述
2.10.3
プログラム相対マップ
プログラムカウンタ(r15)をマップのベースレジスタとして使用できます。この場合、
オフセットが 4KB までに制限されているため、STM 命令と LDM 命令はそれぞれがアド
レス指定するデータ項目から 4KB 以内に配置する必要があります。データ構造は、こ
れらの命令と同一セクション内にある必要があります。同一セクション内にない場合
は、データ項目がリンク後も範囲内にあるとは限りません。
例 2-18 は、こうしたマップを使用したプログラムコードを示しています。この例には、
データ構造にメモリ空間を割り当てるディレクティブと、その空間にアクセスする命
令が含まれています。
例 2-18
datastruc
280
datastruc
4
4
8
8
256
; reserves 280 bytes of memory for datastruc
consta
constb
x
y
string
SPACE
MAP
FIELD
FIELD
FIELD
FIELD
FIELD
code
LDR
r2,constb
; => LDR r2,[pc,offset]
この例では、プログラムカウンタが既に正しいアドレスを保持しているため、データ
をロードする前にベースレジスタをロードする必要はありません。
(プロセッサのパイ
プライン動作により、実際にはこのアドレスは LDR 命令のアドレスとは異なります。
しかし、アセンブラがこの問題を解決します。)
2-54
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.10.4
割り当てデータの終わりの検出
オペランド 0 の FIELD ディレクティブを使用して、構造内の位置にラベルを付けるこ
とができます。位置にラベルを付けても、位置カウンタはインクリメントされません。
例 2-19 で定義したデータ構造のサイズは、MaxStrLen と ArrayLen の値によって異
なります。これらの値が大きすぎると、構造は使用可能なメモリの終わりをオーバラ
ンしてしまいます。
例 2-19 では以下を使用しています。
•
使用可能なメモリの終わりを定義する EQU ディレクティブ
•
データ構造の終わりをラベル付けするオペランド 0 の FIELD ディレクティブ
ASSERT ディレクティブによって、データ構造の終わりが使用可能なメモリをオーバラ
ンしていないかどうかがチェックされます。
例 2-19
StartOfData
EndOfData
Integer
Integer2
String
Array
BitMask
EndOfUsedData
ARM DUI0068BJ-00
EQU
EQU
MAP
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
ASSERT
0x1000
0x2000
StartOfData
4
4
MaxStrLen
ArrayLen*8
4
0
EndOfUsedData <= EndOfData
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-55
ARM および Thumb アセンブリ言語の記述
2.10.5
アライメントの調整
例 2-20 が示すように、データ構造内にいくつかの文字変数を使用すると問題が生じる
可能性があります。これは、ワードの多くが整列していないためです。
例 2-20
StartOfData
EndOfData
Char
Char2
Char3
Integer
Integer2
String
Array
BitMask
EndOfUsedData
EQU
EQU
MAP
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
ASSERT
0x1000
0x2000
StartOfData
1
1
1
4
; alignment = 3
4
MaxStrLen
ArrayLen*8
4
0
EndOfUsedData <= EndOfData
メモリ内の現在位置を整列させる ALIGN ディレクティブは使用できません。MAP ディ
レクティブとFIELDディレクティブは、
定義する構造に対してメモリを割り当てません。
Char3 FIELD 1 の後にダミーの FIELD 1 を挿入することが考えられますが、文字変
数の数を変更すると保守が難しくなります。毎回正確なパディングの量を計算し直さ
なくてはなりません。
P. 2-57 例 2-21 は、模範的なパディングの調整方法を示しています。この例では、オペ
ランド 0 の FIELD ディレクティブを使用して、文字データの終わりをラベル
(EndOfChars)付けします。追加された FIELD ディレクティブの 2 行目は、そのラ
ベルの値に基づいて適切な量のパディングを挿入します。:AND: 演算子は正確な値を
計算するために使用されています。
(-EndOfChars):AND:3 式によって、正確なパディングの量が計算されます。
0
3
2
1
if
if
if
if
EndOfChars
EndOfChars
EndOfChars
EndOfChars
is
is
is
is
0
1
2
3
mod
mod
mod
mod
4;
4;
4;
4.
これにより、文字変数が追加または削除されるたびに、使用するパディングの量が自
動的に調整されます。
2-56
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
例 2-21
StartOfData
EndOfData
Char
Char2
Char3
EndOfChars
Padding
Integer
Integer2
String
Array
BitMask
EndOfUsedData
ARM DUI0068BJ-00
EQU
EQU
MAP
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
ASSERT
0x1000
0x2000
StartOfData
1
1
1
0
(-EndOfChars):AND:3
4
4
MaxStrLen
ArrayLen*8
4
0
EndOfUsedData <= EndOfData
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-57
ARM および Thumb アセンブリ言語の記述
2.10.6
レジスタベースの MAP ディレクティブと FIELD ディレクティブの使用
レジスタベースの MAP ディレクティブと FIELD ディレクティブは、レジスタベースの
シンボルを定義します。レジスタベースのシンボルは、主に以下の 2 つの目的に使用
されます。
•
C 構造と同様の構造を定義する。
•
非レジスタベースの MAP/FIELD ディレクティブで記述したメモリセクションへ
のアクセス速度を上げる。
レジスタベースのシンボルの定義
レジスタベースのシンボルは非常に便利ですが、使用する際は注意する必要がありま
す。原則として、レジスタベースのシンボルは以下の場合にのみ使用して下さい。
•
ロード命令のロード元またはストア命令でのストア先となる位置として使用す
る。Location がレジスタ Rb を基準にしたレジスタベースのシンボルで、数値
オフセットが使用されている場合、アセンブラは例えば LDR Rn,Location を
LDR Rn,[Rb,#offset] に自動変換します。
ADR 命令または ADRL 命令では、アセンブラは ADR Rn,Location を ADD
Rn,Rb,#offset に変換します。
•
通常の数値式をレジスタベースのシンボルに加算して、別のレジスタベースのシ
ンボルを取得する。
•
通常の数値式をレジスタベースのシンボルから減算して、別のレジスタベースの
シンボルを取得する。
•
レジスタベースのシンボルを別のレジスタベースのシンボルから減算して、通常
の数値式を取得する方法は、両方のレジスタベースのシンボルが同じレジスタを
基準にしている場合を除き使用しないで下さい。2 つのレジスタと数値が結合さ
れ、アセンブリエラーが発生します。
•
:BASE: 演算子または :INDEX: 演算子のオペランドとして使用する。これらの
演算子は主にマクロで使用されます。
上記以外に使用すると、通常はアセンブラがエラーメッセージを生成します。例えば、
LDR Rn,=Location(Location はレジスタベース)と記述した場合には、レジスタ
Rbの現在の値+オフセットを保持するメモリ位置からRnをロードするようにアセンブ
ラに指示していることになります。このようなメモリ位置は存在しないため、アセン
ブラはこの命令を実行することができません。
同様に、ADD Rd,Rn,#expression と記述し、expression がレジスタベースであ
る場合には、1 つの ADD 命令で、この式のベースレジスタとオフセットの両方を Rn に
加算するように指示していることになります。ここでも、アセンブラはこの命令を実
行することができません。2 つの加算を実行するには、2 つの ADD 命令が必要です。
2-58
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
C タイプの構造の設定
C の構造を使用するには以下の 2 つのステップを踏む必要があります。
1.
2.
構造に含めるフィールドを宣言します。
メモリ内に構造を生成して使用します。
例えば、以下の typedef ステートメントは、x、y、z という 3 つの float フィール
ドを保持するポイント構造を定義していますが、メモリは割り当てていません。2 番目
のステートメントが、メモリ内に origin、oldloc、newloc という 3 つの Point 型
構造を割り当てています。
typedef struct Point
{
float x,y,z;
} Point;
Point origin,oldloc,newloc;
以下のアセンブラ言語コードは、上記の typedef ステートメントと同等です。
PointBase
Point_x
Point_y
Point_z
RN
MAP
FIELD
FIELD
FIELD
r11
0,PointBase
4
4
4
以下はメモリ空間を割り当てるセンブラ言語コードです。このコードは、C コードの最
終行と等価です。
origin
oldloc
newloc
SPACE
SPACE
SPACE
12
12
12
マップ内で定義したラベルを使用するには、その前にデータ構造のベースアドレスを
ベースレジスタにロードする必要があります。例:
LDR
MOV
STR
MOV
STR
MOV
STR
PointBase,=origin
r0,#0
r0,Point_x
r0,#2
r0,Point_y
r0,#3
r0,Point_z
上記のコードは、以下の C コードと等価です。
origin.x = 0;
origin.y = 2;
origin.z = 3;
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-59
ARM および Thumb アセンブリ言語の記述
アクセス速度の向上
メモリセクションへのアクセス速度を上げるには:
1.
メモリセクションを構造として記述します。
2.
レジスタを使用してその構造をアドレス指定します。
例えば、例 2-22 のように定義します。
例 2-22
StartOfData
EndOfData
Integer
String
Array
BitMask
EndOfUsedData
EQU
EQU
MAP
FIELD
FIELD
FIELD
FIELD
FIELD
ASSERT
0x1000
0x2000
StartOfData
4
MaxStrLen
ArrayLen*8
4
0
EndOfUsedData <= EndOfData
上記のコードを C コードで記述すると、以下のようになります。
Integer = 1;
String = "";
BitMask = 0xA000000A;
例 2-23 は、例 2-22 の定義を使用して生成されたアセンブラ言語コードを示しています。
例 2-23
MOV
LDR
STR
MOV
LDR
STRB
MOV
LDR
STRB
r0,#1
r1,=Integer
r0,[r1]
r0,#0
r1,=String
r0,[r1]
r0,#0xA000000A
r1,=BitMask
r0,[r1]
例 2-23 では LDR 疑似命令を使用しています。LDR 疑似命令の詳細については、P. 2-27
「LDR Rd, =const を使用したロード」を参照して下さい。
2-60
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
P. 2-60 例 2-23 では、個々の LDR 擬似命令を使用して、各データ項目のアドレスをロー
ドしています。各 LDR 疑似命令はアセンブラによって個々の命令に変換されます。し
かし、1 つの LDR 疑似命令でデータセクション全体にアクセスすることもできます。例
2-24 に、この方法を示します。これにより、速度とコードサイズの両方が向上します。
例 2-24
AREA
EQU
EQU
RN
MAP
StartOfUsedData FIELD
Integer
FIELD
String
FIELD
Array
FIELD
BitMask
FIELD
EndOfUsedData
FIELD
UsedDataLen
EQU
ASSERT
StartOfData
EndOfData
DataAreaBase
AREA
LDR
MOV
STR
MOV
STRB
MOV
STRB
data, DATA
0x1000
0x2000
r11
0,DataAreaBase
0
4
MaxStrLen
ArrayLen*8
4
0
EndOfUsedData - StartOfUsedData
UsedDataLen <= (EndOfData - StartOfData)
code, CODE
DataAreaBase,=StartOfData
r0,#1
r0,Integer
r0,#0
r0,String
r0,#0xA000000A
r0,BitMask
注
この例では、MAP ディレクティブを以下のように使用します。
MAP 0, DataAreaBase
以下のようには使用しないで下さい。
MAP StartOfData,DataAreaBase
MAP ディレクティブと FIELD ディレクティブによって、データの絶対位置ではなく、
DataAreaBase レ ジスタを 基準にしたデータの 相対位置 が指定されます。LDR
DataAreaBase,=StartOfData ステートメントは、データセクション全体の絶対位
置を指定します。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-61
ARM および Thumb アセンブリ言語の記述
メモリマップ I/O を保持する(または、その絶対アドレスを他の何らかの理由により変
更できない)メモリセクションに前述と同じ方法を使用する場合には、コードの保守
性を維持できるように注意を払う必要があります。
例えば、定義義を修正する場合は注意しなければならないことをプログラマに警告す
るコメントをコードに追加する方法が考えられます。さらに良い方法としては、レジ
スタベースの定義を制御する絶対アドレスの定義を使用する方法が挙げられます。
MAP offset,regの後にlabel FIELD 0を使用すると、labelがレジスタ部分のreg
と数値部分の offset で構成されるレジスタベースのシンボルになります。例 2-25 は
この様子を示しています。
例 2-25
StartOfIOArea
SendFlag_Abs
SendData_Abs
RcvFlag_Abs
RcvData_Abs
IOAreaBase
SendFlag
SendData
RcvFlag
RcvData
EQU
EQU
EQU
EQU
EQU
RN
MAP
FIELD
MAP
FIELD
MAP
FIELD
MAP
FIELD
0x1000000
0x1000000
0x1000004
0x1000008
0x100000C
r11
(SendFlag_Abs-StartOfIOArea),IOAreaBase
0
(SendData_Abs-StartOfIOArea),IOAreaBase
0
(RcvFlag_Abs-StartOfIOArea),IOAreaBase
0
(RcvData_Abs-StartOfIOArea),IOAreaBase
0
ベースアドレスを LDR IOAreaBase,=StartOfIOArea でロードします。これによ
り、LDR R0,RcvFlag や STR R4,SendData などのステートメントを使用して個々
の位置にアクセスすることができます。
2-62
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
2.10.7
2 つのレジスタベース構造の使用
同じタイプの 2 つの構造を同時に処理しなければならない場合があります。例えば、以
下の擬似コードと等価なコードを使用したいとします。
newloc.x = oldloc.x + (value in r0);
newloc.y = oldloc.y + (value in r1);
newloc.z = oldloc.z + (value in r2);
この場合のベースレジスタは、oldloc 構造と newloc 構造を交互に指す必要があり
ます。しかし、ベースレジスタを何度も変更するのは効率的とは言えません。代わり
に、非レジスタベースのマップを使用し、2 つのポインタを 2 つの異なるレジスタに設
定します(例 2-26 参照)。
例 2-26
Pointx
Pointy
Pointz
MAP
FIELD
FIELD
FIELD
0
4
4
4
;
;
;
;
Non-register based relative map used twice, for
old and new data at oldloc and newloc
oldloc and newloc are labels for
memory allocated in other sections
; code
ADR
ADR
LDR
ADD
STR
LDR
ADD
STR
LDR
ADD
STR
ARM DUI0068BJ-00
r8,oldloc
r9,newloc
r3,[r8,Pointx]
r3,r3,r0
r3,[r9,Pointx]
r3,[r8,Pointy]
r3,r3,r1
r3,[r9,Pointy]
r3,[r8,Pointz]
r3,r3,r2
r3,[r9,Pointz]
; load from oldloc (r8)
; store to newloc (r9)
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-63
ARM および Thumb アセンブリ言語の記述
2.10.8
MAP ディレクティブと FIELD ディレクティブで生じる問題の回避
MAPディレクティブとFIELDディレクティブを使用すると、保守が容易なデータ構造を
作成することができます。しかしこれは、プログラマにとってもプログラムにとって
も、エレメントがメモリ内に配置される順番が重要ではないということが前提です。
1 つの命令で複数の構造エレメントをロードまたはストアする場合には、いくつかの問
題が生じる可能性があります。こうした問題は、以下のような処理で発生します。
•
複数の単一バイトエレメントを 1 つのレジスタにロードする。
•
多重ストア命令または多重ロード命令(STM と LDM)を使用して、複数レジスタ
との間で複数ワードをロードまたはストアする。
これらの処理では、構造内のデータエレメントがメモリ内で連続し、かつ特定の順序
で配置されていなければなりません。エレメントの順序が変更されたり、新しいエレ
メントが追加されると、アセンブラのプログラムを見ているだけではわからないよう
な問題によってプログラムが動作しなくなります。
このような問題を回避するいくつかの方法があります。
例 2-27 は、サンプル構造を示しています。
例 2-27
MiscBase
MiscStart
Misc_a
Misc_b
Misc_c
Misc_d
MiscEndOfChars
MiscPadding
Misc_I
Misc_J
Misc_K
Misc_data
MiscEnd
MiscLen
RN
MAP
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
EQU
r10
0,MiscBase
0
1
1
1
1
0
(-:INDEX:MiscEndOfChars) :AND: 3
4
4
4
4*20
0
MiscEnd-MiscStart
1 ワードより大きい 1 つのデータエレメント(配列など)へのアクセスに LDM と STM
を使用しても問題ありません。例えば、20 ワードのエレメント Misc_data には、以
下のようにアクセスすることができます。
ArrayBase
2-64
RN
ADR
LDMIA
R9
ArrayBase, MiscBase
ArrayBase, {R0-R5}
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM および Thumb アセンブリ言語の記述
P. 2-64 例 2-27 は、配列 Misc_data の最初の 6 項目をロードします。この配列は 1 つ
のエレメントであるため、連続するメモリ位置を使用します。後でこのエレメントを
複数の配列に分配することはないでしょう。
ただし、Misc_I、Misc_J、Misc_K をレジスタ r0、r1、r2 にロードする場合には以
下のコードを使用できますが、将来的には問題が生じる可能性があります。
ArrayBase
RN r9
ADR
LDMIA
ArrayBase, Misc_I
ArrayBase, {r0-r2}
問題は、Misc_I、Misc_J、Misc_K の順序が変更されたとき、または新しいエレメ
ント Misc_New が間に追加されたときに発生します。こうしたわずかな変更でも、コー
ドが動作しなくなります。
これらのエレメントが別の場所で別々にアクセスされる場合、これらを 1 つの配列エ
レメントに合体させてはなりません。この場合にはコードを修正する必要があります。
まず最初に、構造にコメントを挿入して、このセクションに影響を及ぼす変更を防止
する必要があります。
Misc_I
Misc_J
Misc_K
FIELD
FIELD
FIELD
4
4
4
;
;
;
==} Do not split/reorder
} these 3 elements, STM
==} and LDM instructions used.
コードに明確なコメントが付いている場合、プログラムの動作に影響を及ぼす変更が
故意に行われる可能性は少なくなります。とはいえ、間違いは生じるものです。こう
した問題を回避する次の方法としては、STM 命令と LDM 命令の直前に、ラベルが正し
い順序で連続しているかどうかをチェックする ASSERT ディレクティブを追加します。
ArrayBase
ASSERT
RN
R9
; Check that the structure elements
; are correctly ordered for LDM
(((Misc_J-Misc_I) = 4) :LAND: ((Misc_K-Misc_J) = 4))
ADR
ArrayBase, Misc_I
LDMIA
ArrayBase, {r0-r2}
構造が LDM でロードできるように正しい順序で配置されていない場合は、ASSERT ディ
レクティブがこの時点でアセンブリを中止します。最下位アドレスを使用するエレメ
ントは、必ず最も番号の小さいレジスタとの間でロード / ストアされます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
2-65
ARM および Thumb アセンブリ言語の記述
2.11
フレームディレクティブの使用
以下のいずれかを実行する場合、フレームディレクティブを使用して、コードがスタッ
クを使用する方法を記述する必要があります。
•
スタック展開を使用してアプリケーションをデバッグする。
•
フラットプロファイリングまたはコールグラフプロファイリングを使用する。
これらのディレクティブの詳細については、P. 7-33「フレーム記述ディレクティブ」を
参照して下さい。
アセンブラはこれらのディレクティブを使用して、生成する ELF 形式のオブジェクト
ファイルに DWARF2 デバッグフレーム情報を挿入します。この情報は、デバッガがス
タック展開とプロファイリングを行うときに必要になります。詳細については、ADS
デベロッパガイドの「プロシージャコール標準」を参照して下さい。
フレームディレクティブによって、armasm が生成したコードに影響が及ぶことはあり
ません。
2-66
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
第3章
アセンブラについて
本章では、ARM アセンブラに関する一般情報を提供します。本章は以下のセクション
から構成されています。
•
コマンド構文:P. 3-2
•
•
•
•
•
ソース行の形式:P. 3-8
事前定義されるレジスタ名とコプロセッサ名:P. 3-9
ビルトイン変数:P. 3-10
シンボル:P. 3-12
式、リテラル、演算子:P. 3-18
本章では、ARM アセンブラ言語の記述方法については説明していません。アセンブリ
言語の記述方法については、第 2 章「ARM および Thumb アセンブリ言語の記述」を参
照して下さい。
また、命令、ディレクティブ、擬似命令についても説明していません。これらの詳細
については、それぞれ該当する章を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-1
アセンブラについて
3.1
コマンド構文
このセクションの内容は、armasm に関するものです。インラインアセンブラは、C コ
ンパイラおよび C++ コンパイラの一部であり、独自のコマンド構文はありません。
armasm コマンドラインは、ファイル名と指定場所以外は、大文字・小文字が区別され
ません。
ARM アセンブラを呼び出すには、以下のコマンドを使用します。
armasm [-16|-32] [-apcs [none|[/qualifier[/qualifier[...]]]]]
[-bigend|-littleend] [-checkreglist] [-cpu cpu] [-depend dependfile|-m|-md]
[-errors errorfile] [-fpu name] [-g] [-help] [-i dir [,dir]…] [-keep] [-list
[listingfile] [options]] [-maxcache n] [-memaccess attributes] [-nocache]
[-noesc] [-noregs] [-nowarn] [-o filename] [-predefine "directive"] [-split_ldm]
[-unsafe] [-via file] inputfile
説明:
-16
命令を Thumb 命令として解釈するようにアセンブラに指示します。この
オプションは、ソースファイルの先頭に CODE16 ディレクティブを使用
することと同じです。
-32
命令を ARM 命令として解釈するようにアセンブラに指示します。デフォ
ルトにはこの設定が使用されます。
-apcs [none|[/qualifier[/qualifier[...]]]]
ARM/Thumb プロシージャコール標準(ATPCS)を使用しているかどうか
を指定します。コードセクションのいくつかの属性を指定することもで
きます。ATPCS の詳細については、ADS デベロッパガイドを参照して下
さい。
/none
inputfile が ATPCS を使用しないことを指定します。ATPCS
レジスタはセットアップされません。修飾子は使用できません。
注
ATPCS 修飾子が、アセンブラによって生成されるコードに影響を及ぼす
ことはありません。ATPCS 修飾子は、inputfile のコードが特定の
ATPCS バリアントでコンパイルされることを示します。これらの修飾子
によって、アセンブラが生成するオブジェクトファイルに属性が設定さ
れます。リンカはこの属性を使用してファイルの互換性をチェックし、
適切なライブラリバリアントを選択します。
qualifier の値は以下の通りです。
inputfile のコードが ARM/Thumb インターワー
/interwork
キングに適していることを示します。インターワー
キングの詳細については、ADS デベロッパガイドを
参照して下さい。
inputfile のコードが ARM/Thumb インターワー
/nointerwork
キングに適していないことを示します。デフォルト
ではこの設定が使用されます。
3-2
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
/ropi
inputfile の内容が読み出し専用位置独立型であ
ることを示します。デフォルトは /noropi です。
/pic
/ropi の同義語です。
/nopic
/noropi の同義語です。
/rwpi
/pid
inputfile の内容が読み出し / 書き込み位置独立
型であることを示します。デフォルトは /norwpi
です。
/rwpi の同義語です。
/nopid
/norwpi の同義語です。
inputfile のコードがソフトウェアスタックリ
ミットチェックを実行することを示します。
/noswstackcheck inputfile のコードがソフトウェアスタックリ
ミットチェックを実行しないことを示します。デ
フォルトではこの設定が使用されます。
/swstna
inputfile のコードが、スタックリミットチェッ
クを実行するコードと、スタックリミットチェック
を実行しないコードの両方と互換性があることを
示します。
/swstackcheck
-bigend
ビッグエンディアン形式の ARM に適したコードをアセンブルするよう
アセンブラに指示します。デフォルトは -littleend です。
-littleend リトルエンディアン形式の ARM に適したコードをアセンブルするよう
アセンブラに指示します。
-checkreglist
RLIST、LDM、STM レジスタリストをチェックして、全てのレジスタがレ
ジスタ番号に基づいて昇順に配置されていることを確認するようアセン
ブラに指示します。レジスタが順序通りにリストされていない場合は、
警告が生成されます。
-cpu cpu
ターゲット CPU を設定します。命令によっては、違うターゲット CPU に
合わせてアセンブルされるとエラーまたは警告が生成される場合があり
ます(-unsafe アセンブラオプション参照)。cpu に指定できる有効値
は 3、4T、5TE などのアーキテクチャ名か、ARM7TDMI® などのコア名
です。アーキ テクチャの詳 細については、ARM Architecture Reference
Manual を参照して下さい。デフォルトは ARM7TDMI です。
-depend dependfile
ソースファイル従属リストをdependfileに保存するようアセンブラに
指示します。これらは、メークユティリティとの使用に適しています。
-m
ARM DUI0068BJ-00
ソースファイル従属リストを stdout に書き出すようにアセンブラに指
示します。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-3
アセンブラについて
-md
ソースファイル従属リストを inputfile.d に書き出すようにアセンブ
ラに指示します。
-errors errorfile
エラーメッセージを errorfile に出力するようにアセンブラに指示し
ます。
-fpu name ターゲットの浮動小数点ユニット(FPU)アーキテクチャを選択します。
このオプションを指定すると、-cpu オプションによって暗黙に設定さ
れた FPU が上書きされます。浮動小数点命令を間違ったターゲット FPU
に合わせてアセンブルすると、エラーまたは警告が生成されます。
アセンブラは、オブジェクトファイルの name に対応するビルド属性を
設定します。リンカはそれに応じてオブジェクトファイル間の互換性と
使用できるライブラリを決定します。
有効なオプションは以下のとおりです。
none
浮動小数点オプションを選択しません。これにより、アセン
ブルされたオブジェクトファイルと他のオブジェクトファイ
ルとの互換性が保たれます。
vfp
-fpu vfpv1 の同義語。
vfpv1
アーキテクチャ VFPv1 に準拠したハードウェアベクタ浮動小
数点ユニットを選択します。
vfpv2
アーキテクチャ VFPv2 に準拠したハードウェアベクタ浮動小
数点ユニットを選択します。
fpa
ハードウェア浮動小数点アクセラレータを選択します。
softvfp+vfp
ハードウェア浮動小数点ユニットを選択します。
armasm に対しては、-fpu vfpv1 を指定することと同じで
す。リンク時のソフトウェアライブラリ選択に対する作用に
ついては、ADS コンパイラ / ライブラリガイドの「C/ C++ コ
ンパイラ」を参照して下さい。
softvfp 純エンディアン double を使用するソフトウェア浮動小数点ラ
イブラリ(FPLib)を選択します。-fpu オプションが指定さ
れていない場合、この設定がデフォルトになります。
softfpa 混合エンディアン double を使用するソフトウェア浮動小数点
ライブラリを選択します。
-g
3-4
DWARF2 デバッグテーブルを生成するようアセンブラに指示します。下
位互換性を維持する目的で以下のコマンドラインオプションを使用でき
ますが、必須ではありません。
-dwarf2
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
-help
アセンブラコマンドラインオプションの一覧を表示するようアセンブラ
に指示します。
-i dir [,dir]…
GET、INCLUDE あるいは INCBIN ディレクティブへの引数を完全に修飾
しなくてもいいように、ディレクトリをソースファイル検索パスに追加
します。(P. 7-61「GET または INCLUDE」参照)。
-keep
デバッガが使用できるように、オブジェクトファイルのシンボルテーブ
ル内にローカルラベルを保存するようにアセンブラに指示します
(P. 7-64「KEEP」を参照)。
-list [listingfile] [options]
アセンブラが生成したアセンブリ言語の詳細リストを listingfile に
出力するようアセンブラに指示します。listingfile に - が指定され
ている場合、リストは stdout に出力されます。listingfile が指定
されていない場合、リストは inputfile.lst に出力されます。
-list の動作を制御するには、以下のコマンドラインオプションを使用
します。
-noterse terse フラグをオフにします。このオプションをオンにする
と、条件付きアセンブリによってスキップされた行はリスト
に含まれません。terse オプションがオフの場合、これらの
行がリストに含まれます。デフォルトはオンです。
-width
リストページの幅を設定します。デフォルトは 79 文字です。
-length リストページの長さを設定します。長さに 0 を指定すると、
ページングなしのリストが生成されます。デフォルトは 66
行です。
-xref
シンボルが定義された位置や使用された位置を含め、マクロ
内外でのシンボルの相互参照情報をリストするようにアセ
ンブラに指示します。デフォルトはオフです。
-maxcache
n
最大ソースキャッシュサイズを n に設定します。デフォルトは 8MB です。
-memaccess attributes
ターゲットメモリシステムのメモリアクセス属性を指定します。デフォ
ルトには、バイト、ハーフワード、ワードで境界整列したロードおよび
ストアを見越した値が設定されています。attributes を指定すると、
デフォルトが修正されます。attributes には以下のいずれかを指定で
きます。
+L41
非境界整列 LDR が可能になります。
-L22
-S22
-L22-S22
ARM DUI0068BJ-00
ハーフワードのロードが禁止されます。
ハーフワードのストアが禁止されます。
ハーフワードのロードとストアが禁止されます。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-5
アセンブラについて
-nocache
ソースキャッシングをオフにします。デフォルトでは、アセンブラは 1
回目のパスでソースファイルをキャッシュし、2 回目のパスでメモリか
らソースファイルを読み出します。
-noesc
C 方式の拡張特殊文字(\n や \t など)を無視するようアセンブラに指
示します。
-noregs
レジスタ名を事前定義しないようアセンブラに指示します。事前定義さ
れているレジスタ名のリストについては、P. 3-9「事前定義されるレジス
タ名とコプロセッサ名」を参照して下さい。
-nowarn
警告メッセージを非表示にします。
-o filename 出力オブジェクトファイルの名前を指定します。このオプションが指定
されていない場合、アセンブラは無効なコマンドラインオプションの 2
番目のコマンドライン引数を出力ファイル名として使用します。このよ
うな引数がない場合、アセンブラは inputfilename.o 形式のオブジェ
クトファイル名を作成します。
-predefine "directive"
SET ディレクティブのいずれか 1 つを事前に実行するようアセンブラに
指示します。directive は引用符で囲む必要があります。詳細につい
ては、P. 7-7「SETA、SETL、SETS」を参照して下さい。
アセンブラは、GBLL、GBLS、GBLA のうちで対応するディレクティブを
実行し、変数を定義してから値を設定します。
変数名は大文字と小文字が区別されます。
注
directive にストリングを含めるには、システムのコマンドラインイン
タフェースに \” などの特殊文字の組み合わせを入力しなければならな
い場合があります。別の方法としては、-via file を使用して
-predefine 引数を含めることもできます。コマンドラインインタ
フェースで -via ファイルの引数を変更することはできません。
-split_ldm 転送されるレジスタの最大数が以下を超えた場合に、LDM 命令と STM 命
令を無効にするようアセンブラに指示します。
•
全ての STM と、PC をロードしない LDM に対しては、5 レジスタ
•
PC をロードする LDM に対しては 4 レジスタ
大きな多重レジスタ転送を行わないことで、以下の ARM システムにお
ける割り込みレイテンシを軽減することができます。
3-6
•
キャッシュまたはライトバッファのない ARM システム(キャッ
シュなし ARM7TDMI など)
•
0 ウェイト状態、32 ビットメモリを使用する ARM システム
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
注
大きな多重レジスタ転送を行わない場合には、コードサイズが大きくな
り、パフォーマンスが若干低下します。
大きな多重レジスタ転送を行わない場合でも、キャッシュ搭載システム
やライトバッファを実装したプロセッサではそれほど大きなメリットは
ありません。
また、0 ウェイト状態メモリを使用しないシステムや、ペリフェラルデ
バイスの速度が遅いシステムでもメリットはありません。こうしたシス
テムにおける割り込みレイテンシは、最低速度のメモリアクセスまたは
ペリフェラルアクセスに要するサイクル数によって決定されます。こう
した割り込みレイテンシは、多重レジスタ転送によるレイテンシよりも
かなり大きくなるのが一般的です。
-unsafe
指定したアーキテクチャやプロセッサで使用できない命令を保持する
ファイルのアセンブリが可能になります。対応するエラーメッセージが
警告メッセージに変更されます。また、演算子の優先度に関する警告も
表示されなくなります(P. 3-28「二項演算子」参照)。
-via file
file を開き、アセンブラへのコマンドライン引数を読み出すようアセン
ブラに指示します。詳細については、ADS コンパイラ / ライブラリガイ
ドの付録「via ファイル構文」を参照して下さい。
inputfile アセンブラへの入力ファイルを指定します。入力ファイルには、ARM ア
センブル言語ソースファイルか Thumb アセンブル言語ソースファイルの
どちらかを指定する必要があります。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-7
アセンブラについて
3.2
ソース行の形式
ARM アセンブリ言語モジュールのソース行の汎用形式は以下の通りです。
{symbol} {instruction|directive|pseudo-instruction} {;comment}
このソース行の 3 つのセクションは全てオプションです。
最初から命令を記述することはできません。前にシンボルがない場合でも、スペース
を前に付ける必要があります。
ディレクティブは本書に記載しているように全て大文字で記述しても、あるいは全て
小文字で記述してもかまいません。ただし、大文字と小文字を混合することはできま
せん。
空白行を使用してコードを読みやすくすることもできます。
symbol は通常はラベルです(P. 3-15「ラベル」参照)。命令および擬似命令では、symbol
は必ずラベルになります。一部のディレクティブでは、symbol は変数または定数のシ
ンボルになります。どのケースに当てはまるかは、ディレクティブの説明を参照して
下さい。
symbol にはスペースやタブなどのスペース文字を使用せずに、最初の欄から記述して
下さい(P. 3-12「シンボルの命名規則」参照)。
3-8
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
3.3
事前定義されるレジスタ名とコプロセッサ名
レジスタ名とコプロセッサ名は全て大文字と小文字が区別されます。
3.3.1
事前宣言されるレジスタ名
以下のレジスタ名は事前に宣言します。
•
r0-r15 および R0-R15
•
3.3.2
a1-a4(引数、結果、またはスクラッチレジスタ:r0 ~ r3 の同義語)
•
v1-v8(変数レジスタ:r4 ~ r11)
•
sb および SB(スタティックベース:r9)
•
sl および SL(スタックリミット:r10)
•
fp および FP(フレームポインタ:r11)
•
ip および IP(プロシージャコール内スクラッチレジスタ:r12)
•
sp および SP(スタックポインタ:r13)
•
lr および LR(リンクレジスタ:r14)
•
pc および PC(プログラムカウンタ:r15)
事前宣言されるプログラムステータスレジスタ名
以下のプログラムステータスレジスタは事前に宣言します。
•
cpsr および CPSR(カレントプログラムステータスレジスタ)
•
3.3.3
spsr および SPSR(保存プログラムステータスレジスタ)
事前宣言される浮動小数点レジスタ名
以下の浮動小数点レジスタ名は事前に宣言します。
•
f0-f7 および F0-F7(FPA レジスタ)
3.3.4
•
s0-s31 および S0-S31(VFP 単精度レジスタ)
•
d0-d15 および D0-D15(VFP 倍精度レジスタ)
事前宣言されるコプロセッサ名
以下のコプロセッサ名とコプロセッサレジスタ名は事前に宣言します。
•
p0-p15(コプロセッサ 0 ~ 15)
•
ARM DUI0068BJ-00
c0-c15(コプロセッサレジスタ 0 ~ 15)
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-9
アセンブラについて
3.4
ビルトイン変数
表 3-1 は、ARM アセンブラによって定義されるビルトイン変数を示しています。
表 3-1 ビルトイン変数
{PC} または .
現在の命令のアドレス。
{VAR} または @
記憶域位置カウンタの現在値。
{TRUE}
論理定数 TRUE。
{FALSE}
論理定数 FALSE。
{OPT}
現在設定されているリストオプションの値。OPT ディレクティブを使用すると、現在の
リストオプションの保存、変更、元の値の復元を実行できます。
{CONFIG}
アセンブラがアセンブルするコードが ARM コードの場合は 32、Thumb コードの場合
は 16。
{ENDIAN}
アセンブラがビッグエンディアンモードの場合は big、リトルエンディアンモードの場
合は little。
{CODESIZE}
{CONFIG} の同義語。
{CPU}
選択された cpu 名を保持します。デフォルトは ARM7TDMI です。コマンドラインオプ
ション -cpu でアーキテクチャを指定した場合、{CPU} は "Generic ARM" の値を保持
します。
{FPU}
選択された fpu 名を保持します。デフォルトは SoftVFP です。
{ARCHITECTURE}
選択された ARM アーキテクチャ名を保持します。
{PCSTOREOFFSET}
STR pc,[...]命令またはSTM Rb,{..., pc}命令のアドレスと、
ストアされたpcの
値とのオフセットです。この値は、指定したCPUやアーキテクチャによって異なります。
{ARMASM_VERSION}
armasm のバージョンを保持します。P. 3-11「アセンブリ時の armasm バージョンの判
別」も参照して下さい。
|ads$version|
{ARMASM_VERSION} と同じ値を保持します。
{INTER}
/inter が設定されている場合、TRUE を保持します。デフォルトは FALSE です。
{ROPI}
/ropi が設定されている場合、TRUE を保持します。デフォルトは FALSE です。
{RWPI}
/rwpi が設定されている場合、TRUE を保持します。デフォルトは FALSE です。
{SWST}
/swst が設定されている場合、TRUE を保持します。デフォルトは FALSE です。
{NOSWST}
/noswst が設定されている場合、TRUE を保持します。デフォルトは FALSE です。
SETA、SETL、SETS ディレクティブを使用してビルトイン変数を設定することはでき
ません。これらは、式または以下のような条件で使用できます。
IF {ARCHITECTURE} = "4T"
3-10
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
|ads$version| には必ず小文字を使用して下さい。それ以外のビルトイン変数には、
大文字、小文字、または大文字と小文字の組み合わせを使用することができます。
3.4.1
アセンブリ時の armasm バージョンの判別
ADS1.0 以上では、ビルドイン変数 {ARMASM$VERSION} を使用して armasm のバー
ジョンを確認することができます。ただし、これ以前の armasm のバージョンには、こ
のビルトイン変数がありません。
ADS バージョンと SDT バージョンの両方のコードをビルドする必要がある場合には、
ビルトイン変数 |ads$version| で試してみて下さい。この場合、以下のようなコー
ドを使用します。
IF :DEF: |ads$version|
; code for ADS
ELSE
; code for SDT
ENDIF
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-11
アセンブラについて
3.5
シンボル
シンボルを使用して、変数、アドレス、数値定数を表現することができます。アドレ
スを表すシンボルは、ラベルとも呼びます。以下を参照して下さい。
•
変数:P. 3-13
数値定数:P. 3-13
ラベル:P. 3-15
ローカルラベル:P. 3-16
•
•
•
3.5.1
シンボルの命名規則
シンボル名には以下の原則が適用されます。
•
•
シンボル名には大文字、小文字、数値文字、下線文字を使用できます。
ローカルラベルを除き、シンボル名の最初の文字には数値文字を使用できません
(P. 3-16「ローカルラベル」を参照)。
•
シンボル名は大文字・小文字が区別されます。
•
シンボル名の全ての文字は有意です。
•
シンボル名は、その有効範囲内で一意でなければなりません。
•
シンボルにはビルトイン変数名と事前定義されるシンボル名を使用できません。
(P. 3-9「事前定義されるレジスタ名とコプロセッサ名」および P. 3-10「ビルトイ
ン変数」を参照)。
•
シンボルに、命令ニーモニックやディレクティブと同じ名前は使用できません。
命令ニーモニックやディレクティブと同じ名前を使用する場合、2 本の縦線を使
用してシンボル名を区切ります。例:
||ASSERT||
縦線はシンボル名には含まれません。
コンパイラを使用する場合など、シンボルに様々な種類の文字を使用する必要がある
場合には、1 本の縦線を使用してシンボル名を区切ります。例:
|.text|
縦線はシンボル名には含まれません。縦線内に縦線、セミコロン、改行は使用できま
せん。
3-12
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
3.5.2
変数
変数の値は、アセンブリの段階で変更することができます。変数には以下の 3 つのタ
イプがあります。
•
数値
•
論理
•
ストリング
変数のタイプは変更できません。
数値変数に使用可能な値の範囲は、数値定数または数値式に使用可能な値の範囲と同
じです(「数値定数」と P. 3-20「数値式」を参照)。
論理変数に使用可能な値は、{TRUE} または {FALSE} です(P. 3-23「論理式」参照)。
ストリング変数に使用可能な値の範囲は、ストリング式の値の範囲と同じです(P. 3-19
「ストリング式」参照)。
GBLA、GBLL、GBLS、LCLA、LCLL、LCLS ディレクティブを使用して変数を表すシン
ボルを宣言し、SETA、SETL、SETS ディレクティブを使用して値を変数に割り当てま
す。以下を参照して下さい。
•
GBLA、GBLL、GBLS:P. 7-4
3.5.3
•
LCLA、LCLL、LCLS:P. 7-6
•
SETA、SETL、SETS:P. 7-7
数値定数
数値定数は 32 ビット整数です。数値定数は、0 ~ 232 - 1 の符号なし数値、または -231
~ 231 - 1 の符号付き数値を使用して設定できます。ただし、アセンブラは -n と 232 - n
の区別をしません。>= などの比較演算子は、符号なしと解釈されます。つまり、0 > -1
は {FALSE} です。
定数の定義には、EQU ディレクティブを使用します(P. 7-57「EQU」参照)。数値定数
は、定義した後で値を変更することはできません。
P. 3-20「数値式」および P. 3-21「数値リテラル」も参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-13
アセンブラについて
3.5.4
アセンブリ時の変数の代入
アセンブリ言語の 1 行全体に、または部分的にストリング変数を使用できます。スト
リング変数は、変数を値に置き換える位置で接頭文字 $ を付けて使用します。ドル記
号($)は、行の構文をチェックする前にストリングをソースコード行に代入するよう、
アセンブラに指示します。
数値変数と論理変数も代入できます。変数の現在の値は、代入前に 16 進法のストリン
グ(論理変数の場合は T または F)に変換されます。
変数名に続く文字がシンボル名に使用できる文字である場合は、ドット(.)を使用し
て変数名の終わりを示します(P. 3-12「シンボルの命名規則」を参照)。変数を使用す
るには、変数の内容を設定する必要があります。
$ を使用する必要があるときに、これを代入させたくない場合には $$ を使用します。$$
は単一の $ に変換されます。
ストリングには接頭文字 $ を付けた変数を含めることができます。この場合も他の場
合と同様に代入が行われます。
二重引用符(")で囲まれた縦線は代入には影響しませんが、縦線で囲んだ中では代入
は発生しません。
例
; straightforward substitution
GBLS
add4ff
;
add4ff SETS
"ADD r4,r4,#0xFF"
$add4ff.00
; this produces
ADD r4,r4,#0xFF00
; set up add4ff
; invoke add4ff
; elaborate substitution
GBLS
s1
GBLS
s2
GBLS
fixup
GBLA
count
;
count
SETA
14
s1
SETS
"a$$b$count" ; s1 now has value a$b0000000E
s2
SETS
"abc"
fixup
SETS
"|xy$s2.z|" ; fixup now has value |xyabcz|
|C$$code|
MOV
r4,#16
; but the label here is C$$code
3-14
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
3.5.5
ラベル
ラベルは、命令またはデータのメモリ内でのアドレスを表すシンボルです。ラベルに
は、プログラム相対ラベル、レジスタ相対ラベル、絶対ラベルがあります。
プログラム相対ラベル
プログラム相対ラベルは、プログラムカウンタ +/- 数値定数を表します。プログラム相
対ラベルは、分岐命令の分岐先として使用するか、コードセクションに埋め込まれた
小さなデータ項目へのアクセスに使用します。命令またはデータ定義ディレクティブ
のいずれかにラベルを使用して、プログラム相対ラベルを定義できます。以下を参照
して下さい。
•
DCB:P. 7-18
•
DCD と DCDU:P. 7-19
•
DCFD と DCFDU:P. 7-21
•
DCFS と DCFSU:P. 7-22
•
DCI:P. 7-23
•
DCQ と DCQU:P. 7-24
•
DCW と DCWU:P. 7-25
レジスタ相対ラベル
レジスタ相対ラベルは、指定されたレジスタ + 数値定数を表します。これらは通常、
データセクションのデータへのアクセスに使用されます。レジスタ相対ラベルは、記
憶域マップで定義できます。EQU ディレクティブを使用すると、記憶域マップ内で定
義したラベルに基づいて、別のレジスタ相対ラベルを定義することができます。以下
を参照して下さい。
•
MAP:P. 7-15
•
SPACE:P. 7-17
•
DCDO:P. 7-20
•
EQU:P. 7-57
絶対アドレス
絶対アドレスは数値定数です。絶対アドレスには 0 ~ 232-1 の整数を使用できます。絶
対アドレスはメモリを直接アドレス指定します。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-15
アセンブラについて
3.5.6
ローカルラベル
ローカルラベルは 0 ~ 99 の番号で、後ろに名前を付けてもかまいません。1 つの ELF
セクションで複数のローカルラベルに同じ番号を使用できます。
通常ローカルラベルは、ループ、ルーチン内の条件付きコード、あるいはローカルだ
けで使用される小さなサブルーチンに使用します。ローカルラベルは、特にマクロで
使用すると有効です(P. 7-27「MACRO と MEND」を参照)。
ローカルラベルの有効範囲を制限するには、ROUT ディレクティブを使用します(P. 7-68
「ROUT」参照)。ローカルラベルへの参照は、同じ有効範囲内でマッチするラベルを参
照します。有効範囲内のどちらの方向にもマッチするラベルがない場合にはアセンブ
ラがエラーメッセージを生成し、アセンブリに失敗します。
同一有効範囲内でも、同一番号を複数のローカルラベルに使用できます。デフォルト
では、アセンブラはローカルラベルの参照を以下にリンクします。
•
有効範囲内にローカルラベルが存在する場合は、同じ番号を持つ最も最近のロー
カルラベル
•
有効範囲内で上記のローカルラベルが存在しない場合は、同じ番号を持つ次の
ローカルラベル
この検索パターンを修正する必要がある場合は、オプションのパラメータを使用します。
構文
ローカルラベルの構文は以下の通りです。
n{routname}
ローカルラベルへの参照の構文は以下の通りです。
%{F|B}{A|T}n{routname}
説明:
n
routname
%
F
B
A
T
ローカルラベルの番号。
現在の有効範囲の名前。
参照の導入部。
アセンブラに順方向への検索のみを指示します。
アセンブラに逆方向への検索のみを指示します。
アセンブラに全マクロレベルの検索を指示します。
アセンブラに現在のマクロレベルのみの検索を指示します。
FとBがどちらも指定されていない場合、アセンブラは最初に逆方向への検索を実行し、
次に順方向への検索を実行します。
A と T がどちらも指定されていない場合、アセンブラは現在のレベルから上位レベルに
向かって全マクロを検索しますが、下位レベルのマクロは検索しません。
3-16
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
ラベルまたはラベルへの参照で routname が指定されている場合、アセンブラはそれ
よりも前で最も近い ROUT ディレクティブの名前と routname とをマッチングします。
マッチしない場合は、アセンブラはエラーメッセージを生成し、アセンブリは失敗し
ます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-17
アセンブラについて
3.6
式、リテラル、演算子
このセクションは以下のサブセクションから構成されています。
•
ストリング式:P. 3-19
•
•
•
•
•
•
•
•
•
•
3-18
ストリングリテラル:P. 3-19
数値式:P. 3-20
数値リテラル:P. 3-21
浮動小数点リテラル:P. 3-22
レジスタ相対式とプログラム相対式:P. 3-23
論理式:P. 3-23
論理リテラル:P. 3-23
演算子の優先度:P. 3-24
単項演算子:P. 3-26
二項演算子:P. 3-28
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
3.6.1
ストリング式
ストリング式は、ストリングリテラル、ストリング変数、ストリング操作演算子、括
弧の組み合わせで構成されます。以下を参照して下さい。
•
ストリングリテラル
•
変数:P. 3-13
•
•
•
単項演算子:P. 3-26
ストリング操作演算子:P. 3-28
SETA、SETL、SETS:P. 7-7
ストリングリテラルに設定できない文字は、:CHR: 単項演算子を使用してストリング
式に設定できます。0 ~ 255 の ASCII 文字が使用できます。
ストリング式の値の長さが 512 文字を超えてはなりません。長さが 0 であってもかま
いません。
例
improb
3.6.2
SETS
"literal":CC:(strvar2:LEFT:4)
; sets the variable improb to the value "literal"
; with the left-most four characters of the
; contents of string variable strvar2 appended
ストリングリテラル
ストリングリテラルは、二重引用符で囲まれた一連の文字で構成されます。ストリン
グリテラルの長さは、入力行の長さに制限されます(P. 3-8「ソース行の形式」を参照)。
二重引用符またはドル記号をストリングに含めるには、その文字を対で使用します。
-noesc が指定されている場合を除き、C ストリングエスケープシーケンスも使用する
ことができます(P. 3-2「コマンド構文」を参照)。
例
abc
def
ARM DUI0068BJ-00
SETS
SETS
"this string contains only one "" double quote"
"this string contains only one $$ dollar symbol"
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-19
アセンブラについて
3.6.3
数値式
数値式は、数値定数、数値変数、通常の数値リテラル、二項演算子、括弧の組み合わ
せで構成されます。以下を参照して下さい。
•
数値定数:P. 3-13
•
•
•
•
変数:P. 3-13
数値リテラル:P. 3-21
二項演算子:P. 3-28
SETA、SETL、SETS:P. 7-7
レジスタまたはプログラムカウンタを含まない値を求める式の場合には、数値式にレ
ジスタ相対式またはプログラム相対式を含めることができます。
数値式の結果は 32 ビット整数です。この結果は 0 ~ 232 - 1 の符号なし数値または -231
~ 231 - 1 の符号付き数値として解釈できます。ただし、アセンブラは -n と 232 - n を区
別しません。>= などの比較演算子は、符号なしとして解釈されます。つまり、0 > -1 は
{FALSE} です。
例
a
3-20
SETA
MOV
256*256
r1,#(a*22)
; 256*256 is a numeric expression
; (a*22) is a numeric expression
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
3.6.4
数値リテラル
数値リテラルには以下のどの形式でも使用できます。
•
decimal-digits
0xhexadecimal-digits
&hexadecimal-digits
•
n_base-n-digits
'character'
オプションの説明:
decimal-digits
0 ~ 9 の数字のみを使用した文字シーケンス。
hexadecimal-digits
0 ~ 9 の数字と A ~ F または a ~ f の文字のみを使用した文字シー
ケンス。
n_
2 ~ 9(2 と 9 を含む)のうちの 1 つの数字と下線文字。
base-n-digits
0 ~ (n - 1) の数字のみを使用した文字シーケンス。
character
一重引用符以外の任意の 1 文字。一重引用符を指定する必要があ
る場合は、「\'」を使用して下さい。この場合、数値リテラルの値
は、この文字の数値コードとなります。
この他の文字は使用しないで下さい。文字シーケンスが返す結果は必ず 0 ~ 232 - 1 の
範囲に収まる整数でなければなりません(ただし、DCQ ディレクティブと DCQU ディ
レクティブの場合は 0 ~ 264 - 1)。
例
a
addr
c3
ARM DUI0068BJ-00
SETA
DCD
LDR
DCD
SETA
DCQ
LDR
ADD
34906
0xA10E
r4,=&1000000F
2_11001010
8_74007
0x0123456789abcdef
r1,='A'
; pseudo-instruction loading 65 into r1
r3,r2,#'\''
; add 39 to contents of r2, result to r3
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-21
アセンブラについて
3.6.5
浮動小数点リテラル
浮動小数点リテラルには、以下のどの形式でも使用することができます。
{-}digits E{-}digits
{-}{digits}.digits{E{-}digits}
0xhexdigits
&hexdigits
digits
0 ~ 9 の数字のみを使用した文字シーケンス。E は大文字・小文字のどち
らかで記述することができます。これらの形式は、通常の浮動小数点の
表記と同じです。
hexdigits 0 ~ 9 の数字と A ~ F または a ~ f の文字のみを使用した文字シーケン
ス。これらの形式は、コンピュータで使用される数の内部表記と同じで
す。無限大および NaN を入力する場合、または使用している正確なビッ
トパタンを確認したい場合は、これらの形式を使用します。
単精度浮動小数点値の範囲は以下のとおりです。
•
最大:3.40282347e+38
•
最小:1.17549435e-38
倍精度浮動小数点値の範囲は以下のとおりです。
•
最大:1.79769313486231571e+308
•
最小:2.22507385850720138e-308
例
DCFD
DCFS
DCFD
LDFS
LDFD
3-22
1E308,-4E-100
1.0
3.725e15
0x7FC00000
&FFF0000000000000
; Quiet NaN
; Minus infinity
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
3.6.6
レジスタ相対式とプログラム相対式
レジスタ相対式からは、指定されたレジスタ +/- 数値定数が求められます(P. 7-15「MAP」
参照)。
プログラム相対式からは、プログラムカウンタ(pc)+/- 数値定数が求められます。プ
ログラム相対式には数値式を組み合わせたラベルを使用するのが一般的です。
例
data
3.6.7
LDR
r4,=data+4*n
; code
MOV
pc,lr
DCD
value0
; n-1 DCD directives
DCD
valuen
; more DCD directives
; n is an assembly-time variable
; data+4*n points here
論理式
論理式は、論理リテラル({TRUE} または {FALSE})、論理変数、ブール演算子、比較
式、括弧の組み合わせで構成されます(P. 3-31「ブール演算子」参照)。
比較式は、変数、リテラル、定数、あるいは適切な比較演算子を使用した式で構成さ
れます(P. 3-30「比較演算子」参照)。
3.6.8
論理リテラル
論理リテラルは以下の 2 つだけです。
ARM DUI0068BJ-00
•
{TRUE}
•
{FALSE}
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-23
アセンブラについて
3.6.9
演算子の優先度
アセンブラには、式に使用できる多数の演算子が組み込まれています。これらの演算
子の多くは、C などの高水準言語で使用される演算子と似ています(P. 3-26「単項演算
子」および P. 3-28「二項演算子」を参照)。
評価の優先順位は、以下のように厳密に決められています。
1.
括弧内の式が最初に評価されます。
2.
演算子は前から順番に適用されます。
3.
隣接する単項演算子は、右から左に評価されます。
4.
優先順位が等しい二項演算子は、左から右に評価されます。
注
優先順位は、C と全く同じというわけではありません。
例えば、armasm では、(1 + 2 :SHR: 3) が (1 + (2 :SHR: 3)) = 1 と評価さ
れます。C で同じ式を評価すると、((1 + 2) >> 3) = 0 になります。
括弧を使用して、優先順位を明確にすることを推奨します。
表 3-2 は、armasm の演算子の優先順位と、C での優先順位との比較を示しています。
コード内に C では異なる方法で評価される式があると、通常 armasm は以下の警告を
生成します。
A1466W: Operator precedence means that expression would evaluate differently in C
-unsafeコマンドラインオプションを使用している場合は、
この警告は生成されません。
表 3-2 armasm での演算子の優先度
3-24
armasm での優先度
等価な C 演算子
単項演算子
単項演算子
* / :MOD:
* / %
ストリング操作
n/a
:SHL: :SHR: :ROR: :ROL:
<< >>
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
表 3-2 armasm での演算子の優先度
armasm での優先度
等価な C 演算子
+ - :AND: :OR: :EOR:
+ - & |
= > >= < <= /= <>
== > >= < <= !=
:LAND: :LOR: :LEOR:
&& ||
表 3-3 C での演算子の優先度
C での優先度
単項演算子
* / %
+ -(二項演算子として)
<< >>
< <= > >=
== !=
&
^
|
&&
||
リストには、優先順位の高い演算子から順番に掲載しています。
優先順位が最も高い演算子が最初に評価されます。
演算子の優先順位が同じ場合は、左から右に評価されます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-25
アセンブラについて
3.6.10
単項演算子
単項演算子は優先順位が最も高く、最初に評価されます。単項演算子はオペランドの
前に付けます。隣接する演算子は、右から左に評価されます。
表 3-4 は、単項演算子を示しています。
表 3-4 単項演算子
演算子
用法
説明
?
?A
シンボルAを定義している行から生成された実行コードのバイト
数です。
BASE
:BASE:A
A が pc 相対式またはレジスタ相対式の場合、BASE は式のレジス
タ構成要素の数を返します。
BASE はマクロで使用すると最も効果的です。
INDEX
:INDEX:A
A がレジスタ相対式であれば、INDEX はベースレジスタからのオ
フセットを返します。
INDEX はマクロで使用すると最も効果的です。
+と-
+A
-A
単項演算子 +。単項演算子 -。+ と - は、数値式およびプログラム
相対式に作用します。
LEN
:LEN:A
ストリング A の長さ。
CHR
:CHR:A
1 文字のストリング、ASCII コード A。
STR
:STR:A
A の 16 進ストリング。
STR は数値式に対応する 8 桁の 16 進ストリング、あるいは論理式
で使用される場合はストリング "T" または "F" を返します。
NOT
:NOT:A
A のビットごとの補数。
LNOT
:LNOT:A
A の論理補数。
DEF
:DEF:A
A が定義されている場合は {TRUE}、定義されていない場合は
{FALSE}。
SB_OFFSET_19_12 :SB_OFFSET_19_12: label
(label - sb) のビット [19:12]。P. 3-27「:SB_OFFSET_19_12: と
:SB_OFFSET_11_ 0 の使用例」を参照して下さい。
SB_OFFSET_11_0
3-26
:SB_OFFSET_11_0: label
(label - sb) の最下位 12 バイト。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
:SB_OFFSET_19_12: と :SB_OFFSET_11_ 0 の使用例
MyIndex EQU 0
AREA area1, CODE
LDR IP, [SB, #0]
LDR IP, [IP, #MyIndex]
ADD IP, IP, # :SB_OFFSET_19_12: label
LDR PC, [IP, # :SB_OFFSET_11_0: label]
AREA area2, DATA
label
IMPORT FunctionAddress
DCD FunctionAddress
END
これらのオペランドは、ADD 命令と LDR 命令でしか使用できません。また、ここで示
した方法でしか使用できません。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-27
アセンブラについて
3.6.11
二項演算子
二項演算子は、演算対象の一対の部分式の間に記述します。
二項演算子の優先順位は、単項演算より低くなります。このセクションでは、二項演
算子を優先順位の高いものから記載しています。
注
優先順位は、C の優先順位とは異なります(P. 3-24「演算子の優先度」参照)。
乗算演算子
あらゆる二項演算子の中で最も優先度が高いのが乗算演算子です。乗算演算子は、数
値式のみに作用します。
表 3-5 は、乗算演算子を示しています。
表 3-5 乗算演算子
演算子
用法
説明
*
A*B
乗算
/
A/B
除算
MOD
A:MOD:B
A を B で除算した剰余
ストリング操作演算子
表 3-6 は、ストリング操作演算子を示しています。
2 つのストリング操作演算子 LEFT、RIGHT の使用条件を以下に示します。
•
A は必ずストリングである。
•
B は必ず数値式である。
CC では、A と B の両方がストリングである。
表 3-6 ストリング操作演算子
3-28
演算子
用法
説明
LEFT
A:LEFT:B
A の最左 B 文字
RIGHT
A:RIGHT:B
A の最右 B 文字
CC
A:CC:B
A の最後に B を連結
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
シフト演算子
シフト演算子は数値式に作用し、第 2 オペランドが指定する回数で第 1 オペランドを
シフトまたはロテートします。
表 3-7 は、シフト演算子を示しています。
表 3-7 シフト演算子
演算子
用法
説明
ROL
A:ROL:B
A を B ビット左ロテート
ROR
A:ROR:B
A を B ビット右ロテート
SHL
A:SHL:B
A を B ビット左シフト
SHR
A:SHR:B
A を B ビット右シフト
注
SHR は論理シフトで、符号ビットの継承は行いません。
加算演算子、減算演算子、論理演算子
加算演算子と減算演算子は、数値式に作用します。
論理演算子は数値式に作用します。演算はビットごとに実行されます。つまり、オペ
ランドの各ビットに対する演算から結果を求めます。
表 3-8 は、加算演算子、減算演算子、論理演算子を示しています。
表 3-8 加算演算子、減算演算子、論理演算子
ARM DUI0068BJ-00
演算子
用法
説明
+
A+B
A を B に加算
-
A-B
B を A から減算
AND
A:AND:B
A と B のビットごとの論理積
OR
A:OR:B
A と B のビットごとの論理和
EOR
A:EOR:B
A と B のビットごとの排他的論理和
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-29
アセンブラについて
比較演算子
表 3-9 は、比較演算子を示しています。比較演算子は、論理値を求める同一タイプの 2
つのオペランドに作用します。
オペランドには以下のいずれかを使用することができます。
•
数値
•
プログラム相対
•
レジスタ相対
•
ストリング
ストリングは、ASCII 順にソートされます。ストリング A がストリング B の最初のサ
ブストリングの場合、または 2 つのストリングで異なる最左文字が、ストリング B の
文字よりもストリング A の文字の方が小さい場合には、ストリング A はストリング B
より小さくなります。
演算値は符号なし値であるため、0>-1 の値は {FALSE} となります。
表 3-9 比較演算子
3-30
演算子
用法
説明
=
A=B
A は B と等しい
>
A>B
A は B よりも大きい
>=
A>=B
A は B と等しい、または B よりも大きい
<
A<B
A は B よりも小さい
<=
A<=B
A は B と等しい、または B よりも小さい
/=
A/=B
A は B と等しくない
<>
A<>B
A は B と等しくない
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
アセンブラについて
ブール演算子
演算子の優先度が最も低いのがブール演算子です。ブール演算子は、オペランドに標
準論理演算を実行します。
3 つのケース全てにおいて、A と B は必ず {TRUE} または {FALSE} のどちらかを返す
式です。
表 3-10 に、ブール演算子を示します。
表 3-10 ブール演算子
ARM DUI0068BJ-00
演算子
用法
説明
LAND
A:LAND:B
A と B の論理積
LOR
A:LOR:B
A と B の論理和
LEOR
A:LEOR:B
A と B の排他的論理和
Copyright © 2000, 2001 ARM Limited. All rights reserved.
3-31
アセンブラについて
3-32
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
第4章
ARM 命令について
本章では、ARM アセンブラがサポートしている ARM 命令について説明します。本章
は以下のセクションから構成されています。
•
条件付き実行:P. 4-4
•
ARM メモリアクセス命令:P. 4-6
•
ARM 汎用データ処理命令:P. 4-23
•
ARM 乗算命令:P. 4-39
•
ARM 飽和演算命令:P. 4-55
•
ARM 分岐命令:P. 4-57
•
ARM コプロセッサ命令:P. 4-62
その他の ARM 命令:P. 4-71
ARM 擬似命令:P. 4-78
•
•
各命令を説明しているページ番号については、P. 4-2 表 4-1 を参照して下さい。疑似命
令の一覧は P. 4-78 を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-1
ARM 命令について
表 4-1 各 ARM 命令のページ番号
ニーモニック
概要
ページ
アーキテクチャa
ADC, ADD
キャリー付き加算、加算
P. 4-27
全て
AND
論理積
P. 4-30
全て
B
分岐
P. 4-58
全て
BIC
ビットクリア
P. 4-30
全て
BKPT
ブレークポイント
P. 4-76
5
BL
リンク付き分岐
P. 4-58
全て
BLX
リンク付き分岐、状態変更
P. 4-60
5Tb
BX
分岐、状態変更
P. 4-59
4Tb
CDP, CDP2
コプロセッサデータ演算
P. 4-63
2, 5
CLZ
先行ゼロカウント
P. 4-38
5
CMN, CMP
負数比較、比較
P. 4-34
全て
EOR
排他的論理和
P. 4-30
全て
LDC, LDC2
コプロセッサロード
P. 4-67、
P. 4-69
2, 5
LDM
多重レジスタロード
P. 4-18
全て
LDR
レジスタロード
P. 4-6
全て
MAR
レジスタから 40 ビット累算器への移動
P. 4-77
XScalec
MCR, MCR2, MCRR
レジスタからコプロセッサへの移動
P. 4-64
2, 5, 5Ed
MIA, MIAPH, MIAxy
内部 40 ビット積和
P. 4-53
XScale
MLA
積和演算
P. 4-40
2
MOV
移動
P. 4-32
全て
MRA
40 ビット累算器からレジスタへの移動
P. 4-77
XScale
MRC, MRC2
コプロセッサからレジスタへの移動
P. 4-65
2, 5
MRRC
コプロセッサから 2 レジスタへの移動
P. 4-66
5Ed
MRS
PSR からレジスタへの移動
P. 4-73
3
MSR
レジスタから PSR への移動
P. 4-74
3
4-2
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
表 4-1 各 ARM 命令のページ番号(続き)
命令のページ番号(続き)
ニーモニック
概要
ページ
アーキテクチャa
MUL
乗算
P. 4-40
2
MVN
1 の補数の移動
P. 4-32
全て
ORR
論理和
P. 4-30
全て
PLD
キャッシュプリロード
P. 4-20
5Ed
QADD, QDADD, QDSUB, QSUB
飽和演算
P. 4-55
5ExPe
RSB, RSC, SBC
逆減算、キャリー付き逆減算、キャリー付き減算 P. 4-27
SMLAL
符号付き積和演算(64 <= 32 x 32 + 64)
P. 4-42
Mf
SMLALxy
符号付き積和演算(64 <= 16 x 16 + 64)
P. 4-51
5ExPe
SMLAWy
符号付き積和演算(32 <= 16 x 32 +32)
P. 4-49
5ExPe
SMLAxy
符号付き積和演算(32 <= 16 x 16 +32)
P. 4-46
5ExPe
SMULL
符号付き乗算(64 <= 32 x 32)
P. 4-42
Mf
SMULWy
符号付き乗算(32 <= 32 x 16)
P. 4-48
5ExPe
SMULxy
符号付き乗算(32 <= 16 x 16)
P. 4-44
5ExPe
STC, STC2
コプロセッサストア
P. 4-67、
P. 4-69
2, 5ExPe
STM
多重レジスタストア
P. 4-18
全て
STR
レジスタストア
P. 4-6
全て
SUB
減算
P. 4-27
全て
SWI
ソフトウェア割り込み
P. 4-72
全て
SWP
レジスタとメモリ間のスワップ
P. 4-22
3
TEQ, TST
等価テスト、テスト
P. 4-36
全て
UMLAL, UMULL
符号なし MLA、MUL(64 <= 32 x 32 (+ 64))
P. 4-42
Mf
a.
b.
c.
d.
e.
f.
全て
n:ARM アーキテクチャバージョン n 以上で使用可
nT:ARM アーキテクチャバージョン n 以上の T バリアントで使用可
XScale:XScale コプロセッサ命令
nE:ARM アーキテクチャバージョン n 以上の E バリアントで使用可(ただし ExP バリアントを除く)
nE:ARM アーキテクチャバージョン n 以上の全ての E バリアントで使用可(ExP バリアントを含む)
M:ARM アーキテクチャバージョン 3M および 4 以上で使用可(ただし、xM バージョンを除く)
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-3
ARM 命令について
4.1
条件付き実行
ほぼ全ての ARM 命令に任意の条件コードを含めることができます。構文では {cond}
で表します。条件コードが指定されている命令は、CPSR の条件コードフラグが指定し
た条件を満たしている場合にのみ実行されます。表 4-2 は、使用可能な条件コードを示
しています。
表 4-2 ARM 条件コード
接尾文字
フラグ
意味
EQ
Z セット
等
NE
Z クリア
不等
CS/HS
C セット
以上(符号なし >=)
CC/LO
C クリア
未満(符号なし <)
MI
N セット
負
PL
N クリア
正またはゼロ
VS
V セット
オーバフロー
VC
V クリア
オーバフローなし
HI
C セットかつ Z クリア
より大きい(符号なし >)
LS
C クリア、Z セット
以下(符号なし <=)
GE
N と V は等しい
符号付き >=
LT
N と V は等しくない
符号付き <
GT
Z クリア、かつ N と V が等しい
符号付き >
LE
Z セット、または N と V が等しくない 符号付き <=
AL
任意
常に(通常は省略)
ほぼ全ての ARM データ処理命令は、その結果に従って条件コードフラグを任意に更新
することができます。命令にフラグを更新させるには、各命令の構文が示すように接
尾文字 S を付けます。
一部の命令(CMP、CMN、TST、TEQ)には、接尾文字 S を指定する必要はありません。
これらの命令の唯一の機能がフラグの更新であるためです。これらの命令を使用する
と、条件コードフラグが必ず更新されます。
フラグは更新されるまで保持されます。実行されない条件付き命令はフラグに作用し
ません。
4-4
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
フラグの一部を更新する命令もありますが、これらの命令によって他のフラグが変更
されることはありません。詳細については、各命令の説明を参照して下さい。
命令は、別の命令でセットしたフラグに基づいて、以下のどちらかで条件付きで実行
することができます。
•
フラグを更新する命令の直後
•
フラグを更新しない命令を任意の数実行した後
詳細については、P. 2-20「条件付き実行」を参照して下さい。
4.1.1
Q フラグ
Q フラグは、ARM アーキテクチャ v5 以上の E バリアントにのみ存在します。このフ
ラグは、特別な飽和算術命令での飽和の検出(P. 4-55「QADD、QSUB、QDADD、QDSUB」
参照)、または特定の乗算命令でのオーバフローの検出(P. 4-46「SMLAxy」および P. 4-49
「SMLAWy」参照)に使用します。
Q フラグはスティッキーフラグです。上記の命令で Q フラグをセットすることはでき
ても、クリアすることはできません。こうした一連の命令を実行した後でフラグをテ
ストすると、命令の実行中にどこかで飽和やオーバフローが発生しているかどうかを
検出することができるため、命令ごとにフラグをチェックしなくても済みます。
Q フラグをクリアするには、MSR 命令を使用します(P. 4-74「MSR」参照)。
Q フラグの状態を条件コードで直接テストすることはできません。Q フラグの状態を
読み出すには、MRS 命令を使用します(P. 4-73「MRS」参照)。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-5
ARM 命令について
4.2
ARM メモリアクセス命令
このセクションは以下のサブセクションから構成されています。
•
LDR と STR:ワードと符号なしバイト:P. 4-7
レジスタロード / ストア命令:32 ビットワードまたは 8 ビット符号なしバイト
•
LDR と STR:ハーフワードと符号付きバイト:P. 4-12
レジスタロード命令:符号付き 8 ビットバイト、符号付き / 符号なし 16 ビット
ハーフワード
レジスタストア命令:16 ビットハーフワード
•
LDR と STR:ダブルワード:P. 4-15
2 個の連続したレジスタのロード / ストア
•
LDM と STM:P. 4-18
多重レジスタロード / ストア
•
PLD:P. 4-20
キャッシュプリロード
•
SWP:P. 4-22
レジスタとメモリ間のデータスワップ
LDR 擬似命令もあります(P. 4-82「LDR ARM 疑似命令」を参照)。この疑似命令は、LDR
命令にアセンブルされる場合と、MOV 命令または MVN 命令にアセンブルされる場合が
あります。
4-6
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.2.1
LDR と STR:ワードと符号なしバイト
:ワードと符号なしバイト
レジスタロード / ストア命令による 32 ビットワードまたは 8 ビット符号なしバイトの
ロード / ストアについて説明します。バイトがロードされると、32 ビットにゼロ拡張
されます。
構文
LDR と STR には以下の 4 つの形式を使用できます。
•
•
•
•
ゼロオフセット
プレインデクスオフセット
プログラム相対
ポストインデクスオフセット
これら 4 形式の構文を、上記と同じ順番で以下に示します。
op{cond}{B}{T} Rd, [Rn]
op{cond}{B} Rd, [Rn, FlexOffset]{!}
op{cond}{B} Rd, label
op{cond}{B}{T} Rd, [Rn], FlexOffset
説明:
op
LDR(レジスタロード)または STR(レジスタストア)のどちらか。
cond
オプションの条件コード(P. 4-4「条件付き実行」参照)
B
オプションの接尾文字。B を指定すると、Rd の最下位バイトが転送され
ます。op が LDR の場合、Rd の他のバイトがクリアされます。
B を指定しなかった場合は、32 ビットワードが転送されます。
T
オプションの接尾文字。T を指定すると、特権モードであっても、メモ
リシステムはプロセッサがユーザモードであるかのようにアクセスを制
限します(P. 2-4「プロセッサモード」参照)。T はユーザモードでは作用
しません。プレインデクスオフセットと T を併用することはできません。
Rd
ロードまたはストアする ARM レジスタ
Rn
メモリアドレスのベースとなるレジスタ
以下の命令では、Rn に Rd と同じレジスタは使用できません。
•
•
•
ARM DUI0068BJ-00
プレインデクスオフセットとライトバック(接尾文字 !)を併用す
る命令
ポストインデクスオフセットを使用する命令
接尾文字 T を使用している命令
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-7
ARM 命令について
FlexOffset Rn の値に適用されるフレキシブルオフセット(P. 4-9「フレキシブルオフ
セットの構文」参照)。
label
プログラム相対式。詳細については、P. 3-23「レジスタ相対式とプログ
ラム相対式」を参照して下さい。
label は、現在の命令から ±4KB 以内に配置する必要があります。
!
オプションの接尾文字。! を指定すると、オフセットを含むアドレスが
Rn にライトバックされます。Rn が r15 の場合、接尾文字 ! は使用できま
せん。
ゼロオフセット
Rn の値は、転送に使用するアドレスとして使用されます。
プレインデクスオフセット
データ転送が実行される前に、オフセットが Rn の値に適用されます。この結果が転送
メモリアドレスとして使用されます。接尾文字 ! が使用されている場合、この結果は
Rnにライトバックされます。接尾文字 !を使用する場合は、Rn にr15は使用できません。
プログラム相対
プレインデクス形式の別バージョンです。アセンブラは PC からのオフセットを計算
し、PC を Rn としてプレインデクスされた命令を生成します。
接尾文字 ! は使用できません。
ポストインデクスオフセット
Rn の値が転送メモリアドレスとして使用されます。データ転送が実行された後に、オ
フセットが Rn の値に適用されます。この結果は Rn にライトバックされます。Rn に
r15 は使用できません。
4-8
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
フレキシブルオフセットの構文
プレインデクスオフセットおよびポストインデクスオフセットには、以下のどちらで
も使用することができます。
#expr
{-}Rm{, shift}
説明:
-
オプションのマイナス記号。- を指定すると、オフセットが Rn から引か
れます。- を指定していない場合は、オフセットが Rn に加算されます。
expr
-4095 ~ +4095 の整数を返す式。通常は数値定数になります(以下の例
を参照)。
Rm
オフセットとして使用される値を保持するレジスタ。Rm に r15 は使用で
きません。
shift
Rm に適用されるオプションのシフト。以下のいずれかになります。
ASR n
n ビット右算術シフト。1 ≤ n ≤ 32
LSL n
n ビット左論理シフト。0 ≤ n ≤ 31
LSR n
n ビット右論理シフト。1 ≤ n ≤ 32
ROR n
RRX
ARM DUI0068BJ-00
n ビット右ロテート。1 ≤ n ≤ 31
1 ビット右ロテート(拡張あり)。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-9
ARM 命令について
ワード転送に使用するアドレスのアライメント
ほとんどの場合、32 ビット転送に使用するアドレスは 32 ビットワード境界整列にする
必要があります。
システムにシステムコプロセッサ(cp15)が存在する場合には、アライメントチェッ
クをイネーブルできます。アライメントチェックをイネーブルにした場合、非ワード
境界整列の 32 ビット転送が行われるとアライメント例外が発生します。
システムにシステムコプロセッサ(cp15)が存在しない場合、あるいはアライメント
チェックがディセーブルされている場合は、以下のようになります。
•
STR では、指定したアドレスが縮小され、4 の倍数に丸められる。
•
LDR の場合:
1.
指定したアドレスが縮小され、4 の倍数に丸められます。
2.
求められたアドレスから 4 バイトのデータがロードされます。
3.
ロードされたデータは、そのアドレスのビット [1:0] に応じて、1 バイト、
2 バイト、あるいは 3 バイト右にロテートされます。
リトルエンディアンメモリシステムの場合は、これによってアドレス指定された
バイトがレジスタの最下位バイトに配置されます。
ビッグエンディアンメモリシステムの場合、アドレス指定されたバイトが以下に
配置されます。
—
ビット [31:24](アドレスのビット [0] が 0 の場合)
—
ビット [15:8](アドレスのビット [0] が 1 の場合)
r15 へのロード
r15(プログラムカウンタ)にアドレスがロードされると、ロードされたアドレスにあ
る命令に分岐します。
ロードされた値のビット [1:0] は以下のようになります。
•
ARM アーキテクチャ v3 以上では無視される。
•
ARM アーキテクチャ v4 では必ずゼロ。
ARM アーキテクチャ v5 以上では、以下のようになります。
•
r15 にロードされた値のビット [1:0] が値 0b10 を保持することはできない。
•
r15 にロードされた値のビット [0] がセットされると、プロセッサは Thumb 状態
に変更される。
r15 にロードする場合、接尾文字 B または T を使用できません。
4-10
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
r15 からのストア
r15 からのストアはできるだけ行わないようにして下さい。
r15 からのストアを行うと、ストアされる値は現在の命令のアドレス + 実装定義の定数
になります。特定のプロセッサに対しては、定数は常に同じです。
アセンブルしたコードを異なるプロセッサで使用する可能性がある場合は、以下のよ
うなコードを使用するとランタイムに定数を確認できます。
SUB
STR
LDR
SUB
R1,
PC,
R0,
R0,
PC, #4
[R0]
[R0]
R0, R1
;
;
;
;
R1 = address of following STR instruction
Store address of STR instruction + offset,
then reload it
Calculate the offset as the difference
コードを特定のプロセッサ向けにアセンブルする場合、armasm では定数の値を
{PCSTOREOFFSET} として使用できます。
アーキテクチャ
上記の命令は、ARM アーキテクチャの全バージョンで使用できます。
ARM アーキテクチャ v5 以上の T バリアントでは、r15 へのロードが実行された場合、
ロードされた値のビット [0] がセットされていると、Thumb 状態になります。
例
LDR
r8,[r10]
; loads r8 from the address in r10.
LDRNE
r2,[r5,#960]!
; (conditionally) loads r2 from a word
; 960 bytes above the address in r5, and
; increments r5 by 960.
STR
r2,[r9,#consta-struc]
STRB
r0,[r3,-r8,ASR #2]
;
;
;
;
STR
r5,[r7],#-8
; stores a word from r5 to the address
; in r7, and then decrements r7 by 8.
LDR
r0,localdata
; loads a word located at label localdata
ARM DUI0068BJ-00
; consta-struc is an expression evaluating
; to a constant in the range 0-4095.
stores the least significant byte from
r0 to a byte at an address equal to
contents(r3) minus contents(r8)/4.
r3 and r8 are not altered.
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-11
ARM 命令について
4.2.2
LDR と STR:ハーフワードと符号付きバイト
:ハーフワードと符号付きバイト
ロードレジスタ命令による符号付き 8 ビットバイトおよび符号付き / 符号なし 16 ビッ
トハーフワードのロードについて説明します。
また、ストアレジスタ命令による 16 ビットハーフワードのストアについても説明し
ます。
符号付きの値がロードされると、32 ビットに符号拡張されます。符号なしハーフワー
ドがロードされると、32 ビットにゼロ拡張されます。
構文
これらの命令には、以下の 4 形式が使用できます。
•
•
•
•
ゼロオフセット
プレインデクスオフセット
プログラム相対
ポストインデクスオフセット
4 形式の構文を、上記と同じ順番で以下に示します。
op{cond}type Rd, [Rn]
op{cond}type Rd, [Rn, Offset]{!}
op{cond}type Rd, label
op{cond}type Rd, [Rn], Offset
説明:
op
LDR または STR のいずれか。
cond
オプションの条件コード(P. 4-4「条件付き実行」参照)。
type
以下のいずれかになります。
SH
符号付きハーフワード(LDR のみ)
H
符号なしハーフワード
SB
符号付きバイト(LDR のみ)
Rd
ロードまたはストアする ARM レジスタ
Rn
メモリアドレスが基準にするレジスタ
以下の命令では、Rd と同じ値は使用できません。
•
•
4-12
プレインデクストオフセットとライトバックを併用使用した命令
ポストインデクスオフセットを使用した命令
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
label
プログラム相対式。詳細については、P. 3-23「レジスタ相対式とプログ
ラム相対式」を参照して下さい。label は、現在の命令から ±255 バイ
ト以内に配置する必要があります。
Offset
Rn の値に適用されるオフセット(「オフセットの構文」参照)
!
オプションの接尾文字。! を指定すると、オフセットを含むアドレスが
Rn にライトバックされます。Rn が r15 の場合、接尾文字 ! は使用できま
せん。
ゼロオフセット
Rn の値は、転送アドレスとして使用されます。
プレインデクスオフセット
転送が実行される前に、オフセットが Rn の値に適用されます。結果は、転送メモリア
ドレスとして使用されます。接尾文字 ! が使用されている場合、結果が Rn にライト
バックされます。
プログラム相対
プレインデクス形式の別バージョンです。アセンブラは PC からのオフセットを計算
し、PC を Rn としてプレインデクスされた命令を生成します。
接尾文字 ! は使用できません。
ポストインデクスオフセット
Rn の値は、転送メモリアドレスとして使用されます。転送が実行された後に、オフセッ
トが Rn の値に適用されます。結果は Rn にライトバックされます。
オフセットの構文
プレインデクスオフセットおよびポストインデクスオフセットには、以下のどちらの
構文でも使用することができます。
#expr
{-}Rm
説明:
オプションのマイナス符号。- を指定すると、オフセットが Rn から引か
れます。- を指定していない場合は、オフセットが Rn に加算されます。
-
expr
ARM DUI0068BJ-00
-255 ~ +255 の整数の結果を返す式です。通常は数値定数を使用します
(以下の例を参照)。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-13
ARM 命令について
オフセットとして使用される値を保持するレジスタを指定します。
Rm
オフセットの構文は、P. 4-15「LDR と STR:ダブルワード」と同じです。
ハーフワード転送に使用するアドレスのアライメント
ハーフワード転送では、アドレスが偶数でなければなりません。
システムにシステムコプロセッサ(cp15)が存在する場合には、アライメントチェッ
クをイネーブルすることができます。アライメントチェックをイネーブルにした場合
に、非ハーフワード境界整列の 16 ビット転送が行われると、アライメント例外が発生
します。
システムにシステムコプロセッサ(cp15)が存在しない場合、あるいはアライメント
チェックをディセーブルした場合には、以下のようになります。
•
非ハーフワード境界整列の 16 ビットがロードされると、Rd が更新される。
•
非ハーフワード境界整列の 16 ビットがストアされると、[address] と [address-1]
の 2 バイトが更新される。
r15 へのロード
r15 にはハーフワードもバイトもロードできません。
アーキテクチャ
上記の命令は、ARM アーキテクチャ v4 以上で使用できます。
例
LDREQSH r11,[r6]
; (conditionally) loads r11 with a 16-bit halfword
; from the address in r6. Sign extends to 32 bits.
LDRH
r1,[r0,#22]
; load r1 with a 16 bit halfword from 22 bytes
; above the address in r0. Zero extend to 32 bits.
STRH
r4,[r0,r1]!
; store the least significant halfword from r4
; to two bytes at an address equal to contents(r0)
; plus contents(r1). Write address back into r0.
LDRSB
r6,constf
; load a byte located at label constf. Sign extend.
誤用例
LDRSB
4-14
r1,[r6],r3,LSL#4
; This format is only available for word and
; unsigned byte transfers.
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.2.3
LDR と STR:ダブルワード
:ダブルワード
2 つの連続レジスタを使用した 64 ビットダブルワードのロード / ストアについて説明
します。
構文
これらの命令には、以下の 4 形式を使用できます。
•
•
•
•
ゼロオフセット
プレインデクスオフセット
プログラム相対
ポストインデクスオフセット
この 4 形式の構文を、上の順番と同じ順番で以下に示します。
op{cond}D Rd, [Rn]
op{cond}D Rd, [Rn, Offset]{!}
op{cond}D Rd, label
op{cond}D Rd, [Rn], Offset
説明:
op
LDR または STR のどちらか。
cond
オプションの条件コード(P. 4-4「条件付き実行」参照)
Rd
ロードまたはストアする 2 つの ARM レジスタの 1 つ。もう一方のレジ
スタは R(d+1) と記述します。Rd には r14 以外の偶数番号のレジスタ
を指定する必要があります。
Rn
メモリアドレスのベースとなるレジスタ
命令が以下になる場合を除き、このオプションに Rd または R(d+1) と
同じ値を使用することはできません。
•
ゼロオフセットを使用する命令
•
プレインデクスオフセットをライトバックしないで使用する命令
Offset
Rn の値に適用されるオフセット(P. 4-16「オフセットの構文」参照)
label
プログラム相対式。詳細については、P. 3-23「レジスタ相対式とプログ
ラム相対式」を参照して下さい。
label は現在の命令から ±252 バイト以内に配置する必要があります。
!
ARM DUI0068BJ-00
オプションの接尾文字。! を指定すると、オフセットを含む最終アドレ
スが Rn にライトバックされます。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-15
ARM 命令について
ゼロオフセット
Rn の値は、転送アドレスとして使用されます。
プレインデクスオフセット
転送が実行される前に、オフセットが Rn の値に適用されます。この結果は、転送メモ
リアドレスとして使用されます。接尾文字 ! が指定されている場合は、このアドレス
が Rn にライトバックされます。
プログラム相対
プレインデクス形式の別バージョンです。アセンブラは PC からのオフセットを計算
し、PC を Rn としてプレインデクスされた命令を生成します。
接尾文字 ! は使用できません。
ポストインデクスオフセット
Rn の値は、転送メモリアドレスとして使用されます。転送が実行された後に、オフセッ
トが Rn の値に適用されます。結果は Rn にライトバックされます。
オフセットの構文
プレインデクスオフセットおよびポストインデクスオフセットには、以下のどちらの
構文でも使用できます。
#expr
{-}Rm
説明:
-
オプションのマイナス符号。- を指定すると、オフセットが Rn から引か
れます。- を指定していない場合は、オフセットが Rn に加算されます。
expr
-255 ~ +255 の整数を返す式を指定します。通常は数値定数を使用しま
す(以下の例を参照)。
Rm
オフセットとして使用される値を保持するレジスタ。ロードを実行する
場合、Rm に Rd または R(d+1) と同じレジスタを使用することはできま
せん。
このオフセット構文は、P. 4-12「LDR と STR:ハーフワードと符号付きバイト」で示
した構文と同じです。
アドレスのアライメント
ダブルワード転送では、8 の倍数となるアドレスを指定する必要があります。
4-16
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
システムにシステムコプロセッサが存在する場合には、アライメントチェックをイ
ネーブルすることができます。アライメントチェックをイネーブルした場合、非ダブ
ルワード境界整列の 64 ビット転送が行われると、アライメント例外が発生します。
アーキテクチャ
これらの命令は、ARM アーキテクチャ v5 以上の E バリアントで使用できます。
例
LDRD
LDRMID
STRD
STRD
LDREQD
r6,[r11]
r4,[r7],r2
r4,[r9,#24]
r0,[r9,-r2]!
r8,abc4
誤用例
LDRD
STRD
STRD
ARM DUI0068BJ-00
r1,[r6]
r14,[r9,#36]
r2,[r3],r6
; Rd must be even.
; Rd must not be r14.
; Rn must not be Rd or R(d+1).
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-17
ARM 命令について
4.2.4
LDM と STM
多重レジスタをロード / ストアします。レジスタ r0 ~ r15 の任意の組み合わせを転送
することができます。
構文
op{cond}mode Rn{!}, reglist{^}
説明:
4-18
op
LDM または STM のどちらかを指定します。
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
mode
以下のいずれかを指定します。
IA
毎転送後にアドレスをインクリメントします。
IB
毎転送前にアドレスをインクリメントします。
DA
毎転送後にアドレスをデクリメントします。
DB
毎転送前にアドレスをデクリメントします。
FD
フル下降スタック
ED
空下降スタック
FA
フル上昇スタック
EA
空上昇スタック
Rn
ベースレジスタ。転送に使用する初期アドレスを保持する ARM レジス
タです。Rn に r15 は使用できません。
!
オプションの接尾文字。! を指定すると、最終アドレスが Rn にライト
バックされます。
reglist
ロードまたはストアするレジスタのリストを括弧で囲んで指定します。
レジスタ範囲を含めることもできます。複数のレジスタまたはレジスタ
範囲を指定する場合は、カンマで区切る必要があります(P. 4-19「例」
参照)。
^
オプションの接尾文字を指定します。ユーザモードまたはシステムモー
ドでは使用できません。この接尾文字には以下の 2 つの目的があります。
•
通常の多重レジスタ転送に加え、op が LDM で reglist に pc (r15)
が含まれている場合に、SPSR が CPSR にコピーされます。これは
例外ハンドラから戻るためです。したがって、この接尾文字は必
ず例外モードから使用して下さい。
•
上記以外の場合、現在のモードのレジスタではなく、ユーザモー
ドのレジスタとのデータ転送が実行されます。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
非ワード境界整列アドレス
これらの命令は、非ワード境界整列アドレスのビット [1:0] を無視します(システムコ
プロセッサ搭載システムでは、アライメントチェックがイネーブルされている場合に、
これらのビットにゼロ以外の値がセットされるとアライメント例外が発生します)。
r15 へのロード
r15(プログラムカウンタ)へのロードが行われると、ロードされたアドレスにある命
令への分岐が発生します。ARM アーキテクチャ v5 以上の T バリアントでは、r15 に
ロードされた値のビット [0] がセットされていると、このロードによって Thumb 状態
になります。
ライトバックを使用したベースレジスタのロードまたはストア
Rn が reglist 内に含まれ、接尾文字 ! でライトバックが指定されている場合:
•
•
op が STM で、Rn が reglist 内で最も番号の小さいレジスタの場合、Rn の初
期値がストアされます。
上記以外の場合、ロードまたはストアされる Rn の値は予測不能です。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全バージョンで使用できます。
ARM アーキテクチャ v5 以上の T バリアントでは、r15 にロードされる値のビット [0]
がセットされていると、このロードによって Thumb 状態になります。
例
LDMIA
STMDB
STMFD
LDMFD
r8,{r0,r2,r9}
r1!,{r3-r6,r11,r12}
r13!,{r0,r4-r7,LR} ;
;
r13!,{r0,r4-r7,PC} ;
;
Push registers including the
stack pointer
Pop the same registers and
return from subroutine
誤用例
STMIA
LDMDA
ARM DUI0068BJ-00
r5!,{r5,r4,r9} ; value stored for r5 unpredictable
r2, {}
; must be at least one register in list
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-19
ARM 命令について
4.2.5
PLD
キャッシュプリロード命令です。
構文
PLD [Rn{, FlexOffset}]
説明:
メモリアドレスのベースとなるレジスタを指定します。
Rn
FlexOffset Rn の値に適用されるオプションのフレキシブルオフセットを指定しま
す。
FlexOffset には以下のどちらでも使用できます。
#expr
{-}Rm{, shift}
上記において:
オプションのマイナス符号。- を指定すると、オフセットが
Rn から引かれます。- を指定していない場合は、オフセットが
Rn に加算されます。
expr
Rm
shift
-4095 ~ +4095 の整数を返す式を指定します。通常は数値定数
を使用します。
オフセットとして使用される値を保持するレジスタを指定し
ます。
Rm に適用されるオプションのシフトを指定します。以下のい
ずれかを指定することができます。
ASR n
n ビット算術右シフト。1 ≤ n ≤ 32
LSL n
n ビット論理左シフト。0 ≤ n ≤ 31
LSR n
n ビット論理右シフト。1 ≤ n ≤ 32
ROR n
RRX
n ビット右ロテート。1 ≤ n ≤ 31
1 ビット右ロテート(拡張あり)。
この構文は、P. 4-7「LDR と STR:ワードと符号なしバイト」の構文と同
じです。
4-20
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
用法
PLD 命令を使用することで、次の数命令の間に、指定されたアドレスからのロードがあ
りそうなことをメモリシステムに伝えることができます。メモリシステムはこの情報
を元に、その後のメモリアクセス速度を上げることができます。
アライメント
アドレスに対するアライメントの制約条件はありません。システム制御コプロセッサ
(cp15)がある場合でも、PLD 命令に対してアライメント例外が発生することはありま
せん。
アーキテクチャ
これらの命令は、ARM アーキテクチャ v5 以上のバリアント E で使用できます。
例
PLD
PLD
PLD
PLD
[r2]
[r15,#280]
[r9,#-2481]
[r0,#av*4] ; av * 4 must evaluate, at assembly time, to
; an integer in the range -4095 to +4095
PLD [r0,r2]
PLD [r5,r8,LSL 2]
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-21
ARM 命令について
4.2.6
SWP
レジスタとメモリ間でデータをスワップします。
SWP はセマフォの実装に使用します。
構文
SWP{cond}{B} Rd, Rm, [Rn]
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
B
オプションの接尾文字です。B を指定すると、1 バイトがスワップされま
す。B を指定しない場合は、32 ビットワードがスワップされます。
Rd
ARM レジスタを指定します。メモリからのデータが Rd にロードされ
ます。
Rm
ARM レジスタを指定します。Rm の内容がメモリにストアされます。
Rm には Rd と同じレジスタを使用することができます。この場合、このレ
ジスタの内容がメモリ位置の内容とスワップされます。
Rn
ARM レジスタを指定します。Rn の内容は、スワップされるデータがあ
るメモリのアドレスを示します。Rn には、Rd と Rm のどちらとも異なる
レジスタを指定する必要があります。
非ワード境界整列アドレス
非ワード境界整列アドレスは、LDR 命令および STR 命令と全く同じ方法で処理されま
す(P. 4-10「ワード転送に使用するアドレスのアライメント」参照)。
アーキテクチャ
これらの命令は、ARM アーキテクチャ v2a と v3 以上で使用できます。
4-22
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.3
ARM 汎用データ処理命令
このセクションは以下のサブセクションから構成されています。
•
フレキシブル第 2 オペランド:P. 4-24
•
ADD、SUB、RSB、ADC、SBC、RSC:P. 4-27
キャリー付きまたはキャリーなしの加算、減算、逆減算
•
AND、ORR、EOR、BIC:P. 4-30
論理積、論理和、排他的論理和、ビットクリア
•
MOV と MVN:P. 4-32
移動および 1 つの補数の移動
•
CMP と CMN:P. 4-34
比較および負数比較
•
TST と TEQ:P. 4-36
テストおよび等価テスト
•
CLZ:P. 4-38
先行ゼロカウント
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-23
ARM 命令について
4.3.1
フレキシブル第 2 オペランド
汎用 ARM データ処理命令のほとんどに、フレキシブル第 2 オペランドを使用すること
ができます。このオペランドは、各命令構文で「Operand2」と表記しています。
構文
Operand2 には以下の形式を使用することができます。
#immed_8r
Rm{, shift}
説明:
immed_8r
数値定数を求める式を指定します。この定数は、32 ビットワード内の偶
数ビット数でロテートされた 8 ビットパターンに対応している必要があ
ります(P. 4-26「命令置換」を参照)。
Rm
第 2 オペランドのデータを保持する ARM レジスタを指定します。レジス
タのビットパターンは、様々な方法でシフトまたはロテートできます。
shift
Rm に適用されるオプションのシフトを指定します。以下のシフトを使用
することができます。
ASR n
n ビット算術右シフト。1 ≤ n ≤ 32
LSL n
n ビット論理左シフト。0 ≤ n ≤ 31
LSR n
n ビット論理右シフト。1 ≤ n ≤ 32
ROR n
n ビット右ロテート。1 ≤ n ≤ 31
1 ビット右ロテート(拡張あり)
RRX
type Rs 上記において:
type
ASR、LSL、LSR、ROR のいずれかを指定します。
Rs
シフト量を渡す ARM レジスタを指定します。最下
位バイトのみが使用されます。
注
シフト演算の結果は、命令で Operand2 として使用されますが、Rm 自
体は変更されません。
4-24
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
ASR
Rm の内容が 2 の補数の符号付き整数とみなされる場合、n ビットの算術右シフトに
よって Rm の値が 2n で除算されます。元のビット [31] はレジスタの左 n ビットにコピー
されます。
LSR と LSL
Rm の内容が符号なし整数とみなされる場合、n ビットの論理右シフトによって Rm の値
が 2n で除算されます。レジスタの左 n ビットには 0 がセットされます。
Rm の内容が符号なし整数とみなされる場合、n ビットの論理左シフトによって Rm の値
に 2n が乗算されます。このとき警告なしでオーバフローが発生する場合があります。
レジスタの右 n ビットには 0 がセットされます。
ROR
n ビットの右ロテートにより、レジスタの右 n ビットが結果の左 n ビットに移動します。
同時に、他の全てのビットが n ビット分右に移動します(図 4-1 参照)。
図 4-1 ROR
RRX
拡張シフト右ロテートでは、Rm の内容が 1 ビットずつ右にシフトします。キャリーフ
ラグは Rm のビット [31] にコピーされます(P. 4-26 図 4-2 参照)。
接尾文字 S が指定されている場合は、Rm のビット [0] の元の値がキャリーフラグにシ
フトアウトされます(P. 4-26「キャリーフラグ」参照)。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-25
ARM 命令について
図 4-2 RRX
キャリーフラグ
以下の命令の場合、キャリーフラグは Rm からシフトアウトされた最後のビットに更新
されます。
•
接尾文字 S を指定した MOV、MVN、AND、ORR、EOR、BIC
•
TEQ または TST(この命令には接尾文字 S は不要です)
命令置換
特定の命令対(ADD と SUB、ADC と SBC、AND と BIC、MOV と MVN、CMP と CMN)は、
immed_8r の否定または論理反転を除いて等価です。
論理反転または否定で表す場合を除き、immed_8r の値をロテートされる 8 ビットパ
タンで表現できない場合は、アセンブラは対になっているもう一方の命令に置換し、
immed_8r を反転または否定します。
逆アセンブリリストとソースコードを比較する場合は、この点に注意して下さい。
例
ADD
AND
SUB
MOVS
r3,r7,#1020
r0,r5,r2
r11,r12,r3,ASR #5
r4,r4, LSR #32
;
;
;
;
immed_8r. 1020 is 0xFF rotated right by 30 bits.
r2 contains the data for Operand2.
Operand2 is the contents of r3 divided by 32.
Updates the C flag to r4 bit 31. Clears r4 to 0.
;
;
;
;
1023 (0x3FF) is not a rotated 8-bit pattern.
#32 is out of range for LSL.
Do not specify a shift amount for RRX. RRX is
always a one-bit shift.
誤用例
ADD
SUB
MOVS
4-26
r3,r7,#1023
r11,r12,r3,LSL #32
r4,r4,RRX #3
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.3.2
ADD、
、SUB、
、RSB、
、ADC、
、SBC、
、RSC
キャリー付きまたはキャリーなしの加算、減算、逆減算を実行します。
構文
op{cond}{S} Rd, Rn, Operand2
説明:
op
ADD、SUB、RSB、ADC、SBC、RSC のいずれかを指定します。
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)
。
S
オプションの接尾文字です。S を指定すると、条件コードフラグが演算
結果に基づいて更新されます(P. 4-4「条件付き実行」参照)。
Rd
結果を保持する ARM レジスタを指定します。
Rn
第 1 オペランドを保持する ARM レジスタを指定します。
Operand2
フレキシブル第 2 オペランドを指定します。オプションの詳細について
は、P. 4-24「フレキシブル第 2 オペランド」を参照して下さい。
用法
ADD 命令は、Rn と Operand2 の値を加算します。
SUB 命令は、Rn の値から Operand2 の値を減算します。
RSB(Reverse SuBtract:逆減算)命令は、Operand2 の値から Rn の値を減算します。
Operand2 に様々なオプションを使用することで、この命令を効果的に使用することが
できます。
ADC、SBC、RSC は、マルチワード演算の同期化に使用します(P. 4-28「マルチワード
演算の例」参照)。
ADC(ADd with Carry:キャリー付き加算)命令は、Rn の値と Operand2 の値をキャリー
フラグと一緒に加算します。
SBC(SuBtract with Carry:キャリー付き減算)命令は、Rn の値から Operand2 の値を減
算します。キャリーフラグがクリアされている場合、結果から 1 が引かれます。
RSC(Reverse SuBtract with Carry:キャリー付き逆減算)命令は、Operand2 の値から
Rn の値を減算します。キャリーフラグがクリアされている場合、結果から 1 が引かれ
ます。
状況によっては、アセンブリがある命令を別の命令に置換する場合があります。逆ア
センブリリストを見るときには、この点に注意して下さい。詳細については、P. 4-26
「命令置換」を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-27
ARM 命令について
条件フラグ
S が指定されている場合、これらの命令は演算結果に基づいて N、Z、C、V フラグを更
新します。
r15 の使用
Rn に r15 を指定している場合、使用される値は命令のアドレス +8 になります。
Rd に r15 を指定した場合:
•
•
演算結果に対応するアドレスに分岐を実行します。
接尾文字 S を指定している場合、現在のモードの SPSR が CPSR にコピーされま
す。これを使用して、例外から復帰することができます(ADS デベロッパガイド
の「プロセッサ例外処理」を参照して下さい)。
注意
ユーザモードまたはシステムモードで Rd に r15 を使用する場合は、接尾文字 S を使用
しないで下さい。このような命令による影響は予測不能である上、アセンブラはアセ
ンブリ時に警告を生成しません。
レジスタ制御シフトを使用するデータ処理命令では、Rd またはどのオペランドにも r15
を使用できません(P. 4-24「フレキシブル第 2 オペランド」参照)。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全バージョンで使用できます。
例
ADD
SUBS
RSB
ADCHI
RSCLES
r2,r1,r3
r8,r6,#240
r4,r4,#1280
r11,r0,r3
;
;
;
;
r0,r5,r0,LSL r4 ;
sets the flags on the result
subtracts contents of r4 from 1280
only executed if C flag set and Z
flag clear
conditional, flags set
r0,r15,r0,LSL r4
; r15 not allowed with register
; controlled shift
誤用例
RSCLES
マルチワード演算の例
以下の 2 つの命令は、r2 と r3 で保持している 64 ビット整数を r0 と r1 で保持して
いる別の 64 ビット整数に加算し、計算結果を r4 と r5 に返します。
4-28
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
ADDS
ADC
r4,r0,r2
r5,r1,r3
; adding the least significant words
; adding the most significant words
以下の命令は、一方の 96 ビット整数を他方の値から減算します。
SUBS
SBCS
SBC
r3,r6,r9
r4,r7,r10
r5,r8,r11
わかりやすくするため、上記の例ではマルチワード値に連続したレジスタを使用して
いますが、必ずしもそうする必要はありません。例えば、以下のように記述すること
もできます。
SUBS
SBCS
SBC
ARM DUI0068BJ-00
r6,r6,r9
r9,r2,r1
r2,r8,r11
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-29
ARM 命令について
4.3.3
AND、
、ORR、
、EOR、
、BIC
論理積、論理和、排他的論理和、ビットクリアを実行します。
構文
op{cond}{S} Rd, Rn, Operand2
説明:
op
AND、ORR、EOR、BIC のいずれかを指定します。
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
S
オプションの接尾文字です。S を指定すると、条件コードフラグが演算
結果に基づいて更新されます(P. 4-4「条件付き実行」参照)。
Rd
結果を保持する ARM レジスタを指定します。
Rn
第 1 オペランドを保持する ARM レジスタを指定します。
Operand2
フレキシブル第 2 オペランドを指定します。このオプションの詳細につ
いては、P. 4-24「フレキシブル第 2 オペランド」を参照して下さい。
用法
AND、EOR、ORR の各命令は、Rn と Operand2 の値に対し、それぞれビットごとの論理
積演算、排他的論理和演算、論理和演算を実行します。
BIC(BIt Clear:ビットクリア)命令は、Rn のビットと、Operand2 の値の対応ビット
の補数との論理積演算を実行します。
状況によっては、アセンブラが AND を BIC に、または BIC を AND に置換する場合が
あります。逆アセンブリリストを見るときは、この点に注意して下さい。詳細につい
ては、P. 4-26「命令置換」を参照して下さい。
条件フラグ
S が指定されている場合、これらの命令は:
4-30
•
結果に応じて N フラグおよび Z フラグを更新します。
•
Operand2 の計算中に C フラグを更新することができます(P. 4-24「フレキシブ
ル第 2 オペランド」参照)。
•
V フラグを変更しません。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
r15 の使用
Rn に r15 を指定している場合、使用される値は命令のアドレス +8 となります。
Rd に r15 を指定した場合:
•
•
結果に対応するアドレスへの分岐を実行します。
接尾文字 S を指定している場合、現在のモードの SPSR が CPSR にコピーされま
す。これを使用して、例外から復帰することができます(ADS デベロッパガイド
の「プロセッサ例外処理」を参照して下さい)。
注意
ユーザモードまたはシステムモードで Rd に r15 を使用する場合は、接尾文字 S を使用
しないで下さい。このような命令による影響は予測不能である上、アセンブラはアセ
ンブリ時に警告を生成しません。
レジスタ制御シフトを使用するデータ処理命令では、Rd またはどのオペランドにも r15
を使用することはできません(P. 4-24「フレキシブル第 2 オペランド」参照)。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全バージョンで使用できます。
例
AND
ORREQ
EORS
BICNES
r9,r2,#0xFF00
r2,r0,r5
r0,r0,r3,ROR r6
r8,r10,r0,RRX
誤用例
EORS
ARM DUI0068BJ-00
r0,r15,r3,ROR r6
; r15 not allowed with register
; controlled shift
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-31
ARM 命令について
4.3.4
MOV と MVN
移動および 1 つの補数の移動を実行します。
構文
MOV{cond}{S} Rd, Operand2
MVN{cond}{S} Rd, Operand2
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
S
オプションの接尾文字です。S を指定すると、条件コードフラグが演算
結果に応じて更新されます(P. 4-4「条件付き実行」参照)。
Rd
結果を保持する ARM レジスタを指定します。
Operand2
軟フレキシブル第 2 オペランドを指定します。このオプションの詳細に
ついては、P. 4-24「フレキシブル第 2 オペランド」を参照して下さい。
用法
MOV 命令は、Operand2 の値を Rd にコピーします。
MVN 命令は Operand2 の値を取得し、その値にビットごとの論理 NOT 演算を実行して、
結果を Rd に返します。
状況によっては、アセンブラが MOV を MVN に、または MVN を MOV に置換する場合が
あります。逆アセンブリリストを見るときは、この点に注意して下さい。詳細につい
ては、P. 4-26「命令置換」を参照して下さい。
条件フラグ
S が指定されている場合、これらの命令は:
4-32
•
結果に応じて N フラグおよび Z フラグを更新します。
•
Operand2 の計算中に C フラグを更新することができます(P. 4-24「フレキシブ
ル第 2 オペランド」参照)。
•
V フラグを変更しません。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
r15 の使用
Rn に r15 を指定している場合、使用される値は命令のアドレス +8 になります。
Rd に r15 を指定した場合:
•
•
結果に対応するアドレスへの分岐を実行します。
接尾文字 S を指定している場合、現在のモードの SPSR が CPSR にコピーされま
す。これを使用して、例外から復帰することができます(ADS デベロッパガイド
の「プロセッサ例外処理」を参照して下さい)。
注意
ユーザモードまたはシステムモードで Rd に r15 を使用する場合は、接尾文字 S を使用
しないで下さい。このような命令による影響は予測不能である上、アセンブラはアセ
ンブリ時に警告を生成しません。
レジスタ制御シフトを使用するデータ処理命令では、Rd またはどのオペランドにも r15
を使用することはできません(P. 4-24「フレキシブル第 2 オペランド」参照)。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全バージョンで使用できます。
例
MOV
MVNNE
MOVS
r5,r2
r11,#0xF000000B
r0,r0,ASR r3
誤用例
MVN
ARM DUI0068BJ-00
r15,r3,ASR r0
; r15 not allowed with register
; controlled shift
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-33
ARM 命令について
4.3.5
CMP と CMN
比較および負数比較を実行します。
構文
CMP{cond} Rn, Operand2
CMN{cond} Rn, Operand2
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
Rn
第 1 オペランドを保持する ARM レジスタを指定します。
Operand2
フレキシブル第 2 オペランドを指定します。このオプションの詳細につ
いては、P. 4-24「フレキシブル第 2 オペランド」を参照して下さい。
用法
これらの命令は、レジスタ内の値と Operand2 を比較します。この比較結果に基づい
て条件フラグを更新しますが、比較結果はどのレジスタにも返しません。
CMP 命令は、Rn の値から Operand2 の値を減算します。結果が破棄されることを除け
ば、SUBS 命令と同じです。
CMN 命令は、Operand2 の値を Rn の値に加算します。結果が破棄されることを除けば、
ADDS 命令と同じです。
状況によっては、アセンブラが CMP を CMN に、または CMN を CMP に置換する場合が
あります。逆アセンブリリストを見るときは、この点に注意して下さい。詳細につい
ては、P. 4-26「命令置換」を参照して下さい。
条件フラグ
これらの命令は、結果に応じて N、Z、C、V フラグを更新します。
r15 の使用
Rn に r15 を指定している場合、使用される値は命令のアドレス +8 になります。
レジスタ制御シフトを使用するデータ処理命令では、どのオペランドにも r15 を使用す
ることはできません(P. 4-24「フレキシブル第 2 オペランド」参照)。
4-34
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
アーキテクチャ
これらの命令は、ARM アーキテクチャの全バージョンで使用できます。
例
CMP
CMN
CMPGT
r2,r9
r0,#6400
r13,r7,LSL #2
誤用例
CMP
ARM DUI0068BJ-00
r2,r15,ASR r0
; r15 not allowed with register
; controlled shift
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-35
ARM 命令について
4.3.6
TST と TEQ
テストおよび等価テストを実行します。
構文
TST{cond} Rn, Operand2
TEQ{cond} Rn, Operand2
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
Rn
第 1 オペランドを保持する ARM レジスタを指定します。
Operand2
フレキシブル第 2 オペランドを指定します。このオプションの詳細につ
いては、P. 4-24「フレキシブル第 2 オペランド」を参照して下さい。
用法
これらの命令は、レジスタ内の値を Operand2 に従ってテストします。結果に応じて
条件フラグを更新しますが、結果はどのレジスタにも返しません。
TST 命令は、Rn の値と Operand2 の値でビットごとの論理積を実行します。結果が破棄
されることを除けば、ANDS 命令と同じです。
TEQ 命令は、Rn の値と Operand2 の値でビットごとの排他的論理和演算を実行します。
結果が破棄されることを除けば、EORS 命令と同じです。
条件フラグ
これらの命令は:
•
結果に応じて N フラグおよび Z フラグを更新します。
•
Operand2 の計算中に C フラグを更新することができます(P. 4-24「フレキシブ
ル第 2 オペランド」参照)。
•
V フラグを変更しません。
r15 の使用
Rn に r15 を指定している場合、使用される値は命令のアドレス +8 になります。
レジスタ制御シフトを使用するデータ処理命令では、どのオペランドにも r15 を使用す
ることはできません(P. 4-24「フレキシブル第 2 オペランド」参照)。
4-36
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
アーキテクチャ
これらの命令は、ARM アーキテクチャの全バージョンで使用できます。
例
TST
TEQEQ
TSTNE
r0,#0x3F8
r10,r9
r1,r5,ASR r1
誤用例
TEQ
ARM DUI0068BJ-00
r15,r1,ROR r0
; r15 not allowed with register
; controlled shift
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-37
ARM 命令について
4.3.7
CLZ
先行ゼロカウントを実行します。
構文
CLZ{cond} Rd, Rm
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
Rd
結果を保持するARMレジスタを指定します。Rdにr15は使用できません。
Rm
オペランドレジスタを指定します。
用法
CLZ命令はRmの値に含まれるMSBから順に、最初の1が現れるまでの0のビット数をカ
ウントし、結果を Rd に返します。ソースレジスタにビットがセットされていない場合
の結果は 32 となり、ビット 31 がセットされている場合はゼロになります。
条件フラグ
この命令はフラグを変更しません。
アーキテクチャ
この命令は、ARM アーキテクチャ v5 以上で使用できます。
例
CLZ
CLZNE
4-38
r4,r9
r2,r3
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.4
ARM 乗算命令
このセクションは以下のサブセクションから構成されています。
•
MUL と MLA:P. 4-40
乗算および積和(32 ビット× 32 ビット、結果の下位 32 ビットを返す)
•
UMULL、UMLAL、SMULL、SMLAL:P. 4-42
符号なし / 符号付き long 乗算および long 積和(32 ビット× 32 ビット、64 ビッ
トの累算値または結果を返す)
•
SMULxy:P. 4-44
符号付き乗算(16 ビット× 16 ビット、32 ビットの結果を返す)
•
SMLAxy:P. 4-46
符号付き積和(16 ビット× 16 ビット、32 ビットの累算値を返す)
•
SMULWy:P. 4-48
符号付き乗算(32 ビット× 16 ビット、結果の上位 32 ビットを返す)
•
SMLAWy:P. 4-49
符号付き積和(32 ビット× 16 ビット、累算値の上位 32 ビットを返す)
•
SMLALxy:P. 4-51
符号付き積和(16 ビット× 16 ビット、64 ビットの累算値を返す)
•
MIA、MIAPH、MIAxy:P. 4-53
XScale コプロセッサ 0 命令。
内部積和(32 ビット× 32 ビット、40 ビットの累算値を返す)
パックハーフワードの内部積和(16 ビット× 16 ビット× 2、40 ビットの累算値
を返す)
内部積和(16 ビット× 16 ビット、40 ビットの累算値を返す)
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-39
ARM 命令について
4.4.1
MUL と MLA
乗算および積和(32 ビット× 32 ビット、結果の下位 32 ビットを返す)を実行します。
構文
MUL{cond}{S} Rd, Rm, Rs
MLA{cond}{S} Rd, Rm, Rs, Rn
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」を参照)。
S
オプションの接尾文字です。S を指定すると、条件コードフラグが演算
結果に応じて更新されます(P. 4-4「条件付き実行」参照)。
Rd
結果を保持する ARM レジスタを指定します。
Rm, Rs, Rn オペランドを保持する ARM レジスタを指定します。
Rd、Rm、Rs、Rn に r15 は使用できません。
Rd と Rm に同じレジスタは指定できません。
用法
MUL 命令は Rm と Rs の値を乗算し、演算結果の下位 32 ビットを Rd に返します。
MLA命令はRmとRsの値を乗算してからRnの値を加算し、結果の下位32ビットをRdに返
します。
条件フラグ
S が指定されている場合、これらの命令は:
•
結果に応じて N フラグおよび Z フラグを更新します。
•
V フラグを変更しません。
•
ARM アーキテクチャ v4 以前では C フラグを更新します。
•
ARM アーキテクチャ v5 以上では C フラグを変更しません。
アーキテクチャ
これらの命令は、ARM アーキテクチャ v2 以上で使用できます。
4-40
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
例
MUL
MLA
MULS
MULLT
MLAVCS
r10,r2,r5
r10,r2,r1,r5
r0,r2,r2
r2,r3,r2
r8,r6,r3,r8
誤用例
MUL
MLA
ARM DUI0068BJ-00
r15,r0,r3
r1,r1,r6
; use of r15 not allowed
; Rd cannot be the same as Rm
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-41
ARM 命令について
4.4.2
UMULL、
、UMLAL、
、SMULL、
、SMLAL
符号なしおよび符号付きの long 乗算および long 積和(32 ビット× 32 ビット、累算値
または結果として 64 ビットを返す)を実行します。
構文
Op{cond}{S} RdLo, RdHi, Rm, Rs
説明:
Op
UMULL、UMLAL、SMULL、SMLAL のいずれかを指定します。
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
S
オプションの接尾文字です。S を指定すると、条件コードフラグが演算
結果に応じて更新されます(P. 4-4「条件付き実行」参照)。
RdLo, RdHi 結果を格納する ARM レジスタを指定します。UMLAL と SMLAL では、累
算値も保持します。
Rm, Rs
オペランドを格納する ARM レジスタを指定します。
RdHi、RdLo、Rm、Rs に r15 は使用できません。
RdLo、RdHi、Rm に同じレジスタは使用できません。
用法
UMULL 命令は、Rm と Rs の値を符号なし整数と解釈します。これらの整数を乗算して、
演算結果の下位 32 ビットを RdLo に、また上位 32 ビットを RdHi に格納します。
UMLAL 命令は、Rm と Rs の値を符号なし整数と解釈します。これらの整数を乗算し、64
ビットの演算結果に RdHi と RdLo が保持している 64 ビットの符号なし整数を加算し
ます。
SMULL命令は、RmとRsの値を2の補数の符号付き整数と解釈します。これらの整数を乗
算して、演算結果の下位 32 ビットを RdLo に、また上位 32 ビットを RdHi に格納します。
SMLAL命令は、RmとRsの値を2の補数の符号付き整数と解釈します。これらの整数を乗
算し、64 ビットの演算結果に RdHi と RdLo が保持している 64 ビットの符号付き整数
を加算します。
4-42
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
条件フラグ
S が指定されている場合、これらの命令は以下を実行します。
•
結果に応じて N フラグおよび Z フラグを更新する。
•
ARM アーキテクチャ v4 以前では C および V フラグを更新する。
•
ARM アーキテクチャ v5 以上では C および V フラグを変更しない。
アーキテクチャ
これらの命令は、ARM アーキテクチャ v3M および ARM アーキテクチャ v4 以上(xM
バリアントを除く)で使用できます。
例
UMULL
UMLALS
SMLALLES
SMULLNE
r0,r4,r5,r6
r4,r5,r3,r8
r8,r9,r7,r6
r0,r1,r9,r0 ; Rs can be the same as other
; registers
誤用例
UMULL
SMULLLE
ARM DUI0068BJ-00
r1,r15,r10,r2
r0,r1,r0,r5
; use of r15 not allowed
; RdLo, RdHi and Rm must all be
; different registers
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-43
ARM 命令について
4.4.3
SMULxy
符号付き乗算(16 ビット× 16 ビット、32 ビットの結果を返す)を実行します。
構文
SMUL<x><y>{cond} Rd, Rm, Rs
説明:
<x>
B か T のどちらかを指定します。Rm の下位(ビット [15:0])を使用する場
合は B を、Rm の上位(ビット [31:16])を使用する場合は T を指定します。
<y>
B か T のどちらかを指定します。Rs の下位(ビット [15:0])を使用する場
合は B を、Rs の上位([31:16])を使用する場合は T を指定します。
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
Rd
結果を格納する ARM レジスタを指定します。
Rm, Rs
乗数を保持する ARM レジスタを指定します。
Rd、Rm、Rs に r15 は使用できません。
Rd、Rm、Rs の任意の組み合わせに同じレジスタを使用できます。
用法
SMULxy 命令は指定した Rm と Rs の上位または下位 16 ビット符号付き整数を乗算し、32
ビットの演算結果を Rd に格納します。
条件フラグ
この命令はフラグを変更しません。
アーキテクチャ
この命令は、ARM アーキテクチャ v5 以上の E バリアントで使用できます。
例
SMULTBEQ
4-44
r8,r7,r9
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
誤用例
SMULBT
SMULTTS
ARM DUI0068BJ-00
r15,r2,r0
r0,r6,r2
; use of r15 not allowed
; use of S suffix not allowed
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-45
ARM 命令について
4.4.4
SMLAxy
符号付き積和(16 ビット× 16 ビット、32 ビットの累算値を返す)を実行します。
構文
SMLA<x><y>{cond} Rd, Rm, Rs, Rn
説明:
<x>
B か T のどちらかを指定します。Rm の下位(ビット [15:0])を使用する場
合は B を、Rm の上位(ビット [31:16])を使用する場合は T を指定します。
<y>
B か T のどちらかを指定します。Rs の下位(ビット [15:0])を使用する場
合は B を、Rs の上位([31:16])を使用する場合は T を指定します。
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
Rd
結果を格納する ARM レジスタを指定します。
Rm, Rs
乗数を保持する ARM レジスタを指定します。
Rn
加算する値を保持する ARM レジスタ。
Rd、Rm、Rs、Rn に r15 は使用できません。
Rd、Rm、Rs、Rn の任意の組み合わせに同じレジスタを使用できます。
用法
SMLAxy 命令は指定した Rm と Rs の上位または下位 16 ビット符号付き整数を乗算し、32
ビットの演算結果に Rn の 32 ビット値を加算して、結果を Rd に格納します。
条件フラグ
この命令は、N、Z、C、V フラグを変更しません。
累算によってオーバフローが生じた場合は、Q フラグがセットされます。Q フラグの
状態を読み出すには、MRS 命令を使用します(P. 4-73「MRS」参照)。
注
この命令は、Q フラグのクリアは行いません。Q フラグをクリアするには、MSR 命令
を使用します(P. 4-74「MSR」を参照)。
4-46
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
アーキテクチャ
この命令は、ARM アーキテクチャ v5 以上の E バリアントで使用できます。
例
SMLATT
SMLABBNE
SMLABT
r8,r1,r0,r8
r0,r2,r1,r10
r0,r0,r3,r5
誤用例
SMLATB
SMLATTS
ARM DUI0068BJ-00
r0,r7,r8,r15
r0,r6,r2
; use of r15 not allowed
; use of S suffix not allowed
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-47
ARM 命令について
4.4.5
SMULWy
符号付き乗算(32 ビット× 16 ビット、結果の上位 32 ビットを返す)を実行します。
構文
SMULW<y>{cond} Rd, Rm, Rs
説明:
<y>
B か T のどちらかを指定します。Rs の下位(ビット [15:0])を使用する場
合は B を、Rs の上位([31:16])を使用する場合は T を指定します。
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
Rd
結果を格納する ARM レジスタを指定します。
Rm, Rs
オペランドを保持する ARM レジスタを指定します。
Rd、Rm、Rs に r15 は使用できません。
Rd、Rm、Rs の任意の組み合わせに同じレジスタを使用できます。
用法
SMULWy命令は指定したRsの上位または下位16ビットの符号付き整数とRmの符号付き
整数を乗算し、48 ビットの演算結果の上位 32 ビットを Rd に格納します。
条件フラグ
この命令はフラグを変更しません。
アーキテクチャ
この命令は、ARM アーキテクチャ v5 以上の E バリアントで使用できます。
例
SMULWB
SMULWTVS
r2,r4,r7
r0,r0,r9
誤用例
SMULWT
SMULWBS
4-48
r15,r9,r3
r0,r4,r5
; use of r15 not allowed
; use of S suffix not allowed
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.4.6
SMLAWy
符号付き積和(32 ビット× 16 ビット、累算値の上位 32 ビットを返す)を実行します。
構文
SMLAW<y>{cond} Rd, Rm, Rs, Rn
説明:
<y>
B か T のどちらかを指定します。Rs の下位(ビット [15:0])を使用する場
合は B を、Rs の上位([31:16])を使用する場合は T を指定します。
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)
。
Rd
結果を格納する ARM レジスタを指定します。
Rm, Rs
乗数を保持する ARM レジスタを指定します。
Rn
加算する値を保持する ARM レジスタを指定します。
Rd、Rm、Rs、Rn に r15 は使用できません。
Rd、Rm、Rs、Rn の任意の組み合わせに同じレジスタを使用できます。
用法
SMLAWy命令は指定したRsの上位または下位16ビットの符号付き整数をRmの符号付き
整数と乗算し、32 ビットの演算結果を Rn の 32 ビット値に加算して、その結果を Rd
に格納します。
条件フラグ
この命令は、N、Z、C、V フラグを変更しません。
累算によってオーバフローが生じた場合は、Q フラグがセットされます。Q フラグの
状態を読み出すには、MRS 命令を使用します(P. 4-73「MRS」を参照)。
注
この命令は、Q フラグをクリアできません。Q フラグをクリアするには、MSR 命令を
使用します(P. 4-74「MSR」を参照)。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-49
ARM 命令について
アーキテクチャ
この命令は、ARM アーキテクチャ v5 以上の E バリアントで使用できます。
例
SMLAWB
SMLAWTVS
r2,r4,r7,r1
r0,r0,r9,r2
誤用例
SMLAWT
SMLAWBS
4-50
r15,r9,r3,r1
r0,r4,r5,r1
; use of r15 not allowed
; use of S suffix not allowed
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.4.7
SMLALxy
符号付き積和(16 ビット× 16 ビット、64 ビットの累算値を返す)を実行します。
構文
SMLAL<x><y>{cond} RdLo, RdHi, Rm, Rs
説明:
<x>
B か T のどちらかを指定します。Rm の下位(ビット [15:0])を使用する場
合は B を、Rm の上位(ビット [31:16])を使用する場合は T を指定します。
<y>
B か T のどちらかを指定します。Rs の下位(ビット [15:0])を使用する場
合は B を、Rs の上位([31:16])を使用する場合は T を指定します。
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)
。
cond
RdHi, RdLo 結果を格納する ARM レジスタを指定します。これらのレジスタはアド
イン値も保持します。
Rm, Rs
乗数を保持する ARM レジスタを指定します。
RdHi、RdLo、Rm、Rs に r15 は使用できません。
RdHi、RdLo、Rm、Rs の任意の組み合わせに同じレジスタを使用できます。
用法
SMLALxy命令は、指定したRsの上位または下位16ビットの符号付き整数と指定したRm
の上位または下位 16 ビットの符号付き整数を乗算し、32 ビットの演算結果を RdHi と
RdLo の 64 ビット値に加算します。
条件フラグ
この命令はフラグを変更しません。
注
この命令によって例外が発生することはありません。この命令でオーバフローが発生
すると、警告がないままラップラウンドされます。
アーキテクチャ
この命令は、ARM アーキテクチャ v5 以上の E バリアントで使用できます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-51
ARM 命令について
例
SMLALTB
SMLALBTVS
r2,r3,r7,r1
r0,r1,r9,r2
誤用例
SMLALTT
SMLALBBS
4-52
r8,r9,r3,r15
r0,r1,r5,r2
; use of r15 not allowed
; use of S suffix not allowed
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.4.8
MIA、
、MIAPH、
、MIAxy
XScale コプロセッサ 0 命令です。
MIA は内部積和(32 ビット× 32 ビット、40 ビットの累算値を返す)を実行します。
MIAPH はパックハーフワードの内部積和(16 ビット× 16 ビット× 2、40 ビットの累
算値を返す)を実行します。
MIAxy は内部積和(16 ビット× 16 ビット、40 ビットの累算値を返す)を実行します。
構文
MIA{cond} Acc, Rm, Rs
MIAPH{cond} Acc, Rm, Rs
MIA<x><y>{cond} Acc, Rm, Rs
説明:
cond
。
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)
Acc
内部累算器を指定します。標準名は accx で、x は 0 ~ n の整数です。n
の値はプロセッサによって異なります。現在のプロセッサでは 0 です。
Rm, Rs
乗数を保持する ARM レジスタを指定します。
<x>
B か T のどちらかを指定します。Rm の下位(ビット [15:0])を使用する場
合は B を、Rm の上位(ビット [31:16])を使用する場合は T を指定します。
<y>
B か T のいずれか。Rs の下位(ビット [15:0])を使用する場合は B を、Rs
の上位([31:16])を使用する場合は T を指定します。
Rm と Rs に r15 は使用できません。
用法
MIA命令はRsとRmの符号付き整数を乗算し、
演算結果をAccの40ビット値に加算します。
MIAPH命令は、
RsとRmの下位16ビットの符号付き整数を乗算し、RsとRmの上位16ビッ
トの符号付き整数を乗算して、2 つの 32 ビットの演算結果を Acc の 40 ビット値に加
算します。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-53
ARM 命令について
MIAxy命令は、指定したRsの上位または下位16ビットの符号付き整数と指定したRmの
上位または下位 16 ビットの符号付き整数を乗算し、32 ビットの演算結果を Acc の 40
ビット値に加算します。
条件フラグ
これらの命令はフラグを変更しません。
注
これらの命令によって例外が発生することはありません。これらの命令でオーバフ
ローが発生すると、警告がないままラップラウンドされます。
アーキテクチャ
これらの命令は、XScale でのみ使用できます。
例
MIA
MIALE
MIAPH
MIAPHNE
MIABB
MIABT
MIATB
MIATT
MIABTGT
4-54
acc0,r5,r0
acc0,r1,r9
acc0,r0,r7
acc0,r11,r10
acc0,r8,r9
acc0,r8,r8
acc0,r5,r3
acc0,r0,r6
acc0,r2,r5
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.5
ARM 飽和演算命令
これらの命令は飽和演算(SAT)を実行します。つまり、演算の結果オーバフローが生
じると、以下が実行されます。
•
Q フラグがセットされる。
•
最終結果が -231 未満の場合、返される値は -231 になる。
•
最終結果が 231-1 より大きい場合、返される値は 231-1 になる。
Q フラグをセットする命令は他にも 2 つありますが、それらの命令では飽和演算は行
われません(P. 4-46「SMLAxy」および P. 4-49「SMLAWy」を参照)。
4.5.1
QADD、
、QSUB、
、QDADD、
、QDSUB
加算飽和、減算飽和、倍演算 + 加算飽和、倍演算 + 減算飽和を実行します。
構文
op{cond} Rd, Rm, Rn
説明:
op
QADD、QSUB、QDADD、QDSUB のいずれかを指定します。
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」を参照)。
Rd
結果を格納する ARM レジスタを指定します。
Rm, Rn
オペランドを保持する ARM レジスタを指定します。
Rd、Rm、Rn に r15 は使用できません。
用法
QADD 命令は、Rm と Rn の値を加算します。
QSUB 命令は、Rn の値を Rm の値から減算します。
QDADD 命令は、SAT(Rm + SAT(Rn * 2)) を計算します。飽和は、倍演算、加算、あ
るいはその両方で発生し得ます。倍演算で飽和が発生し、かつ加算では発生しない場
合は、Q フラグはセットされますが、最終結果は飽和しません。
QDSUB 命令は、SAT(Rm - SAT(Rn * 2)) を計算します。飽和は、倍演算、減算、あ
るいはその両方で発生し得ます。倍演算で飽和が発生し、かつ減算では発生しない場
合は、Q フラグはセットされますが、最終結果は飽和しません。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-55
ARM 命令について
注
これらの命令は、全ての値を 2 の補数の符号付き整数として処理します。
条件フラグ
これらの命令は、N、Z、C、V フラグを変更しません。飽和が生じると、Q フラグが
セットされます。Q フラグの状態を読み出すには、MRS 命令を使用します(P. 4-73「MRS」
を参照)
。
注
これらの命令は、飽和が発生しない場合でも、Q フラグをクリアできません。Q フラ
グをクリアするには、MSR 命令を使用します(P. 4-74「MSR」を参照)。
アーキテクチャ
これらの命令は、ARM アーキテクチャ v5 以上の E バリアントで使用できます。
例
QADD
r0,r1,r9
QDSUBLT r9,r0,r1
例
QSUBS
QDADD
4-56
r3,r4,r2
r11,r15,r0
; use of S suffix not allowed
; use of r15 not allowed
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.6
ARM 分岐命令
このセクションは以下のサブセクションから構成されています。
•
B と BL:P. 4-58
分岐とリンク付き分岐
•
BX:P. 4-59
分岐と命令セットの変換
•
BLX:P. 4-60
リンク付き分岐と命令セットの変換
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-57
ARM 命令について
4.6.1
B と BL
分岐、およびリンク付き分岐を実行します。
構文
B{cond} label
BL{cond} label
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
label
プログラム相対式を指定します。詳細については、P. 3-23「レジスタ相
対式とプログラム相対式」を参照して下さい。
用法
B 命令は、label への分岐を発生させます。
BL 命令は、次の命令のアドレスを r14(lr:リンクレジスタ)にコピーし、label への
分岐を発生させます。
マシンレベルの B 命令と BL 命令の範囲は、現在の命令のアドレスから ±32MB です。
しかし、label が範囲外の場合でも、これらの命令を使用できます。リンカが label
をどこに配置したのかが分からないことがよくありますが、ARM リンカは必要に応じ
て、長い分岐を見越してコードを追加します(ADS リンカ / ユーティリティガイドの
「ARM リンカ」を参照)。このように追加されるコードをベニアと呼びます。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全バージョンで使用できます。
例
B
BLE
BL
BLLT
4-58
loopA
ng+8
subC
rtX
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.6.2
BX
分岐を実行し、オプションで命令セットを変換します。
構文
BX{cond} Rm
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)
。
Rm
分岐先アドレスを保持する ARM レジスタを指定します。
Rm のビット 0 は、アドレスの一部としては使用されません。
Rm のビット 0 がセットされている場合、この命令は CPSR の T フラグを
セットし、分岐先のコードが Thumb コードとして解釈されます。
Rm のビット 0 がクリアされている場合、ビット 1 はセットできません。
用法
BX 命令は、Rm に保持されているアドレスへの分岐を発生させ、Rm のビット 0 がセット
されている場合は命令セットを Thumb に変換します。
アーキテクチャ
この命令は、ARM アーキテクチャの全ての T バリアントと ARM アーキテクチャv5 以
上で使用できます。
例
BX
BXVS
ARM DUI0068BJ-00
r7
r0
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-59
ARM 命令について
4.6.3
BLX
リンク付き分岐を実行し、オプションで命令セットを変換します。この命令には以下
の 2 つの形式があります。
•
•
プログラム相対アドレスへのリンク付き無条件分岐
レジスタに保持されている絶対アドレスへのリンク付きかつ条件付き分岐
構文
BLX{cond} Rm
BLX label
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
Rm
分岐先アドレスを保持する ARM レジスタを指定します。
Rm のビット 0 は、アドレスの一部として使用されません。
Rm のビット 0 がセットされている場合、この命令は CPSR の T フラグを
セットし、分岐先のコードが Thumb コードとして解釈されます。
Rm のビット 0 がクリアされている場合、ビット 1 はセットできません。
プログラム相対式を指定します。詳細については、P. 3-23「レジスタ相
対式とプログラム相対式」を参照して下さい。
label
注
BLX label は条件付きにはできません。BLX label を使用すると、必ず Thumb 状態へ
の切り替えが発生します。
用法
BLX 命令は:
•
次の命令のアドレスを r14(lr:リンクレジスタ)にコピーします。
•
label、または Rm に保持されているアドレスへの分岐を発生させます。
•
以下の場合に、命令セットを Thumb に変換します。
—
—
Rm のビット 0 がセットされている場合
BLX label 形式が使用されている場合
マシンレベルの BLX label 命令は、現在の命令から ±32MB を超えるアドレスへの分
岐を発生させることができません。必要に応じ、ARM リンカは長い分岐を見越して
コードを追加します。
(ADS リンカ / ユーティリティガイドの「ARM リンカ」を参照)。
このように追加されるコードをベニアと呼びます。
4-60
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
アーキテクチャ
この命令は、ARM アーキテクチャ v5 以上の全ての T バリアントで使用できます。
例
BLX
BLXNE
BLX
r2
r0
thumbsub
誤用例
BLXMI
ARM DUI0068BJ-00
thumbsub
; BLX label cannot be conditional
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-61
ARM 命令について
4.7
ARM コプロセッサ命令
このセクションでは、ベクタ浮動小数点命令については説明しません(第 6 章「ベク
タ浮動小数点プログラミング」参照)。
このセクションは以下のサブセクションから構成されています。
•
CDP、CDP2:P. 4-63
コプロセッサデータ演算
•
MCR、MCR2、MCRR:P. 4-64
コプロセッサ命令を使用した ARM レジスタからコプロセッサへの移動
•
MRC、MRC2:P. 4-65
コプロセッサ命令を使用したコプロセッサから ARM レジスタへの移動
•
MRRC:P. 4-66
コプロセッサ命令を使用したコプロセッサから 2 個の ARM レジスタへの移動
•
LDC、STC:P. 4-67
メモリとコプロセッサ間のデータ転送
4-62
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.7.1
CDP、
、CDP2
コプロセッサデータ演算を実行します。
構文
CDP{cond} coproc, opcode1, CRd, CRn, CRm{, opcode2}
CDP2 coproc, opcode1, CRd, CRn, CRm{, opcode2}
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参
照)。
coproc
命令に使用するコプロセッサの名前を指定します。標準名は pn
で、n は 0 ~ 15 の整数です。
opcode1
コプロセッサ固有のオペコードを指定します。
CRd, CRn, CRm
コプロセッサレジスタを指定します。
opcode2
オプションのコプロセッサ固有オペコードを指定します。
用法
これらの命令の使用方法は、コプロセッサによって異なります。詳細については、コ
プロセッサの説明書を参照して下さい。
注
CDP2 は必ず無条件で実行します。
アーキテクチャ
CDP は、ARM アーキテクチャ v2 以上で使用できます。
CDP2 は、ARM アーキテクチャ v5 以上で使用できます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-63
ARM 命令について
4.7.2
MCR、
、MCR2、
、MCRR
ARM レジスタからコプロセッサへの移動を実行します。コプロセッサによっては、他
の演算子を指定できる場合があります。
構文
MCR{cond} coproc, opcode1, Rd, CRn, CRm{, opcode2}
MCR2 coproc, opcode1, Rd, CRn, CRm{, opcode2}
MCRR{cond} coproc, opcode1, Rd, Rn, CRm
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
coproc
命令に使用するコプロセッサの名前を指定します。標準名は pn で、n は
0 ~ 15 の整数です。
opcode1
コプロセッサ固有のオペコードを指定します。
Rd, Rn
ARM ソースレジスタを指定します。r15 は使用できません。
CRn, CRm
コプロセッサレジスタを指定します。
opcode2
オプションのコプロセッサ固有オペコードを指定します。
用法
これらの命令の使用方法は、コプロセッサによって異なります。詳細については、コ
プロセッサの説明書を参照して下さい。
注
MCR2 は必ず無条件で実行します。
アーキテクチャ
MCR は、ARM アーキテクチャ v2 以上で使用できます。
MCR2 は、ARM アーキテクチャ v5 以上で使用できます。
MCRR は ARM アーキテクチャv5 以上のバリアント E(バリアント xP を除く)で使用でき
ます。
4-64
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.7.3
MRC、
、MRC2
コプロセッサから ARM レジスタへの移動を実行します。コプロセッサによっては、他
の演算子を指定できる場合があります。
構文
MRC{cond} coproc, opcode1, Rd, CRn, CRm{, opcode2}
MRC2 coproc, opcode1, Rd, CRn, CRm{, opcode2}
説明:
cond
。
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)
coproc
命令に使用するコプロセッサの名前。標準名は pn で、n は 0 ~ 15 の整
数です。
opcode1
コプロセッサ固有のオペコードを指定します。
Rd
ARM デスティネーションレジスタを指定します。Rd が r15 の場合、フ
ラグフィールドのみが変更されます。
CRn, CRm
コプロセッサレジスタを指定します。
opcode2
オプションのコプロセッサ固有オペコードを指定します。
用法
これらの命令の使用方法は、コプロセッサによって異なります。詳細については、コ
プロセッサの説明書を参照して下さい。
注
MRC2 は必ず無条件で実行します。
アーキテクチャ
MRC は、ARM アーキテクチャ v2 以上で使用できます。
MRC2 は、ARM アーキテクチャ v5 以上で使用できます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-65
ARM 命令について
4.7.4
MRRC
コプロセッサから 2 個の ARM レジスタへの移動を実行します。コプロセッサによって
は、他の演算子を指定できる場合があります。
構文
MRRC{cond} coproc, opcode, Rd, Rn, CRm
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
coproc
命令に使用するコプロセッサの名前を指定します。標準名は pn で、n は
0 ~ 15 の整数です。
opcode
コプロセッサ固有のオペコードを指定します。
Rd, Rn
ARM デスティネーションレジスタを指定します。Rd と Rn には r15 を使
用できません。
CRm
コプロセッサソースレジスタを指定します。
用法
これらの命令の使用方法は、コプロセッサによって異なります。詳細については、コ
プロセッサの説明書を参照して下さい。
アーキテクチャ
MRRC は ARM アーキテクチャv5 以上のバリアント E(バリアント xP を除く)で使用でき
ます。
4-66
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.7.5
LDC、
、STC
メモリとコプロセッサ間のデータ転送を実行します。
構文
これらの命令には、以下の 3 つの形式を使用することができます。
•
•
•
ゼロオフセット
プレインデクスオフセット
ポストインデクスオフセット
この 3 形式の構文を、上記と同じ順番で以下に示します。
op{cond}{L} coproc, CRd, [Rn]
op{cond}{L} coproc, CRd, [Rn, #{-}offset]{!}
op{cond}{L} coproc, CRd, [Rn], #{-}offset
説明:
op
LDC または STC のどちらかを指定します。
cond
。
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)
L
長い転送を指定するオプションの接尾文字を指定します。
coproc
命令に使用するコプロセッサ名前を指定します。標準名は pn で、n は 0
~ 15 の整数です。
CRd
ロードまたはストアを行うコプロセッサレジスタを指定します。
Rn
メモリアドレスのベースとなるレジスタを指定します。r15 を指定する
と、使用される値は現在の命令のアドレス +8 になります。
-
オプションのマイナス符号。- を指定すると、オフセットが Rn から引か
れます。- を指定していない場合は、オフセットが Rn に加算されます。
offset
0 ~ 1020 の 4 の倍数を求める式を指定します。
!
オプションの接尾文字です。! を指定すると、オフセットを含むアドレ
スが Rn にライトバックされます。
用法
これらの命令の使用方法は、コプロセッサによって異なります。詳細については、コ
プロセッサの説明書を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-67
ARM 命令について
アーキテクチャ
LDC と STC は、ARM アーキテクチャ v2 以上で使用できます。
4-68
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.7.6
LDC2、
、STC2
これらの命令も、メモリとコプロセッサ間のデータ転送を実行します。
構文
これらの命令には、以下の 3 つの形式を使用できます。
•
•
•
ゼロオフセット
プレインデクスオフセット
ポストインデクスオフセット
この 3 形式の構文を、上記と同じ順番で以下に示します。
op coproc, CRd, [Rn]
op coproc, CRd, [Rn, #{-}offset]{!}
op coproc, CRd, [Rn], #{-}offset
説明:
op
LDC2 か STC2 のどちらかを指定します。
coproc
命令に使用するコプロセッサの名前を指定します。標準名は pn で、n は
0 ~ 15 の整数です。
CRd
ロードまたはストアを行うコプロセッサレジスタを指定します。
Rn
メモリアドレスのベースとなるレジスタを指定します。r15 を指定する
と、使用される値は現在の命令のアドレス +8 になります。
-
オプションのマイナス符号です。- を指定すると、オフセットが Rn から
引かれます。-を指定していない場合は、オフセットがRnに加算されます。
offset
0 ~ 1020 の 4 の倍数を求める式を指定します。
!
オプションの接尾文字です。! を指定すると、オフセットを含むアドレス
が Rn にライトバックされます。
用法
これらの命令の使用方法は、コプロセッサによって異なります。詳細については、コ
プロセッサの説明書を参照して下さい。
注
LDC2 と STC2 は、必ず無条件で実行します。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-69
ARM 命令について
アーキテクチャ
LDC2 と STC2 は、ARM アーキテクチャ v5 以上で使用できます。
4-70
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.8
その他の ARM 命令
このセクションは以下のサブセクションから構成されています。
•
SWI:P. 4-72
ソフトウェア割り込み
•
MRS:P. 4-73
CPSR または SPSR の内容の汎用レジスタへの移動
•
MSR:P. 4-74
CPSR または SPSR の指定フィールドへの、イミディエート定数、または汎用レ
ジスタの内容のロード
•
BKPT:P. 4-76
ブレークポイント
•
MAR、MRA:P. 4-77
XScale コプロセッサ 0 命令
2 個の汎用レジスタと 40 ビット内部累算器間の転送
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-71
ARM 命令について
4.8.1
SWI
ソフトウェア割り込みを実行します。
構文
SWI{cond} immed_24
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
immed_24
0 ~ 224-1(24 ビット)の整数を求める式を指定します。
用法
SWI 命令によって、SWI 例外が発生します。つまり、プロセッサモードがスーパーバイ
ザモードに変更され、CPSR がスーパーバイザモードの SPSR に保存され、SWI ベクタ
への分岐が実行されます(ADS デベロッパガイドの「プロセッサ例外処理」参照)。
条件フラグ
この命令はフラグを変更しません。
アーキテクチャ
この命令は、ARM アーキテクチャの全バージョンで使用できます。
例
SWI 0x123456
4-72
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.8.2
MRS
CPSR または SPSR の内容を汎用レジスタに移動します。
構文
MRS{cond} Rd, psr
説明:
cond
Rd
psr
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)
。
デスティネーションレジスタを指定します。Rd に r15 は使用できません。
CPSR または SPSR のどちらかを指定します。
用法
MRS と MSR を組み合わせ、
PSR を更新する読み出し - 修正 - 書き込みシーケンスの中で使
用することにより、プロセッサモードの変更や Q フラグのクリアなどを行うことがで
きます。
注意
プロセッサがユーザモードまたはシステムモードの場合、SPSR へのアクセスを行わな
いで下さい。これはユーザ自身で注意する必要があります。アセンブラは、どのプロ
セッサモードのコードが実行されるかを認識できないため、警告メッセージを生成す
ることができません。
条件フラグ
この命令はフラグを変更しません。
アーキテクチャ
この命令は、ARM アーキテクチャ v3 以上で使用できます。
例
MSR r3, SPSR
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-73
ARM 命令について
4.8.3
MSR
CPSR または SPSR の指定フィールドに、イミディエート定数、または汎用レジスタの
内容をロードします。
構文
MSR{cond} <psr>_<fields>, #immed_8r
MSR{cond} <psr>_<fields>, Rm
説明:
cond
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)。
<psr>
CPSR または SPSR のどちらかを指定します。
<fields>
変更対象のフィールドを指定します。<fields> には、以下の 1 つ以上
を指定することができます。
c
制御フィールドマスクバイト(PSR[7:0])
x
拡張フィールドマスクバイト(PSR[15:8])
s
ステータスフィールドマスクバイト(PSR[23:16])
f
フラグフィールドマスクバイト(PSR[31:24])
immed_8r
数値定数を求める式を指定します。この定数は、8 ビットパターンを偶
数回ロテートして表現できる32ビットワードに対応している必要があり
ます。
Rm
ソースレジスタを指定します。
用法
P. 4-73「MRS」を参照して下さい。
条件フラグ
この命令は、f フィールドが指定されている場合にフラグを明示的に更新します。
アーキテクチャ
この命令は、ARM アーキテクチャ v3 以上で使用できます。
4-74
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
例
MSR CPSR_f, r5
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-75
ARM 命令について
4.8.4
BKPT
ブレークポイント命令です。
構文
BKPT immed_16
説明:
immed_16
0 ~ 65535 の整数(16 ビット整数)を求める式を指定します。ARM ハー
ドウェアは immed_16 を無視しますが、デバッガは immed_16 を使用し
てブレークポイントに関する補足情報を保存することができます。
用法
BKPT 命令は、プロセッサをデバッグモードに入れます。デバッグツールは、BKPT 命令
を使用し、実行が特定アドレスに到着時にデバッガ機能を実現するために使用します。
アーキテクチャ
この命令は、ARM アーキテクチャ v5 以上で使用できます。
例
BKPT
BKPT
4-76
0xF02C
640
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.8.5
MAR、
、MRA
XScale コプロセッサ 0 命令です。
2 個の汎用レジスタと 40 ビット内部累算器の間で転送を実行します。
構文
MAR{cond} Acc, RdLo, RdHi
MRA{cond} RdLo, RdHi, Acc
説明:
cond
。
オプションの条件コードを指定します(P. 4-4「条件付き実行」参照)
Acc
内部累算器を指定します。標準名は accx で、x は 0 ~ n の整数です。n
の値はプロセッサによって異なります。現在のプロセッサでは 0 です。
RdLo, RdHi 汎用レジスタを指定します。
用法
MAR命令は、RdLoの内容を Acc のビット[31:0]にコピーし、RdHi の最下位バイトを Acc
のビット [39:32] にコピーします。
MRA 命令は以下を実行します。
•
Acc のビット [31:0] を RdLo にコピーする。
•
Acc のビット [39:32] を RdHi にコピーする。
•
Acc のビット [39] を RdHi のビット [31:8] にコピーすることにより値を符号拡張
する。
アーキテクチャ
これらの命令は、XScale でのみ使用できます。
例
MAR
MRA
MARNE
MRAGT
ARM DUI0068BJ-00
acc0,r0,r1
r4,r5,acc0
acc0,r9,r2
r4,r8,acc0
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-77
ARM 命令について
4.9
ARM 擬似命令
ARM アセンブラでは、多くの疑似命令をサポートしています。これらの疑似命令は、
アセンブラ時に適切な ARM 命令または Thumb 命令の組み合わせに変換されます。
ARM 状態で使用可能な疑似命令については、以下のセクションを参照して下さい。
•
ADR ARM 疑似命令:P. 4-79
•
プログラム相対アドレスまたはレジスタ相対アドレスのロード(ショートレンジ)
ADRL ARM 疑似命令:P. 4-80
•
プログラム相対アドレスまたはレジスタ相対アドレスのレジスタへのロード
(ミディアムレンジ)
LDR ARM 疑似命令:P. 4-82
32 ビット定数値またはアドレスのレジスタへのロード(アンリミテッドレンジ)
•
NOP ARM 疑似命令:P. 4-84
NOP による適切な ARM 無演算コードの生成
4-78
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
4.9.1
ADR ARM 疑似命令
プログラム相対アドレスまたはレジスタ相対アドレスをレジスタにロードします。
構文
ADR{cond} register,expr
説明:
cond
オプションの条件コードを指定します。
register
ロード先のレジスタを指定します。
expr
以下を求めるプログラム相対式またはレジスタ相対式を指定します。
•
±255 バイト以内の非ワード境界整列アドレス
•
±1020 バイト以内のワード境界整列アドレス
アライメントが 16 バイト以上の場合、さらに遠くのアドレスを使用でき
ます。
このアドレスは、この命令またはベースレジスタのアドレスの前後どち
らにあっても構いません(P. 3-23「レジスタ相対式とプログラム相対式」
参照)。
注
プログラム相対式では、指定した範囲が現在の命令のアドレス +2 ワード
のアドレスに相対になります。
用法
ADRは必ず1つの命令にアセンブルされます。アセンブラはアドレスをロードする1つの
ADD 命令または SUB 命令を生成しようとします。このアドレスを 1 つの命令で構成でき
ない場合はエラーが生成され、アセンブリに失敗します。
ADR からは位置独立コードが生成されます。これは、アドレスがプログラム相対または
レジスタ相対であるためです。
広範囲の有効なアドレスをアセンブルするには、ADRL 疑似命令を使用します。
expr がプログラム相対式の場合には、ADR 擬似命令と同じコードセクション内にある
アドレスが求められる式でなければなりません。
例
start
ARM DUI0068BJ-00
MOV
ADR
r0,#10
r4,start
; => SUB r4,pc,#0xc
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-79
ARM 命令について
4.9.2
ADRL ARM 疑似命令
プログラム相対アドレスまたはレジスタ相対アドレスをレジスタにロードします。ADR
疑似命令と似ていますが、ADRL は ADR より広範囲のアドレスをロードできます。こ
れは、2 つのデータ処理命令を生成するためです。
注
Thumb 命令のアセンブル時には、ADRL は使用できません。ARM コードでのみ使用し
て下さい。
構文
ADR{cond}L register,expr
説明:
cond
オプションの条件コード
register
ロード先のレジスタを指定します。
expr
以下を求めるプログラム相対式またはレジスタ相対式を指定します。
•
64KB 以内の非ワード境界整列アドレス
•
256KB 以内のワード境界整列アドレス
アライメントが 16 バイト以上の場合、さらに遠くのアドレスを使用でき
ます。
アドレスは、命令またはベースレジスタのアドレスの前後どちらにあっ
ても構いません(P. 3-23「レジスタ相対式とプログラム相対式」参照)。
注
プログラム相対式では、指定した範囲が現在の命令のアドレス +2 ワード
のアドレスに相対になります。
用法
1つの命令でアドレスに達する場合でも、
ADRLは必ず2つの命令にアセンブルされます。
2 番目の冗長命令が作成されます。
アセンブラが 2 命令でアドレスを構成できない場合はエラーが生成され、アセンブリ
に失敗します。広範囲のアドレスをロードする方法については、P. 4-82「LDR ARM 疑
似命令」を参照して下さい(P. 2-25「レジスタへの定数のロード」参照)。
ADRL からは位置独立コードが生成されます。これは、アドレスがプログラム相対また
はレジスタ相対であるためです。
4-80
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
exprがプログラム相対式である場合には、ADRL擬似命令と同じコードセクション内に
あるアドレスが求められる式でなければなりません。でなければ、リンク後に範囲外
になる可能性があります。
例
start
ARM DUI0068BJ-00
MOV
ADRL
r0,#10
r4,start + 60000
; => ADD r4,pc,#0xe800
;
ADD r4,r4,#0x254
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-81
ARM 命令について
4.9.3
LDR ARM 疑似命令
レジスタに以下のどちらかをロードします。
•
32 ビット定数値
•
アドレス
注
ここでは、LDR 疑似命令についてのみ説明します。LDR 命令の詳細については、P. 4-6
「ARM メモリアクセス命令」を参照して下さい。
構文
LDR{cond} register,=[expr | label-expr]
説明:
cond
オプションの条件コードを指定します。
register
ロード先のレジスタを指定します。
expr
数値定数を求める式を指定します。
•
expr の値が範囲内の場合、アセンブラは MOV または MVN 命令を
生成します。
•
expr の値が MOV 命令または MVN 命令の範囲外の場合、アセンブ
ラはその定数をリテラルプールに配置し、リテラルプールからそ
の定数を読み出すプログラム相対 LDR 命令を生成します。
label-expr プログラム相対式または外部シンボルを指定します。アセンブラは
label-expr の値をリテラルプールに配置し、リテラルプールから値を
ロードするプログラム相対 LDR 命令を生成します。
label-expr が外部シンボルの場合、または現在のセクションに含まれ
ていない場合、アセンブラはリンカ再配置ディレクティブをオブジェク
トファイル内に配置します。リンカはリンク時にアドレスを生成します。
4-82
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ARM 命令について
用法
LDR 疑似命令は、主に以下の 2 つの目的で使用します。
•
イミディエート値が MOV 命令および MVN 命令の範囲外であり、レジスタに移動
できない場合のため、リテラル定数を生成する。
•
プログラム相対アドレスまたは外部シンボルをレジスタにロードするために使
用する。LDR を含む ELF セクションをリンカがどこに配置するかに関係なくア
ドレスは有効になります。
注
この方法でロードされたアドレスはリンク時に固定されるため、このコードは位
置独立コードではありません。
PC からリテラルプールの値へのオフセットは、4KB 未満でなければなりません。リテ
ラルプールが範囲内にあることを必ず確認して下さい。詳細については、P. 7-14
「LTORG」を参照して下さい。
LDR を使用する方法および MOV と MVN の詳細については、P. 2-25「レジスタへの定数の
ロード」を参照して下さい。
例
ARM DUI0068BJ-00
LDR
r3,=0xff0
LDR
r1,=0xfff
LDR
r2,=place
;
;
;
;
;
;
;
;
;
;
;
loads 0xff0 into r3
=> MOV r3,#0xff0
loads 0xfff into r1
=> LDR r1,[pc,offset_to_litpool]
...
litpool DCD 0xfff
loads the address of
place into r2
=> LDR r2,[pc,offset_to_litpool]
...
litpool DCD place
Copyright © 2000, 2001 ARM Limited. All rights reserved.
4-83
ARM 命令について
4.9.4
NOP ARM 疑似命令
NOP は適切な ARM ノンオペレーションコードを生成します。
以下のような命令を使用した場合はノンオペレーション動作を保証しません。
MOV r0, r0
構文
NOP
用法
NOP は条件付きでは使用できません。
ノンオペレーションを実行しないことと実行する
ことは同じであるため、条件付き実行は必要ありません。
NOP は ALU ステータスフラグを変更しません。
4-84
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
第5章
Thmub 命令について
本章では ARM アセンブラと ARMC/C++ コンパイラのインラインアセンブラで使用で
きる Thmub 命令について説明します。このセクションは以下のサブセクションから構
成されています。
•
Thumb メモリアクセス命令:P. 5-4
•
Thumb 算術命令:P. 5-15
•
Thumb 汎用データ処理命令:P. 5-22
•
Thumb 分岐命令:P. 5-31
•
Thumb ソフトウェア割り込み命令とブレークポイント命令:P. 5-37
•
Thumb 擬似命令:P. 5-39
各ディレクティブと擬似命令について、P. 5-2 表 5-1 を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-1
Thmub 命令について
表 5-1 Thmub 命令および擬似命令の参照ページ番号
命令ニーモニック
機能
ページ
アーキテクチャa
ADC
キャリー付き加算
P. 5-21
4T
ADD
加算
P. 5-15
4T
ADR
ロードアドレス(擬似命令)
P. 5-40
-
AND
論理積
P. 5-23
4T
ASR
算術右シフト
P. 5-24
4T
B
分岐
P. 5-32
4T
BIC
ビットクリア
P. 5-23
4T
BKPT
ブレークポイント
P. 5-38
5T
BL
リンク付き分岐
P. 5-34
4T
BLX
リンク付き分岐 / 命令セット変換
P. 5-36
5T
BX
分岐 / 命令セット変換
P. 5-35
4T
CMN, CMP
負数比較、比較
P. 5-26
4T
EOR
排他的論理和
P. 5-23
4T
LDMIA
多重レジスタロード:ポストインクリメント
P. 5-13
4T
LDR
レジスタロード:イミディエートオフセット
P. 5-5
4T
LDR
レジスタロード:レジスタオフセット
P. 5-7
4T
LDR
レジスタロード:pc/sp 相対
P. 5-9
4T
LDR
レジスタロード(擬似命令)
P. 5-41
-
LSL, LSR
論理左シフト、論理右シフト
P. 5-24
4T
MOV
移動
P. 5-28
4T
MUL
乗算
P. 5-21
4T
MVN, NEG
1 の補数の移動、1 の補数化
P. 5-28
4T
NOP
無演算(擬似命令)
P. 5-43
-
ORR
論理和
P. 5-23
4T
POP, PUSH
スタックからレジスタへのポップ、レジスタから P. 5-11
スタックへのプッシュ
4T
5-2
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
表 5-1 Thmub 命令および擬似命令の参照ページ番号(続き)
命令および擬似命令の参照ページ番号(続き)
命令ニーモニック
機能
ページ
アーキテクチャa
ROR
右ロテート
P. 5-24
4T
SBC
キャリー付き減算
P. 5-21
4T
STMIA
多重レジスタストアロード:ポストインクリメント P. 5-13
4T
STR
レジスタストア:イミディエートオフセット
P. 5-5
4T
STR
レジスタストア:レジスタオフセット
P. 5-7
4T
STR
レジスタストア:pc/sp 相対
P. 5-9
4T
SUB
減算
P. 5-15
4T
SWI
ソフトウェア割り込み
P. 5-37
4T
TST
ビットテスト
P. 5-30
4T
a. nT; ARM アーキテクチャバージョン n 以上の T バリアントで使用できます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-3
Thmub 命令について
5.1
Thumb メモリアクセス命令
このセクションは以下のサブセクションから構成されています。
•
LDR と STR:イミディエートオフセット:P. 5-5
レジスタのロードとストアを行います。メモリ内のアドレスは、レジスタ値とイ
ミディエートオフセットで指定されます。
•
LDR と STR:レジスタオフセット:P. 5-7
レジスタのロードとストアを行います。メモリ内のアドレスは、レジスタ値とレ
ジスタベースオフセットで指定されます。
•
LDR と STR:pc/sp 相対:P. 5-9
レジスタのロードとストアを行います。メモリ内のアドレスは、pc または sp の
値とイミディエートオフセットで指定します。
•
PUSH と POP:P. 5-11
下位レジスタに加え、オプションで LR をスタックにプッシュします。
下位レジスタに加え、オプションで pc の値をスタックからポップします。
•
LDMIA と STMIA:P. 5-13
多重レジスタのロードとストアを行います。
5-4
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.1.1
LDR と STR:イミディエートオフセット
:イミディエートオフセット
レジスタのロードとストアを行います。メモリ内のアドレスは、レジスタ値とイミディ
エートオフセットで指定されます。
構文
op Rd, [Rn, #immed_5x4]
opH Rd, [Rn, #immed_5x2]
opB Rd, [Rn, #immed_5x1]
説明:
op
以下のどちらかを指定します。
LDR
レジスタロード命令
STR
レジスタストア命令
H
符号なしハーフワード転送を指定するパラメータです。
B
符号なしバイト転送を指定するパラメータです。
Rd
ロード先またはストア元のレジスタを指定します。Rd には r0 ~ r7 の
いずれかのレジスタを指定する必要があります。
Rn
ベースアドレスを保持するレジスタを指定します。Rn には r0 ~ r7 の
いずれかのレジスタを指定する必要があります。
immed_5xN オフセットを指定します。アセンブリ時に 0 ~ 31N の範囲で N の倍数と
なる答えを求める式です。
用法
STR 命令はワード、ハーフワード、またはバイトをメモリにストアします。
LDR 命令はワード、ハーフワード、またはバイトをメモリからロードします。
このアドレスは、Rn のベースアドレスにオフセットを加算することで算出されます。
ハーフワード、バイトをロード時に使用するイミディエートオフセットは符号なしと
みなされます。データは Rd の最下位ワードまたは最下位バイトにロードされ、Rd の
残りの部分は 0 で充填されます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-5
Thmub 命令について
ワード / ハーフワード転送のアドレスアライメント
この転送アドレスには、ワード転送では 4 で、ハーフワード転送では 2 で割り切れる
値を指定する必要があります。
システムにシステムコプロセッサ(cp15)が存在する場合には、アライメントチェッ
クをイネーブルすることができます。アライメントチェックをイネーブルした場合に、
非境界整列の転送が行われると、アライメント例外が発生します。
システムにシステムコプロセッサ(cp15)が存在しない場合、あるいはアライメント
チェックをディセーブルした場合には、以下のようになります。
•
非境界整列のロードによって Rd が更新されます。
•
非境界整列のストアによって、2 バイトまたは 4 バイトのメモリが更新されます。
更新されるメモリ位置は、ハーフワードのストアでは [ アドレス AND NOT 0x1]、
ワードのストアでは [ アドレス AND NOT 0x3] となります。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
LDR
STRB
STRH
LDRB
r3,[r5,#0]
r0,[r3,#31]
r7,[r3,#16]
r2,[r4,#label-{PC}]
誤用例
5-6
LDR
r13,[r5,#40]
; high registers not allowed
STRB
r0,[r3,#32]
; 32 is out of range for byte transfers
STRH
r7,[r3,#15]
; offsets for halfword transfers must be even
LDRH
r6,[r0,#-6]
; negative offsets not supported
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.1.2
LDR と STR:レジスタオフセット
:レジスタオフセット
レジスタのロードとストアを行います。メモリ内のアドレスは、レジスタ値からのレ
ジスタベースオフセットとして指定されます。
構文
op Rd, [Rn, Rm]
説明:
op
以下のいずれかを指定します。
4 バイトワードのレジスタロード命令
LDR
4 バイトワードのレジスタストア命令
STR
2 バイト符号なしハーフワードのレジスタロード命令
LDRH
2 バイト符号付きハーフワードのレジスタロード命令
LDRSH
2 バイトハーフワードのレジスタストア命令
STRH
LDRB
符号なしバイトのレジスタロード命令
LDRSB
符号付きバイトのレジスタロード命令
STRB
バイトのレジスタストア命令
注
符号付きストア命令と符号なしストア命令は区別されません。
Rd
ロード先またはストア先のレジスタを指定します。Rd には r0 ~ r7 の
いずれかのレジスタを指定する必要があります。
Rn
ベースアドレスを保持するレジスタを指定します。Rn には r0 ~ r7 の
いずれかのレジスタを指定する必要があります。
Rm
オフセットを保持するレジスタを指定します。Rm には r0 ~ r7 のいず
れかのレジスタを指定する必要があります。
用法
STR 命令は Rd に格納されているワード、ハーフワード、またはバイトをメモリにスト
アします。
LDR 命令はメモリに格納されているワード、ハーフワード、またはバイトを Rd にロー
ドします。
このアドレスは、Rn のベースアドレスにオフセットを加算することで検出されます。
レジスタオフセットを使用するハーフワードとバイトのロードは、符号付きまたは符
号なしを指定できます。データは Rd の最下位ワードまたは最下位バイトにロードさ
れ、Rd の残りの部分は、符号なしロードの場合は 0 で、符号付きロードの場合は符号
ビットのコピーで充填されます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-7
Thmub 命令について
ワード / ハーフワード転送でのアドレスアライメント
この転送アドレスには、ワード転送では 4 で、ハーフワード転送では 2 で割り切れる
値を指定する必要があります。
システムにシステムコプロセッサ(cp15)が存在する場合には、アライメントチェッ
クをイネーブルすることができます。アライメントチェックをイネーブルした場合に、
非境界整列の転送が行われると、アライメント例外が発生します。
システムにシステムコプロセッサ(cp15)が存在しない場合、あるいはアライメント
チェックをディセーブルした場合には、以下のようになります。
•
非境界整列のロードによって Rd が更新されます。
•
非境界整列のストアによってメモリが更新されます。更新されるメモリ位置は、
ハーフワードのストアでは [ アドレス AND NOT 0x1] にあるハーフワード、ワー
ドのストアでは [ アドレス AND NOT 0x3] にあるワードとなります。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
LDR
LDRSH
STRB
r2,[r1,r5]
r0,[r0,r6]
r1,[r7,r0]
誤用例
LDR
STRSH
5-8
r13,[r5,r3]
r7,[r3,r1]
; high registers not allowed
; no signed store instruction
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.1.3
LDR と STR:
:pc/sp 相対
レジスタのロードとストアを行います。メモリ内のアドレスは、pc または sp の値から
のイミディエートオフセットとして指定します。
注
pc 相対 STR 命令はありません。
構文
LDR Rd, [pc, #immed_8x4]
LDR Rd, label
LDR Rd, [sp, #immed_8x4]
STR Rd, [sp, #immed_8x4]
説明:
ロード先またはストア先のレジスタを指定します。Rd には r0 ~ r7 のレ
ジスタを指定する必要があります。
Rd
immed_8x4 オフセットを指定します。これは(アセンブリ時)0 ~ 1020 の範囲で 4
の倍数になる式です。
label
プログラム相対式です。詳細については、P. 3-23「レジスタ相対式とプ
ログラム相対式」を参照して下さい。
label は現在の命令より後に、1KB の範囲内に配置する必要があります。
用法
STR 命令はワードをメモリにストアします。
LDR 命令はメモリに格納されているワードをロードします。
このアドレスは pc/sp のベースアドレスにオフセットを加算することで求められます。
pc のビット [1] は無視されます。これによりアドレスがワード境界整列となります。
ワード / ハーフワード転送でのアドレスアライメント
このアドレスには 4 の倍数となる値を指定する必要があります。
システムにシステムコプロセッサ(cp15)が存在する場合には、アライメントチェッ
クをイネーブルすることができます。アライメントチェックをイネーブルした場合に、
非境界整列の転送が行われると、アライメント例外が発生します。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-9
Thmub 命令について
システムにシステムコプロセッサ(cp15)が存在しない場合、あるいはアライメント
チェックをディセーブルした場合には、以下のようになります。
•
非境界整列のロードによって Rd が更新されます。
•
非境界整列のストアによって、4 バイトのメモリが更新されます。更新されるメ
モリ位置は、[ アドレス AND NOT b11] となります。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
LDR
LDR
LDR
STR
r2,[pc,#1016]
r5,localdata
r0,[sp,#920]
r1,[sp,#20]
誤用例
5-10
LDR
r13,[pc,#8]
; Rd must be in range r0-r7
STR
r7,[pc,#64]
; there is no pc-relative STR instruction
STRH
r0,[sp,#16]
; there are no pc- or sp-relative
; halfword or byte transfers
LDR
r2,[pc,#81]
; immediate must be a multiple of four
LDR
r1,[pc,#-24]
; immediate must not be negative
STR
r1,[sp,#1024] ; maximum immediate value is 1020
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.1.4
PUSH と POP
下位レジスタに加え、オプションで lr の値をスタックにプッシュします。
下位レジスタに加え、オプションで pc の値をスタックからポップします。
構文
PUSH {reglist}
POP {reglist}
PUSH {reglist, lr}
POP {reglist, pc}
説明:
reglist
下位レジスタまたは下位レジスタ範囲をカンマで区切ったリストを指定
します。
注
構文内の中括弧({})は命令形式の一部です。レジスタリストがオプショ
ンであることを示すものではありません。
リストには 1 つ以上のレジスタを指定する必要があります。
用法
Thumb スタックにはフル下降スタックが使用されます。スタックには降順にデータが
追加され、sp はスタックに最後に追加されたエントリを指します。
レジスタはスタックに番号順にストアされ、最下位番号のレジスタが最下位アドレス
にストアされます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-11
Thmub 命令について
POP {reglist, pc}
この命令は、スタックから pc にポップされたアドレスへの分岐を発生させます。一般
的には、lr がサブルーチン開始位置でスタックにプッシュされたときのサブルーチンか
らの復帰に使用します。
ARM アーキテクチャのバージョン 5T 以上では:
•
pc にロードされた値のビット [1:0] が b00 の場合、プロセッサは ARM 状態に変
更されます。
•
ビット [1:0] が値 b10 を保持することはできません。
ARM アーキテクチャバージョン 4T 以前では、pc にロードされた値のビット [1:0] が無
視されるため、POP を使用して状態を変更することはできません。
条件フラグ
これらの命令はフラグを変更しません。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
PUSH
PUSH
PUSH
POP
POP
{r0,r3,r5}
{r1,r4-r7}
{r0,LR}
{r2,r5}
{r0-r7,pc}
; pushes r1, r4, r5, r6, and r7
; pop and return from subroutine
誤用例
PUSH
PUSH
PUSH
POP
5-12
{r3,r5-r8}
{}
{r1-r4,pc}
{r1-r4,LR}
;
;
;
;
high registers not allowed
must be at least one register in list
cannot push the pc
cannot pop the LR
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.1.5
LDMIA と STMIA
多重レジスタのロードとストアを行います。
構文
op Rn!, {reglist}
説明:
op
以下のどちらかを指定します。
LDMIA
多重ロード命令、ポストインクリメント
STMIA
多重ストア命令、ポストインクリメント
Rn
ベースアドレスを保持するレジスタを指定します。Rn には r0 ~ r7 の
いずれかのレジスタを指定する必要があります。
reglist
下位レジスタまたは下位レジスタ範囲をカンマで区切ったリストを指定
します。
注
構文内の中括弧({})は命令形式の一部です。レジスタリストがオプショ
ンであることを示すものではありません。
リストには 1 つ以上のレジスタを指定する必要があります。
用法
レジスタのロードとストアは番号順に行われ、最下位番号のレジスタが Rn のアドレス
に最初にロードまたはストアされます。
Rn の値は、reglist に含まれるレジスタの数× 4 でインクリメントされます。
Rn が reglist に含まれる場合:
•
LDMIA 命令では、Rn の最終値はインクリメントされたアドレスではなく、ロー
ドされた値となります。
•
STMIA 命令では、Rn に以下の値がストアされます。
—
Rn が reglist 内で最下位番号のレジスタとなる場合は、Rn の初期値
—
その他の場合は予測不能
アーキテクチャ
これらの命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-13
Thmub 命令について
例
LDMIA
LDMIA
STMIA
STMIA
r3!,
r5!,
r0!,
r3!,
{r0,r4}
{r0-r7}
{r6,r7}
{r3,r5,r7}
誤用例
5-14
LDMIA
r3!,{r0,r9} ; high registers not allowed
STMIA
r5!, {}
STMIA
r5!,{r1-r6} ; value stored from r5 is unpredictable
; must be at least one register
; in list
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.2
Thumb 算術命令
このセクションは以下のサブセクションから構成されています。
•
ADD と SUB:下位レジスタ:P. 5-16
加算と減算を行います。
•
ADD:上位 / 下位レジスタ:P. 5-18
一方または両方が r8 ~ r15 の範囲内にある 2 つのレジスタの値を加算します。
•
ADD と SUB:sp:P. 5-19
sp をイミディエート定数でインクリメント / デクリメントします。
•
ADD:pc/sp 関連:P. 5-20
spまたはpcの値にイミディエート定数を加算し、結果を下位レジスタに返します。
•
ADC、SBC、MUL:P. 5-21
キャリー付きの加算 • 減算 • 乗算を行います。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-15
Thmub 命令について
5.2.1
ADD と SUB:下位レジスタ
:下位レジスタ
加算と減算を行います。下位レジスタに作用するこれらの命令には以下の 3 つの形式
があります。
•
2 つのレジスタの内容を加算または減算し、結果を 3 番目のレジスタに返す。
•
1 つのレジスタの値に対して小さな整数の加算または減算を行い、結果を別のレ
ジスタに返す。
•
1 つのレジスタの値に対して大きな整数の加算または減算を行い、結果を同じレ
ジスタに返す。
構文
op Rd, Rn, Rm
op Rd, Rn, #expr3
op Rd, #expr8
説明:
op
ADD または SUB のどちらかを指定します。
Rd
デスティネーションレジスタです。op Rd,#expr8 命令の第 1 オペラン
ドにも使用されます。
Rn
第 1 オペランドを保持するレジスタを指定します。
Rm
第 2 オペランドを保持するレジスタを指定します。
expr3
アセンブリ時に -7 ~ +7 の範囲内にある整数を求める式です。
expr8
アセンブリ時に -255 ~ +255 の範囲内にある整数を求める式です。
用法
op Rd,Rn,Rm は Rn + Rm または Rn -Rm の演算を実行し、結果を Rd に返します。
op Rd,Rn,#expr3 は Rn + expr3 または Rn - expr3 の演算を実行し、結果を Rd に返し
ます。
op Rd,#expr8はRd + expr8またはRd - expr8の演算を実行し、結果をRdに返します。
5-16
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
注
expr3またはexpr8に負の値を指定したADD命令をアセンブルすると、それに対応する
正の定数を指定した SUB 命令をアセンブルした場合と同じ結果が得られます。expr3
または expr8 に負の値を指定した SUB 命令をアセンブルすると、それに対応する正の
定数を指定した ADD 命令をアセンブルした場合と同じ結果が得られます。
逆アセンブリリストを確認する際は、上記の点に注意して下さい。
制約条件
Rd、Rn、Rm にはいずれも下位レジスタ(r0 ~ r7 の範囲)を指定する必要があります。
条件フラグ
これらの命令は N、Z、C ならびに V フラグを更新します。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
ADD
SUB
ADD
ADD
r3,r1,r5
r0,r4,#5
r7,#201
r1,vc+4
; vc + 4 must evaluate at assembly time to
; an integer in the range -255 to +255
誤用例
ADD r9,r2,r6
SUB r4,r5,#201
SUB r3,#-99
ARM DUI0068BJ-00
; high registers not allowed
; immediate value out of range
; negative immediate values not allowed
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-17
Thmub 命令について
5.2.2
ADD:上位
:上位 / 下位レジスタ
レジスタの値を加算し、結果を第 1 オペランドレジスタに返します。
構文
ADD Rd, Rm
説明:
Rd
デスティネーションレジスタを指定します。第 1 オペランドとしても使
用されます。
Rm
第 2 オペランドを保持するレジスタを指定します。
用法
この命令は Rd と Rm の値を加算し、結果を Rd に返します。
注
RdとRmが両方とも下位レジスタの場合、ADD Rd,Rm命令をアセンブルしたときの結果
は ADD Rd,Rd,Rm 命令と同じです(P. 5-16「ADD と SUB:下位レジスタ」参照)。
逆アセンブリリストを確認する際は、上記の点に注意して下さい。
条件フラグ
条件フラグ N、Z、C、V:
•
Rd および Rm の両方が下位レジスタの場合は更新されます。
•
その他の場合は更新されません。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
ADD
ADD
ADD
ADD
5-18
r12,r4
r10,r11
r0,r8
r2,r4
; equivalent to ADD r2,r2,r4. Does affect flags.
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.2.3
ADD と SUB:
:sp
sp をイミディエート定数でインクリメント / デクリメントします。
構文
ADD sp, #expr
SUB sp, #expr
説明:
アセンブリ時に -508 ~ +508 の範囲で 4 の倍数となる値を求める式です。
expr
用法
この命令は expr の値を Rp の値に加算し、結果を Rd に返します。
注
expr に負の値を指定した ADD 命令をアセンブルすると、それに対応する正の定数を指
定した SUB 命令をアセンブルした場合と同じ結果が得られます。expr に負の値を指
定した SUB 命令をアセンブルすると、それに対応する正の定数を指定した ADD 命令を
アセンブルした場合と同じ結果が得られます。
逆アセンブリリストを確認する際は、上記の点に注意して下さい。
条件フラグ
この命令はフラグを変更しません。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
ADD sp,#312
SUB sp,#96
SUB sp,#abc+8
ARM DUI0068BJ-00
; abc + 8 must evaluate at assembly time to
; a multiple of 4 in the range –508 to +508
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-19
Thmub 命令について
5.2.4
ADD:
:pc/sp 関連
sp または pc の値にイミディエート定数を加算し、結果を下位レジスタに返します。
構文
ADD Rd, Rp, #expr
説明:
Rd
デスティネーションレジスタを指定します。Rd には r0 ~ r7 のいずれ
かのレジスタを指定する必要があります。
Rp
sp または pc のどちらかを指定します。
expr
アセンブリ時に 0 ~ 1020 の範囲で 4 の倍数となる値を求める式です。
用法
この命令は Rp の値を expr の値に加算し、結果を Rd に返します。
注
Rp が pc の場合は、以下の値が使用されます。
(現在の命令のアドレス + 4)AND &FFFFFFFC
条件フラグ
この命令はフラグを変更しません。
アーキテクチャ
この命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
ADD r6,sp,#64
ADD r2,pc,#980
ADD r0,pc,#lit-{PC} ; lit - {PC} must evaluate, at assembly
; time, to a multiple of 4 in the range
; 0 to 1020
5-20
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.2.5
ADC、
、SBC、
、MUL
キャリー付きの加算 • 減算 • 乗算を行います。
構文
op Rd, Rm
説明:
op
ADC、SBC、MUL のいずれかを指定します。
Rd
デスティネーションレジスタを指定します。このレジスタは第 1 オペラ
ンドも保持します。
Rm
第 2 オペランドを保持するレジスタを指定します。
用法
ADC は Rd と Rm の値をキャリーフラグと一緒に加算し、結果を Rd に返します。この命令
は複数ワードの加算を合成する目的で使用します。
SBCはキャリーフラグを確認した上でRdの値からRmの値を減算し、結果をRdに返しま
す。この命令を使用して複数ワードの減算を合成することができます。
MUL は Rd と Rm の値を乗算し、結果を Rd に返します。
制約条件
Rd、および Rm は下位レジスタ(r0 ~ r7 の範囲)を指定する必要があります。
条件フラグ
ADC および SBC は N、Z、C、V フラグを更新します。
MUL は N フラグと Z フラグを更新します。
ARM アーキテクチャバージョン 4 以前の場合、MUL により C フラグと V フラグが更
新されます。ARM アーキテクチャバージョン 5 以上の場合、MUL は C フラグと V フ
ラグを更新しません。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
ADC r2,r4
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-21
Thmub 命令について
5.3
Thumb 汎用データ処理命令
このセクションは以下のサブセクションから構成されています。
•
AND、ORR、EOR、BIC:P. 5-23
ビットごとの論理演算
•
ASR、LSL、LSR、ROR:P. 5-24
シフト / ロテート演算
•
CMP と CMN:P. 5-26
比較および負数比較
•
MOV、MVN、NEG:P. 5-28
移動、1 の補数の移動、1 の補数化
•
TST:P. 5-30
ビットテスト
5-22
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.3.1
AND、
、ORR、
、EOR、
、BIC
ビットごとの論理演算を行います。
構文
op Rd, Rm
説明:
op
AND、ORR、EOR、BIC のいずれかを指定します。
Rd
デスティネーションレジスタを指定します。第 1 オペランドも含まれま
す。Rd には r0 ~ r7 のいずれかのレジスタを指定する必要があります。
Rm
第 2 オペランドを保持するレジスタを指定します。Rm には r0 ~ r7 の
いずれかのレジスタを指定する必要があります。
用法
これらの命令は Rd と Rm の内容に対してビットごとの論理演算を行い、結果を Rd に
返します。処理する演算は以下のとおりです。
•
AND 命令は論理積演算を行います。
•
ORR 命令は論理和演算を行います。
•
EOR 命令は排他的論理和演算を行います。
•
BIC 命令は Rd AND NOT Rm の演算を行います。
条件フラグ
これらの命令は、演算結果に基づいて N フラグと Z フラグを更新します。C フラグと
V フラグは影響を受けません。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
AND r2,r4
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-23
Thmub 命令について
5.3.2
ASR、
、LSL、
、LSR、
、ROR
シフト演算およびロテート演算を行います。これらの命令では、レジスタに含まれる
値、またはイミディエートシフト値を使用できます。
構文
op Rd, Rs
op Rd, Rm, #expr
説明:
以下のいずれかを指定します。
ASR
算術右シフト。レジスタの内容は、2 の補数の符号付き整数
として処理されます。符号ビットはシフト後の空きビットに
コピーされます。
LSL
算術左シフト。シフト後の空きビットはクリアされます。
LSR
算術右シフト。シフト後の空きビットはクリアされます。
ROR
右ロテート。レジスタの右端からあふれたビットがレジスタ
の左端にロテートされます。
op
注
ROR はレジスタ制御シフトだけに使用できます。
Rd
デスティネーションレジスタを指定します。レジスタ制御シフトのソー
スレジスタとしても使用されます。Rd には r0 ~ r7 のいずれかのレジ
スタを指定する必要があります。
Rs
レジスタ制御シフトで使用されるシフト値を保持するレジスタを指定し
ます。Rmには r0 ~ r7 のいずれかのレジスタを指定する必要があります。
Rm
イミディエートシフトに使用されるソースレジスタです。Rm には r0 ~
r7 のいずれかのレジスタを指定する必要があります。
expr
イミディエートシフト値を指定します。アセンブリ時に以下の範囲内に
ある整数を求める式です。
•
op が LSL の場合:0 ~ 31
•
5-24
その他の場合:1 ~ 32
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
レジスタ制御シフト
これらの命令は Rd の値を取得し、シフト処理を行った後、結果を Rd に返します。
Rs の最下位バイトのみがシフト値に使用されます。
ROR を除く全ての命令において:
•
•
シフト値が 32 の場合は Rd がクリアされ、シフトアウトされた最後のビットが C
フラグに設定されます。
シフト値が 32 より大きい場合、Rd と C フラグがクリアされます。
イミディエートシフト
これらの命令は Rm の値を取得し、シフト処理を行った後、結果を Rd に返します。
条件フラグ
これらの命令は演算結果に基づいて N フラグと Z フラグを更新します。V フラグは影
響を受けません。
C フラグは:
•
シフト値が 0 の場合は、更新されません。
•
シフト値が 0 以外の場合は、ソースレジスタからシフトアウトされた最後のビッ
トを保持します。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
ASR r3,r5
LSR r0,r2,#6
LSR r5,r5,av
LSL r0,r4,#0
; av must evaluate, at assembly time, to an
; integer in the range 1-32.
; same as MOV r0,r4 except that C and V
; flags are not affected
誤用例
ROR
LSL
LSL
ASR
ARM DUI0068BJ-00
r2,r7,#3
r9,r1
r0,r7,#32
r0,r7,#0
;
;
;
;
ROR cannot use immediate shift value
high registers not allowed
immediate shift out of range
immediate shift out of range
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-25
Thmub 命令について
5.3.3
CMP と CMN
比較および負数比較を実行します。
構文
CMP Rn, #expr
CMP Rn, Rm
CMN Rn, Rm
説明:
Rn
第 1 オペランドを保持するレジスタを指定します。
expr
アセンブリ時に 0 ~ 255 の範囲内にある整数を求める式です。
Rm
第 2 オペランドを保持するレジスタを指定します。
用法
これらの命令は条件フラグを更新しますが、結果をレジスタに返しません。
CMP 命令は、Rn の値から expr または Rm の値を減算します。
CMN 命令は、Rm と Rn の値を加算します。
制約条件
CMP Rn,#expr 命令、および CMN 命令では、Rn と Rm に r0 ~ r7 の範囲内にあるレジスタ
を指定する必要があります。
CMP Rn,Rm命令では、RnとRmにr0~r15の任意のレジスタを指定することができます。
条件フラグ
これらの命令は演算結果に基づいて N、Z、C、V フラグを更新します。
アーキテクチャ
これらの命令は、アーキテクチャの全ての T バリアントで利用できます。
5-26
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
例
CMP r2,#255
CMP r7,r12
CMN r1,r5
; high register IS allowed with CMP Rn,Rm
誤用例
CMP r2,#508
CMP r9,#24
CMN r0,r10
ARM DUI0068BJ-00
; immediate value out of range
; high register not allowed with #expr
; high register not allowed with CMN
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-27
Thmub 命令について
5.3.4
MOV、
、MVN、
、NEG
移動、1 の補数の移動、1 の補数化を行います。
構文
MOV Rd, #expr
MOV Rd, Rm
MVN Rd, Rm
NEG Rd, Rm
説明:
Rd
デスティネーションレジスタを指定します。
expr
アセンブリ時に 0 ~ 255 の範囲内にある整数を求める式です。
Rm
ソースレジスタを指定します。
用法
MOV 命令は #expr、または Rm の値を Rd に配置します。
MVN 命令はRm値を取得し、ビットごとの論理NOTを実行した後、結果をRd に返します。
NEG 命令は Rm の値にマイナス 1 を乗算し、結果を Rd に返します。
制約条件
MOV Rd,#expr、MVN、ならびに NEG 命令では、Rd と Rm に r0 ~ r7 の範囲内にあるレジス
タを指定する必要があります。
MOV Rd, Rm 命令では、Rd と Rm に r0 ~ r15 の任意レジスタを指定できますが、詳細は
P. 5-29「条件フラグ」を参照して下さい。
5-28
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
条件フラグ
MOV Rd,#expr 命令および MVN 命令は、N フラグと Z フラグを更新します。C フラグま
たは V フラグは影響を受けません。
NEG 命令は N、Z、C、V フラグを更新します。
MOV Rd, Rm は以下のように動作します。
•
Rd、Rm のどちらかが上位レジスタ(r8 ~ r15)の場合、フラグは更新されません。
•
Rd と Rm の両方が下位レジスタ(r0 ~ r7)の場合、C フラグと V フラグがクリ
アされます。
注
シフト値 0 で LSL を使用することで、C フラグと V フラグをクリアせずに下位
レジスタ間の移動を行うことができます(P. 5-24「ASR、LSL、LSR、ROR」参照)。
アーキテクチャ
これらの命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
MOV
MOV
MVN
NEG
r3,#0
r0,r12
r7,r1
r2,r2
; does not update flags
誤用例
MOV
MOV
MVN
NEG
ARM DUI0068BJ-00
r2,#256
r8,#3
r8,r2
r0,#3
;
;
;
;
immediate value out of range
cannot move immediate to high register
high registers not allowed with MVN or NEG
immediate value not allowed with MVN or NEG
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-29
Thmub 命令について
5.3.5
TST
ビットのテストを行います。
構文
TST Rn, Rm
説明:
Rn
第 1 オペランドを保持するレジスタを指定します。
Rm
第 2 オペランドを保持するレジスタを指定します。
用法
この命令は、Rm と Rn の値に対してビットごと AND 演算を行います。この命令は条件
フラグを更新しますが、結果はレジスタに返しません。
制約条件
Rn と Rm には r0 ~ r7 の範囲内にあるレジスタを指定する必要があります。
条件フラグ
この命令は演算結果に基づいて N フラグと Z フラグを更新します。C フラグと V フラ
グは影響を受けません。
アーキテクチャ
この命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
TST r2,r4
5-30
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.4
Thumb 分岐命令
このセクションは以下のサブセクションから構成されています。
•
B:P. 5-32
分岐
•
BL:P. 5-34
リンク付き分岐
•
BX:P. 5-35
分岐と命令セットの変換
•
BLX:P. 5-36
リンク付き分岐と命令セットの変換
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-31
Thmub 命令について
5.4.1
B
分岐を行います。Thumb 命令セットで条件付きにできるのはこの命令だけです。
構文
B{cond} label
説明:
cond
オプションの条件コードを指定します(P. 5-33 表 5-2 参照)。
label
プログラム相対式です。通常は同一コード片内のラベルを指定します。
詳細については、P. 3-23「レジスタ相対式とプログラム相対式」を参照
して下さい。
label は以下の範囲内に配置する必要があります。
•
cond を使用する場合は、現在の命令から -252 ~ +258 バイト以内
•
命令が無条件の場合は、±2KB 以内
用法
cond が満たされた場合、または cond が使用されていない場合には、B 命令によって
label への分岐が発生します。
注
label は上記の指定された範囲内に配置する必要があります。ARM リンカでは、コー
ドを追加して長い分岐を生成することはできません。
アーキテクチャ
この命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
B
dloop
BEQ sectB
5-32
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
表 5-2 Thumb B 命令の条件コード
ARM DUI0068BJ-00
接頭文字
フラグ
意味
EQ
Z セット
等
NE
Z クリア
不等
CS/HS
C セット
以上(符号なし >=)
CC/LO
C クリア
未満(符号なし <)
MI
N セット
否定
PL
N クリア
正または 0
VS
V セット
オーバフロー
VC
V クリア
オーバフローなし
HI
C セットかつ Z クリア
より大きい(符号なし >)
LS
C クリアまたは Z セット
以下(符号なし <=)
GE
N と V は等しい
符号付き >=
LT
N と V は等しくない
符号付き <
GT
Z クリア、かつ N と V が等しい
符号付き >
LE
Z をセット、または N と V が異なる 符号付き <=
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-33
Thmub 命令について
5.4.2
BL
リンク付き分岐を行います。
構文
BL label
説明:
label
プログラム相対式です。詳細については、P. 3-23「レジスタ相対式とプ
ログラム相対式」を参照して下さい。
用法
BL 命令は、次の命令のアドレスを r14(lr:リンクレジスタ)にコピーし、label への
分岐を発生させます。
マシンレベルの命令では、現在の命令から ±4Mb 離れたアドレスに分岐することはで
きません。必要に応じ、ARM リンカは長い分岐を見越してコード(ベニア)を挿入し
ます(ADS リンカ / ユーティリティガイドの「ARM リンカ」を参照)。
アーキテクチャ
この命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
BL
5-34
extract
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.4.3
BX
分岐を実行し、オプションで命令セットを変換します。
構文
BX Rm
説明:
分岐先アドレスを保持する ARM レジスタを指定します。
Rm
Rm のビット 0 は、アドレスの一部として使用されません。
Rm のビット 0 がクリアされている場合:
•
ビット 1 も同様にクリアする必要があります。
•
この命令で CPSR の T フラグがクリアされ、デスティネーション
のコードが ARM コードとして解釈されます。
用法
BX 命令は、Rm に保持されているアドレスへの分岐を発生させ、Rm のビット 0 がセット
されている場合に命令セットを Thumb に変更します。
アーキテクチャ
この命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
BX
ARM DUI0068BJ-00
r5
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-35
Thmub 命令について
5.4.4
BLX
リンク付き分岐を実行し、オプションで命令セットを変換します。
構文
BLX Rm
BLX label
説明:
分岐先アドレスを保持する ARM レジスタを指定します。
Rm
Rm のビット 0 は、アドレスの一部として使用されません。Rm のビット 0 が
クリアされている場合:
label
•
ビット 1 も同様にクリアする必要があります。
•
この命令により CPSR の T フラグがクリアされます。デスティネー
ションのコードは ARM コードとして解釈されます。
プログラム相対式です。詳細については、P. 3-23「レジスタ相対式とプ
ログラム相対式」を参照して下さい。
BLX label を使用すると、必ず ARM 状態への切り替えが発生します。
用法
BLX は:
•
次の命令のアドレスを r14(lr:リンクレジスタ)にコピーします。
•
label、または Rm に保持されているアドレスへの分岐を発生させます。
•
以下の場合に、命令セットを ARM に変更します。
—
—
Rm のビット 0 がクリアされている場合
BLX label 形式が使用されている場合
マシンレベルの命令では、現在の命令から ±4Mb の範囲内にないアドレスに分岐する
ことはできません。必要に応じ、ARM リンカは長い分岐を見越してコード(ベニア)
を挿入します。(ADS リンカ / ユーティリティガイドの「ARM リンカ」を参照)。
アーキテクチャ
この命令は、ARM アーキテクチャバージョン 5 以上の全ての T バリアントで利用でき
ます。
例
BLX r6
BLX armsub
5-36
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.5
Thumb ソフトウェア割り込み命令とブレークポイント命令
このセクションは以下のサブセクションから構成されています。
•
SWI
•
5.5.1
BKPT:P. 5-38
SWI
ソフトウェア割り込みを実行します。
構文
SWI immed_8
説明:
immed_8
アセンブリ時に 0 ~ 255 の範囲内にある整数を求める式です。
用法
SWI によって SWI 例外が発生します。つまり、プロセッサ状態が ARM に切り替わり、プ
ロセッサモードがスーパーバイザモードに変更され、CPSR がスーパーバイザモードの
SPSR に保存され、SWI ベクタへの分岐が実行されます(ADS デベロッパガイドの「プ
ロセッサ例外処理」を参照)。
immed_8はプロセッサに無視されますが、
命令オペコードのビット [7:0]に存在します。
例外ハンドラはこの式を検索し、現在要求されている処理を決定することができます。
条件フラグ
この命令はフラグを変更しません。
アーキテクチャ
この命令は、ARM アーキテクチャの全ての T バリアントで利用できます。
例
SWI 12
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-37
Thmub 命令について
5.5.2
BKPT
ブレークポイント命令です。
構文
BKPT immed_8
説明:
immed_8
アセンブリ時に 0 ~ 255 の範囲内にある整数を求める式です。
用法
BKPT 命令は、プロセッサをデバッグモードに入れます。デバッグツールは、特定アド
レスの命令に達したときに、このモードでシステムを調査できます。
immed_8はプロセッサに無視されますが、命令オペコードのビット [7:0] に存在します。
デバッガはこの式を使用してブレークポイントに関する追加情報を格納することがで
きます。
アーキテクチャ
この命令は、ARM アーキテクチャバージョン 5 以上の全ての T バリアントで利用でき
ます。
例
BKPT
BKPT
5-38
67
2_10110
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.6
Thumb 擬似命令
ARM アセンブラは多くの Thumb 擬似命令をサポートしており、アセンブリ時に適切な
Thumb 命令に変換します。
Thumb 状態で使用できる擬似命令を以下のサブセクションで説明します。
ARM DUI0068BJ-00
•
ADR Thumb 擬似命令:P. 5-40
•
LDR Thumb 擬似命令:P. 5-41
•
NOP Thumb 擬似命令:P. 5-43
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-39
Thmub 命令について
5.6.1
ADR Thumb 擬似命令
ADR 擬似命令は、プログラム相対アドレスをレジスタにロードします。
構文
ADR register, expr
説明:
register
ロード先のレジスタを指定します。
expr
プログラム相対式です。オフセットは正の値で 1KB 未満にする必要があ
ります。expr はローカルで定義する必要があり、インポートすること
はできません。
用法
Thumb 状態では、ADR が生成できるのはワード境界整列のアドレスだけです。expr を
整列させるには ALIGN ディレクティブを使用します(P. 7-50「ALIGN」参照)。
exprにはADR擬似命令と同じコードセクション内のアドレスを求める式を指定する必
要があります。アドレスが別の ELF セクションに存在する場合、このアドレスがリン
ク後も範囲内にあるとは限りません。
例
txampl
5-40
ADR
; code
ALIGN
DCW
r4,txampl
; => ADD r4,pc,#nn
0,0,0,0
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.6.2
LDR Thumb 擬似命令
LDR 擬似命令は、以下のどちらかを下位レジスタにロードします。
•
32 ビット定数値
•
アドレス
注
ここでは、LDR 疑似命令についてのみ説明します。LDR 命令の詳細については、P. 5-4
「Thumb メモリアクセス命令」を参照して下さい。
構文
LDR register, =[expr | label-exp]
説明:
register
ロード先のレジスタを指定します。LDR は下位レジスタ(r0 ~ r7)にし
かアクセスできません。
expr
数値定数を求める式を指定します。
•
expr の値が MOV 命令の範囲内にある場合に、アセンブラがこの命
令を生成します。
•
expr の値が MOV 命令の範囲外にある場合、アセンブラは定数をリ
テラルプールに配置し、次にリテラルプールからこの値を読み込
むプログラム相対 LDR 命令を生成します。
label-exp プログラム相対式または外部式を指定します。アセンブラは label-exp
の値をリテラルプールに配置し、次にリテラルプールからこの値をロー
ドするプログラム相対 LDR 命令を生成します。
label-exp が外部式の場合、または現在のセクションに含まれていない
場合には、アセンブラはリンカ再配置ディレクティブをオブジェクト
ファイル内に配置します。リンカはリンク時に正しいアドレスが生成さ
れていることを確認します。
pc からリテラルプール内の値へのオフセットは、1KB 未満の正の値でなければなりま
せん。リテラルプールが範囲内にあることを必ず確認して下さい。詳細については
P. 7-14「LTORG」を参照して下さい。
用法
LDR 疑似命令は、主に以下の 2 つの目的で使用します。
•
ARM DUI0068BJ-00
イミディエート値が MOV 命令の範囲外のためレジスタに移動できない場合に、リ
テラル定数を生成する。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-41
Thmub 命令について
•
プログラム相対アドレスまたは外部アドレスをレジスタにロードする。このアド
レスは、LDR を含む ELF セクションをリンカがどこに配置するかに関係なく有
効です。
例
5-42
LDR
r1, =0xfff
; loads 0xfff into r1
LDR
r2, =labelname
; loads the address of labelname into r2
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Thmub 命令について
5.6.3
NOP Thumb 擬似命令
NOP は適切な Thumb 無演算命令を生成します。
以下の命令が使用される可能性がありますが、保証はしません。
MOV r8,r8
構文
NOP の構文は以下の通りです。
NOP
条件フラグ
NOP は ALU ステータスフラグを変更しません。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
5-43
Thmub 命令について
5-44
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
第6章
ベクタ浮動小数点プログラミング
本章では、アセンブリ言語でのベクタ浮動小数点プログラミングについて説明します。
本章は以下のセクションから構成されています。
•
ベクタ浮動小数点コプロセッサ:P. 6-4
•
•
•
•
•
•
•
•
浮動小数点レジスタ:P. 6-5
ベクタ演算とスカラ演算:P. 6-7
VFP と条件コード:P. 6-8
VFP システムレジスタ:P. 6-10
ゼロフラッシュモード:P. 6-13
VFP 命令:P. 6-15
VFP 擬似命令:P. 6-38
VFP ディレクティブとベクタ表記:P. 6-40
各命令を説明しているページ番号については P. 6-2 表 6-1 を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-1
ベクタ浮動小数点プログラミング
表 6-1 各 VFP 命令のページ番号
ニーモニック 機能
ページ
演算
アーキテクチャ
FABS
絶対値
P. 6-16
ベクタ
全て
FADD
加算
P. 6-18
ベクタ
全て
FCMP
比較
P. 6-19
スカラ
全て
FCPY
コピー
P. 6-16
ベクタ
全て
FCVTDS
単精度から倍精度への変換
P. 6-20
スカラ
全て
FCVTSD
倍精度から単精度への変換
P. 6-21
スカラ
全て
FDIV
除算
P. 6-22
ベクタ
全て
FLD
ロード(P. 6-38「FLD 擬似命令」参照)
P. 6-23
スカラ
全て
FLDM
多重ロード
P. 6-25
-
全て
FMAC
積和演算
P. 6-27
スカラ
全て
FMDHR,
FMDLR
1 つの ARM レジスタから倍精度レジスタ半分への転送 P. 6-30
スカラ
全て
FMDRR
2 つの ARM レジスタから倍精度レジスタへの転送
P. 6-29
スカラ
VFPv2
FMRDH,
FMRDL
倍精度レジスタ半分から ARM レジスタへの転送
P. 6-30
スカラ
全て
FMRRD
倍精度レジスタの 2 つの ARM レジスタへの転送
P. 6-29
スカラ
VFPv2
FMRRS
2 つの ARM レジスタと 2 つの単精度レジスタ間の転送 P. 6-32
スカラ
VFPv2
FMRS
単精度レジスタから ARM レジスタへの転送
P. 6-31
スカラ
全て
FMRX
VFP システムレジスタから ARM レジスタへの転送
P. 6-33
-
全て
FMSC
積減演算
P. 6-27
ベクタ
全て
FMSR
ARM レジスタから単精度レジスタへの転送
P. 6-31
スカラ
全て
FMSRR
2 つの ARM レジスタと 2 つの単精度レジスタ間の転送 P. 6-32
スカラ
VFPv2
FMSTAT
VFP ステータスフラグの ARM CPSR ステータスフラグ P. 6-33
への転送
-
全て
FMUL
乗算
P. 6-34
ベクタ
全て
FMXR
ARM レジスタから VFP システムレジスタへの転送
P. 6-33
-
全て
6-2
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
表 6-1 各 VFP 命令のページ番号(続き)
命令のページ番号(続き)
ニーモニック 機能
ページ
演算
アーキテクチャ
FNEG
否定
P. 6-16
ベクタ
全て
FNMAC
否定積和演算
P. 6-27
ベクタ
全て
FNMSC
否定積減演算
P. 6-27
ベクタ
全て
FNMUL
否定乗算
P. 6-34
ベクタ
全て
FSITO
符号付き整数の浮動小数点への変換
P. 6-35
スカラ
全て
FSQRT
平方根
P. 6-36
ベクタ
全て
FST
ストア
P. 6-23
スカラ
全て
FSTM
多重ストア
P. 6-25
-
全て
FSUB
減算
P. 6-18
ベクタ
全て
FTOSI,
FTOUI
浮動小数点の符号付き / 符号なし整数への変換
P. 6-37
スカラ
全て
FUITO
符号なし整数の浮動小数点への変換
P. 6-35
スカラ
全て
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-3
ベクタ浮動小数点プログラミング
6.1
ベクタ浮動小数点コプロセッサ
ベクタ浮動小数点(VFP)コプロセッサは関連サポートコードと組み合わせることで、
ANSI/IEEE 規格 .754-1985 IEEE Standard for Binary Floating-point Arithmetic(2 進浮動小
数点演算の IEEE 規格)で定義されている単精度および倍精度の浮動小数点演算を実行
します。本章では同規格を「IEEE 754 規格」と記載しています。この規格の概要につ
いては、ADS コンパイラ / ライブラリガイドの浮動小数点に関する章を参照して下さい。
ベクタ浮動小数点プロセッサは最大8個の単精度数値、または4個の倍精度数値のショー
トベクタを特に効率的に処理します。これらのベクタではほとんどの算術命令を使用す
ることができ、SIMD(単一命令、多重データ)並行処理が可能となります。さらに、
浮動小数点のロード / ストア命令には複数のレジスタ形式があり、メモリとの間でベク
タを効率的に転送することができます。
ベクタ浮動小数点コプロセッサの詳細については ARM Architecture Reference Manual を
参照して下さい。
6.1.1
VFP アーキテクチャ
VFP アーキテクチャには 2 つのバージョンがあります。VFPv2 は VFPv1 がサポートし
ている全ての命令に加え、新たに 4 つの命令をサポートしています。
新しく追加されたこれらの命令により、ARM レジスタと VFP レジスタとの間で 2 つの
32 ビットワードを 1 度の命令で転送することができます。
6-4
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.2
浮動小数点レジスタ
ベクタ浮動小数点コプロセッサには、s0 ~ s31 の 32 個の単精度レジスタがあります。
各レジスタは、単精度浮動小数点値、または 32 ビット整数を保持することができます。
これら 32 個のレジスタは、d0 ~ d15 の 16 個の倍精度レジスタとして処理されること
もあります。dn は s(2n) および s(2n+1) と同じハードウェアを占有します。
ユーザは以下を使用することができます。
•
いくつかのレジスタは、倍精度値の演算に使用しながら同時に単精度値の演算に
も使用できます。
•
使用時を区別すれば、同じレジスタを精度値と倍精度値のどちらの演算にも使用
できます。
対応する単精度レジスタと倍精度レジスタは同時に使用しないで下さい。破損が生じ
ることはありませんが、結果は無意味な値となります。
6.2.1
レジスタバンク
VFP レジスタは、以下で構成される 4 つのバンクに配列されます。
•
s0 ~ s7、s8 ~ s15、s16 ~ s23、s24 ~ s31 の 8 個の単精度レジスタ
•
d0 ~ d3、d4 ~ d7、d8 ~ d11、d12 ~ d15 の 4 個の倍精度レジスタ
•
単精度レジスタと倍精度レジスタの任意の組み合わせ
詳細については図 6-1 を参照して下さい。
図 6-1 VFP レジスタバンク
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-5
ベクタ浮動小数点プログラミング
6.2.2
ベクタ
1 つのベクタは、同一バンクに含まれる最大 8 個の単精度レジスタ、または 4 個の倍精
度レジスタを使用することができます。ベクタに使用されるレジスタの数は、FPSCR の
LEN ビットで制御されます(P. 6-10「FPSCR:浮動小数点ステータス / 制御レジスタ」参
照)
。
ベクタは任意のレジスタから開始することができます。ベクタが使用する最初のレジ
スタは、各命令のレジスタフィールドで指定します。
ベクタラップアラウンド
ベクタがバンク終端を越えると、同バンクの先頭にラップアラウンドされます。例:
•
長さ 6 のベクタを s5 から開始する場合、{s5, s6, s7, s0, s1, s2}
•
長さ 3 のベクタを s15 から開始する場合、{s15, s8, s9}
•
長さ 4 のベクタを s22 から開始する場合、{s22, s23, s16, s17}
•
長さ 2 のベクタを d7 から開始する場合、{d7, d4}
•
長さ 3 のベクタを d10 から開始する場合、{d10, d11, d8}
1 つのベクタに複数バンクからのレジスタを含めることはできません。
ベクタストライド
上記の例が示すように、ベクタは連続レジスタを使用することも、別のレジスタを使
用することもできます。どちらを使用するかは、FPSCR の STRIDE ビットで制御され
ます(P. 6-10「FPSCR:浮動小数点ステータス / 制御レジスタ」参照)。例:
•
長さ 3、ストライド 2 のベクタを s1 から開始する場合、{s1, s3, s5}
•
長さ 4、ストライド 2 のベクタを s6 から開始する場合、{s6, s0, s2, s4}
•
長さ 2、ストライド 2 のベクタを d1 から開始する場合、{d1, d3}
ベクタ長の制約条件
ベクタに同じレジスタを 2 度使用することはできません。ベクタのラップアラウンド
を考慮し、以下を使用することはできません。
•
長さが 4 を超える、ストライド 2 の単精度ベクタ
6-6
•
長さが 4 を超える、ストライド 1 の倍精度ベクタ
•
長さが 2 を超える、ストライド 2 の倍精度ベクタ
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.3
ベクタ演算とスカラ演算
VFP 算術命令を利用して、以下の演算を実行することができます。
•
•
•
スカラ
ベクタ
スカラとベクタ
FPSCR の LEN ビットを使用して、ベクタ長の制御を行いうことができます(P. 6-10
「FPSCR:浮動小数点ステータス / 制御レジスタ」参照)。
LEN が 1 の場合、全ての演算がスカラで処理されます。
6.3.1
スカラ演算、ベクタ演算、スカラ • ベクタ混合演算の制御
LEN が 1 を超える場合、
算術演算の動作は、
使用するデスティネーションレジスタとオペ
ランドレジスタが格納されているレジスタバンクによって異なります(P. 6-5「レジス
タバンク」参照)。
以下の汎用形式の命令は、
Op
Op
Fd,Fn,Fm
Fd,Fm
次のように動作します。
•
Fd が第 1 レジスタバンク(s0 ~ s7 または d0 ~ d3)にある場合には、スカラ演
算が実行されます。
•
Fm が第 1 レジスタバンクにあり、Fd が第 1 レジスタバンク以外にある場合には、
混合演算が実行されます。
•
Fm、Fd ともに第 1 レジスタバンクに含まれない場合には、ベクタ演算が実行さ
れます。
スカラ演算
OpはFmの値と、
Fnを指定している場合はFnの値を演算します。結果はFdに返されます。
ベクタ演算
OpはFmで始まるベクタ内の値と、Fnを指定している場合はFnで始まるベクタ内の値を
演算します。結果は Fd で始まるベクタ内に配置されます。
スカラとベクタの混合演算
オペランドが 1 つの命令では、Op は Fm の値のみを演算します。結果の LEN コピーが
Fd で始まるベクタ内に配置されます。
複数のオペランドを使用する命令では、Op は Fm の 1 つの値と、Fn で始まるベクタ内
の値を演算します。演算結果は Fd で始まるベクタ内に配置されます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-7
ベクタ浮動小数点プログラミング
6.4
VFP と条件コード
条件コードを使用して、任意の VFP 命令の実行を制御できます。制御される命令は、
他の全ての ARM 命令とほぼ同様の方法で、CPSR のステータスフラグに基づいて条件
付きで実行されます。
ステータスフラグの更新に使用できる VFP 命令は FCMP だけです。FCMP は CPSR のフ
ラグを直接更新することはなく、FPSCR 内の別のフラグセットを更新します(P. 6-10
「FPSCR:浮動小数点ステータス / 制御レジスタ」参照)。
注
これらのフラグを使用して条件付き VFP 命令を含む条件付き命令を制御するには、初
めに FMSTAT 命令を使用してこれらのフラグを CPRS にコピーする必要があります
(P. 6-33「FMRX、FMXR、FMSTAT」参照)。
FCMP命令を実行する場合、これらのフラグの厳密な意味はARMデータ処理命令に使用
されるフラグと異なります。この原因としては以下が考えられます。
•
浮動小数点の値が符号なしになることがないため、符号なし条件が不要である。
•
非数(NaN)値には、数字や別の非数値との順序関係がないため、不順結果を見
越して追加条件を設定する必要がある。
表 6-2 は、条件コードのニーモニックの意味を示しています。
表 6-2 条件コード
ニーモニック
ARM データ処理命令後の意味
VFP FCMP 命令後の意味
EQ
等
等
NE
不等
不等、または不順
CS / HS
キャリーセット / 符号なし以上
以上または不順
CC / LO
キャリークリア / 符号なし未満
未満
MI
否定
未満
PL
正または 0
以上または不順
VS
オーバフロー
不順(最低 1 つの NaN オペランド)
VC
オーバフローなし
非不順
6-8
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
表 6-2 条件コード(続き)
条件コード(続き)
ニーモニック
ARM データ処理命令後の意味
VFP FCMP 命令後の意味
HI
符号なし超過
超過、または不順
LS
符号なし未満
未満
GE
符号付き以上
以上
LT
符号付き未満
未満または不順
GT
符号付き超過
超過
LE
符号付き未満
未満、または不順
AL
常時(通常は省略)
常時(通常は省略)
注
CPSR のフラグを最後に更新した命令のタイプによって、条件コードの意味が決定され
ます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-9
ベクタ浮動小数点プログラミング
6.5
VFP システムレジスタ
VFPの全実装で以下に示す3つのVFPシステムレジスタにアクセスすることが可能です。
•
FPSCR:浮動小数点ステータス / 制御レジスタ
•
FPEXC:浮動小数点例外レジスタ:P. 6-12
•
浮動小数点システム ID レジスタ(FPSID):P. 6-12
特定 VFP が実装されていると、レジスタを追加することができます(使用している VFP
コプロセッサのリファレンスマニュアルを参照)。
6.5.1
FPSCR:浮動小数点ステータス
:浮動小数点ステータス / 制御レジスタ
FPSCR は全てのユーザレベルの VEP ステータスビットと制御ビットを保持します。
ビット [31:28]
N、Z、C、V フラグです。これらは VFP ステータスフラグで、CPSR の
ステータスフラグにコピーされるまで、条件付き実行の制御に使用する
ことはできません(P. 6-8「VFP と条件コード」参照)。
ビット [24]
ゼロフラッシュモードの制御ビットです。
0
ゼロフラッシュモードがディセーブルされます。
1
ゼロフラッシュモードがイネーブルされます。
ゼロフラッシュモードにより、使用するハードウェアおよびソフトウェ
アによっては、占有範囲は大きくなるもののパフォーマンスを向上させ
ることができます(P. 6-13「ゼロフラッシュモード」参照)。
注
ゼロフラッシュモードは、IEEE 754 で定義されている互換性を要件とす
る場合には使用しないで下さい。
ビット [23:22]
以下のように丸めモードを制御します。
0b00
近似値への丸め(RN)モード
0b01
正無限大への丸め(RP)モード
0b10
負無限大への丸め(RM)モード
0b11
ゼロへの丸め(RN)モード
ビット [21:20]
STRIDE はベクタ内で連続する値の間の間隔です(P. 6-6「ベクタ」参照)。
ストライドは以下のように制御されます。
6-10
0b00
ストライド = 1
0b11
ストライド = 2
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
ビット [18:16]
LEN は各ベクタに使用されるレジスタの数です(P. 6-6「ベクタ」参照)。
1 + ビット [18:16] の値となります。
0b000
LEN = 1
.
.
0b111
LEN = 8.
ビット [12:8]
例外トラップイネーブルビットです。
IXE
不正確例外イネーブル
UFE
アンダーフロー例外イネーブル
OFE
オーバフロー例外イネーブル
DZE
0 除算例外イネーブル
IOE
無効演算例外イネーブル
本書では、浮動小数点例外トラップの使用については取り上げていませ
ん。詳細については、使用している VFP コプロセッサの説明書を参照し
て下さい。
ビット [4:0]
累積例外ビットです。
IXC
不正確例外
UFC
アンダーフロー例外
OFC
オーバフロー例外
DZC
0 除算例外
IOC
無効演算例外
累積例外ビットは、該当する例外が発生した場合にセットされます。こ
れらのビットは、FPSCR への直接書き込みによってクリアされるまで、
セットされたまま保持されます。
その他全てのビット
基本 VFP 仕様では使用しません。これらのビットは特定の実装で使用す
ることが可能です(使用している VFP コアプロセッサの説明書を参照し
て下さい)。特定の実装で使用する場合を除き、これらのビットは変更し
ないで下さい。
他のビットに影響を与えずにビットの一部を変更するには、読み出し - 修正 - 書き込み
プロシージャを使用して下さい(P. 6-12「VFP システムレジスタの個々のビットの修
正」参照)。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-11
ベクタ浮動小数点プログラミング
6.5.2
FPEXC:浮動小数点例外レジスタ
:浮動小数点例外レジスタ
FPEXC には特権モードでのみアクセスできます。このレジスタは以下のビットを保持
します。
ビット [31]
EX ビットです。全ての VFP 実装で読み出し可能です。実装によっては、
書き込みが可能な場合もあります。
この値が 0 の場合、VFP システムで使用できるのは汎用レジスタの内容
と FPSCR および FPEXC だけです。
この値が 1 の場合は、状態を保存する実装固有の情報が必要となります
(使用している VFP コアプロセッサの説明書を参照して下さい)。
ビット [30]
EN ビットです。全ての VFP 実装で読み出し / 書き込みが可能です。
この値が 1 の場合は VFP コプロセッサがイネーブルされ、通常通りに動
作します。
値が 0 の場合は、VFP コプロセッサがディセーブルされます。VFP コプ
ロセッサがディセーブルされている場合には、FPSID/FPEXC レジスタの
読み出しと書き込みを行うことは可能ですが、他の VFP 命令は未定義命
令として処理されます。
ビット [29:0] 特定の VFP 実装で使用される場合があります。本章で記載した全ての
VFP 関数は、これらのビットにアクセスせずに使用できます。
特定の実装で使用する場合を除き、これらのビットを変更することはで
きません(使用しているVFPコアプロセッサの説明書を参照して下さい)
。
他のビットに影響を与えずに一部のビットを変更するには、読み出し - 修正 - 書き込
みプロシージャを使用します(P. 6-12「VFP システムレジスタの個々のビットの修正」
参照)。
6.5.3
浮動小数点システム ID レジスタ(FPSID)
)
レジスタ(
FPSID は読み出し専用レジスタです。このレジスタを読み出して、プログラムを実行
している VFP アーキテクチャの実装を確認することができます。
6.5.4
VFP システムレジスタの個々のビットの修正
他のビットに影響を与えずに VFP システムレジスタの一部のビットを変更するには、
以下の例のような読み出し - 修正 - 書き込みプロシージャを使用します。
FMRX
BIC
ORR
FMXR
r10,FPSCR
r10,r10,#0x00370000
r10,r10,#0x00030000
FPSCR,r10
;
;
;
;
copy FPSCR into r10
clears STRIDE and LEN
sets STRIDE = 1, LEN = 4
copy r10 back into FPSCR
P. 6-33「FMRX、FMXR、FMSTAT」を参照して下さい。
6-12
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.6
ゼロフラッシュモード
VFP の実装によっては、非正規化数処理コードをサポートしている場合があります。こ
のようなシステムでは、非正規化数の計算時におけるパフォーマンスが通常の計算時
よりも著しく低下します。
ゼロフラッシュモードでは、非正規化数が +0 で置き換えられます。この動作は IEEE
754 が定義している演算に適合していませんが、状況によってはシステムパフォーマン
スを大幅に向上させることができます。
6.6.1
ゼロフラッシュモードの使用条件
以下の条件が全て当てはまる場合はゼロフラッシュモードを選択して下さい。
•
使用するシステムが IEEE 754 への準拠が必要条件でない場合
•
使用しているアルゴリズムが、非正規化数を生成することがある場合
•
使用しているシステムがサポートコードを使用して非正規化数の処理を行う場合
•
使用しているアルゴリズムの精度が、非正規化数の保存に依存しない場合
•
使用しているアルゴリズムが、非正規化数を +0 で置き換えた結果、頻繁に例外
を発生しない場合
コード部分ごとに要件が異なる場合、ゼロフラッシュモードと通常モードをいつでも
切り換えることができます。既にレジスタ内にある数値は、モード変更による影響を
受けません。
6.6.2
ゼロフラッシュモードの使用による影響
例外(P. 6-14「ゼロフラッシュモードに影響されない演算」参照)によっては、ゼロフ
ラッシュモードが浮動小数点演算に以下のような影響を及ぼすことがあります。
•
非正規化数が浮動小数点演算の入力として使用される場合は、+0 として処理さ
れます。ソースレジスタは変更されません。
•
単精度浮動小数点演算の結果が、丸め処理前に –2–126 ~ +2–126 の範囲内にある場
合は、+0 で置き換えられます。
•
倍精度浮動小数点演算の結果が、丸め処理前に –2–1022 ~ +2–1022 の範囲内にある
場合は、+0 で置き換えられます。
非正規化数をオペランドとして使用した場合、または演算結果が 0 にフラッシュされ
た場合は常に不正確例外が発生します。ゼロフラッシュモードではアンダーフロー例
外は発生しません。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-13
ベクタ浮動小数点プログラミング
6.6.3
ゼロフラッシュモードに影響されない演算
以下の演算は、ゼロフラッシュモードでも非正規化数に対して実行することが可能で
あり、演算結果は 0 にフラッシュされません。
6-14
•
コピー、絶対値、否定(P. 6-16「FABS、FCPY、FNEG」参照)
•
ロードとストア(P. 6-23「FLD と FST」参照)
•
多重ロードと多重ストア(P. 6-25「FLDM と FSTM」参照)
•
浮動小数点レジスタと ARM 汎用レジスタ間の転送(P. 6-29
「FMDRR と FMRRD」、
P. 6-32「FMRRS と FMSRR」参照)
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.7
VFP 命令
このセクションは以下のサブセクションから構成されています。
•
FABS、FCPY、FNEG:P. 6-16
•
浮動小数点絶対値、コピー、否定
FADD と FSUB:P. 6-18
•
浮動小数点の加算と減算
FCMP:P. 6-19
•
浮動小数点の比較
FCVTDS:P. 6-20
•
単精度浮動小数点から倍精度浮動小数点への変換
FCVTSD:P. 6-21
•
倍精度浮動小数点から単精度浮動小数点への変換
FDIV:P. 6-22
•
浮動小数点の除算
FLD と FST:P. 6-23
•
浮動小数点のロードおよびストア
FLDM と FSTM:P. 6-25
•
浮動小数点の多重ロードおよび多重ストア
FMAC、FNMAC、FMSC、FNMSC:P. 6-27
•
浮動小数点積和命令
FMDRR と FMRRD:P. 6-29
ARM レジスタと倍精度浮動小数点レジスタ間の転送
•
FMRRS と FMSRR:P. 6-32
単精度浮動小数点レジスタと ARM レジスタ間の転送
•
FMRX、FMXR、FMSTAT:P. 6-33
ARM レジスタと VFP システムレジスタ間の転送
•
FMUL と FNMUL:P. 6-34
•
浮動小数点の乗算および否定乗算
FSITO と FUITO:P. 6-35
符号付き整数 / 符号なし整数の浮動小数点への変換
•
FSQRT:P. 6-36
•
浮動小数点平方根
FTOSI と FTOUI:P. 6-37
浮動小数点の符号付き整数 / 符号なし整数への変換
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-15
ベクタ浮動小数点プログラミング
6.7.1
FABS、
、FCPY、
、FNEG
浮動小数点のコピー、絶対値、および否定を行います。
これらの命令は、スカラ、ベクタ、混合のどの演算でも実行できます(P. 6-7「ベクタ
演算とスカラ演算」参照)。
構文
<op><precision>{cond} Fd, Fm
説明:
<op>
FCPY、FABS、FNEG のいずれかを指定する必要があります。
<precision>
単精度 S、倍精度 D のどちらかを指定する必要があります。
cond
オプションの条件コードを指定します(P. 6-8「VFP と条件コー
ド」参照)。
Fd
演算結果を格納する VFP レジスタを指定します。
Fm
オペランドを保持する VFP レジスタを指定します。
Fd と Fm の精度は <precision> で指定した精度と一致させる必要があります。
用法
FCPY 命令は Fm の内容を Fd にコピーします。
FABS 命令は Fm の内容を取得し、符号ビットをクリアした上で、結果を Fd に格納しま
す。これにより、絶対値が求められます。
FNEG 命令は Fm の内容を取得し、符号ビットを変更した上で、結果を Fd に格納します。
これにより、値の否定が求められます。
オペランドが非数(NaN)の場合、符号ビットは上記のケースごとに決定されますが、
例外は発生しません。
例外
これらの命令では例外は発生しません。
6-16
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
例
FABSD
d3, d5
FNEGSMI s15, s15
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-17
ベクタ浮動小数点プログラミング
6.7.2
FADD と FSUB
浮動小数点の加算 • 減算を行います。
FADD と FSUB は、スカラ、ベクタ、混合のどの演算でも実行できます(P. 6-7「ベクタ
演算とスカラ演算」参照)。
構文
FADD<precision>{cond} Fd, Fn, Fm
FSUB<precision>{cond} Fd, Fn, Fm
説明:
<precision>
単精度 S、倍精度 D のどちらかを指定する必要があります。
cond
オプションの条件コードを指定します(P. 6-8「VFP と条件コード」参照)。
Fd
演算結果を格納する VFP レジスタを指定します。
Fn
第 1 オペランドを保持する VFP レジスタを指定します。
Fm
第 2 オペランドを保持する VFP レジスタを指定します。
Fd、Fn、Fm の精度は <precision> で指定した精度と一致させる必要があります。
用法
FADD 命令は Fn と Fm の値を乗算し、結果を Fd に格納します。
FSUB 命令は、Fn 値から Fm 値を減算し、結果を Fd に格納します。
例外
FADD 命令と FSUB 命令は、無効演算例外、オーバフロー例外、あるいは不正確例外を発
生させることがあります。
例
FSUBSEQ
FADDDGT
FSUBD
6-18
s2, s4, s17
d4, d0, d12
d0, d0, d12
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.7.3
FCMP
浮動小数点の比較を行います。
FCMP は常にスカラ演算を実行します。
構文
FCMP{E}<precision>{cond} Fd, Fm
FCMP{E}Z<precision>{cond} Fd
説明:
E
オプションのパラメータです。E を指定すると、オペランドのいずれかが
非数(NaN)の場合に例外が生じます。指定していないときは、オペラン
ドのいずれかがシグナルを生成する NaN の場合のみ例外が発生します。
Z
0 との比較を指定するパラメータです。
<precision>
単精度 S、倍精度 D のどちらかを指定する必要があります。
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Fd
第 1 オペランドを保持する VFP レジスタを指定します。
Fm
第 2 オペランドを保持する VFP レジスタを指定します。0 比較命令を使
用する場合は、Fm を省略して下さい。
Fd と Fm の精度は <precision> で指定した精度と一致させる必要があります。
用法
FCMP 命令は Fd 値から Fm 値を減算し、結果に対して VFP 条件フラグをセットします
(P. 6-8「VFP と条件コード」参照)。
例外
FCMP 命令によって無効演算例外が発生することがあります。
例
FCMPS
FCMPEDNE
FCMPZSEQ
ARM DUI0068BJ-00
s3, s0
d5, d13
s2
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-19
ベクタ浮動小数点プログラミング
6.7.4
FCVTDS
単精度浮動小数点を倍精度浮動小数点に変換します。
FCVTDS は常にスカラ演算を実行します。
構文
FCVTDS{cond} Dd, Sm
説明:
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Dd
演算結果を格納する倍精度 VFP レジスタを指定します。
Sm
オペランドを保持する単精度 VFP レジスタを指定します。
用法
FCVTDS 命令は Sm の単精度値を倍精度値に変換し、結果を Dd に格納します。
例外
FCVTDS 命令によって無効演算例外が発生することがあります。
例
FCVTDS
FCVTDSGT
6-20
d5, s7
d0, s4
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.7.5
FCVTSD
倍精度浮動小数点を単精度浮動小数点に変換します。
FCVTSD は常にスカラ演算を実行します。
構文
FCVTSD{cond} Sd, Dm
説明:
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Sd
演算結果を格納する単精度 VFP レジスタを指定します。
Dm
オペランドを保持する倍精度 VFP レジスタを指定します。
用法
FCVTSD 命令は Dm 内の倍精度値を単精度値に変換し、結果を Sd に格納します。
例外
FCVTSD 命令は、無効演算例外、オーバフロー例外、アンダーフロー例外、あるいは不
正確例外を発生させることがあります。
例
FCVTSD
FCVTSDMI
ARM DUI0068BJ-00
s3, d14
s0, d1
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-21
ベクタ浮動小数点プログラミング
6.7.6
FDIV
浮動小数点を除算します。FDIV は、スカラ、ベクタ、混合のどの演算でも実行できま
す(P. 6-7「ベクタ演算とスカラ演算」参照)。
構文
FDIV<precision>{cond} Fd, Fn, Fm
説明:
<precision>
単精度 S、倍精度 D のどちらかを指定する必要があります。
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Fd
演算結果を格納する VFP レジスタを指定します。
Fn
第 1 オペランドを保持する VFP レジスタを指定します。
Fm
第 2 オペランドを保持する VFP レジスタを指定します。
Fd、Fn、Fm の精度は <precision> で指定した精度と一致させる必要があります。
用法
FDIV 命令は Fn 値を Fm 値で除算し、結果を Fd に格納します。
例外
FDIV 命令は、0 除算例外、無効演算例外、オーバフロー例外、アンダーフロー例外、あ
るいは不正確例外を発生させることがあります。
例
FDIVS
FDIVSNE
FDIVD
6-22
s8, s0, s12
s2, s27, s28
d10, d2, d10
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.7.7
FLD と FST
浮動小数点のロード • ストアを行います。
構文
FLD<precision>{cond} Fd, [Rn{, #offset}]
FST<precision>{cond} Fd, [Rn{, #offset}]
FLD<precision>{cond} Fd, label
FST<precision>{cond} Fd, label
説明:
<precision>
単精度 S、倍精度 D のどちらかを指定する必要があります。
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Fd
ロード先またはストア先の VFP レジスタを指定します。Fd の精度は
<precision> で指定した精度と一致させる必要があります。
Rn
転送用のベースアドレスを保持する ARM レジスタを指定します。
offset
オプションの数値式です。この数値式は、アセンブリ時に数値定数が求
められる式でなければなりません。この値は -1020 ~ +1020 の範囲内に
収まる 4 の倍数である必要があります。この値をベースアドレスに加算
することで、転送に使用されるアドレスが形成されます。
label
プログラム相対式です。詳細については、P. 3-23「レジスタ相対式とプ
ログラム相対式」を参照して下さい。
label は、現在の命令から ±1KB 以内に配置する必要があります。
用法
FLD 命令はメモリから浮動小数点レジスタをロードします。FST 命令は浮動小数点レジ
スタの内容をメモリにストアします。
<precision> が S の場合は 1 ワード、D の場合は 2 ワードが転送されます。
FLD には擬似命令もあります(P. 6-38「FLD 擬似命令」参照)。
例
FLDD
ARM DUI0068BJ-00
d5, [r7, #-12]
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-23
ベクタ浮動小数点プログラミング
FLDSNE
FSTS
FLDD
FLDS
6-24
s3,
s2,
d2,
s9,
[r2, #72+count]
[r5]
[r15, #addr-{PC}]
fpconst
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.7.8
FLDM と FSTM
浮動小数点の多重ロード • 多重ストアを行います。
構文
FLDM<addressmode><precision>{cond} Rn,{!} VFPregisters
FSTM<addressmode><precision>{cond} Rn,{!} VFPregisters
説明:
<addressmode>
以下のいずれかを指定する必要があります。
IA
各転送後にアドレスをインクリメントします。
DB
各転送前にアドレスをデクリメントします。
EA
空上昇スタック演算を表します。これはロード時のDB、
ストア時の IA と同じです。
FD
フル下降スタック演算を表します。これはロード時の
IA、保存時の DB と同じです。
<precision>
以下のいずれかを指定する必要があります。
S
単精度
D
倍精度
X
精度指定なし
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Rn
転送用のベースアドレスを保持するARMレジスタを指定します。
!
オプションの記述子です。! は更新されたベースアドレスを Rn に
ライトバックする必要があることを示します。
注
! を指定しない場合は、<addressmode> に IA を指定する必要が
あります。
VFPregisters
ARM DUI0068BJ-00
連続する浮動小数点レジスタを大括弧({})で囲んだレジスタリ
ストです。このリストにはレジスタをカンマで区切って指定する
か、範囲を指定することができます。リストには 1 つ以上のレジ
スタを指定する必要があります。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-25
ベクタ浮動小数点プログラミング
用法
FLDM 命令はメモリから連続した複数の浮動小数点レジスタをロードします。
FSTM 命令は連続した複数の浮動小数点レジスタの内容をメモリにストアします。
<precision> に D を指定した場合には、VFPregisters に倍精度レジスタリストを指
定する必要があり、リスト内のレジスタごとに 2 ワードが転送されます。
<precision> に S を指定した場合には、VFPregisters に単精度レジスタリストを指
定する必要があり、リスト内のレジスタごとに 1 ワードが転送されます。
精度指定なし
<precision> に X を指定した場合は、VFPregisters に倍精度レジスタを指定する必
要があります。しかし実際には、指定した倍精度レジスタの一部または全てが 2 つの
単精度値または整数を保持することができます。
転送ワード数は 2n または(2n + 1)と考えられ、n はリストに含まれる倍精度レジスタ
の数を示します。この数は実装によって異なりますが、ライトバックを指定した場合
には、Rn が常に(2n + 1)ワードで調整されます。
データの保存と復元を行うには、精度指定なしのロードとストアを対で指定する必要
があります。保存されるデータの形式は実装によって異なります。
例
FLDMIAS r2, {s1-s5}
FSTMFDD r13!, {d3-d6}
FSTMIAS r0!, {s31}
以下の命令は等価です。
FLDMIAS r7, {s3-s7}
FLDMIAS r7, {s3,s4,s5,s6,s7}
以下の命令は、必ず対で使用する必要があります。
FSTMFDX r13!, {d0-d3}
FLDMFDX r13!, {d0-d3}
以下の命令は、リスト内のレジスタが連続していないために不正とみなされます。
FLDMIAD r13!, {d0,d2,d3}
6-26
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.7.9
FMAC、
、FNMAC、
、FMSC、
、FNMSC
浮動小数点の積和演算、否定積和演算、乗減算、否定乗減算を行います。上記の命令
は、スカラ、ベクタ、混合のどの演算でも実行できます(P. 6-7「ベクタ演算とスカラ
演算」参照)。
構文
<op><precision>{cond} Fd, Fn, Fm
説明:
<op>
FMAC、FNMAC、FMSC、FNMSC のいずれか 1 つを指定する必要があります。
<precision>
単精度 S、倍精度 D のどちらかを指定する必要があります。
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Fd
演算結果を格納する VFP レジスタを指定します。
Fn
第 1 オペランドを保持する VFP レジスタを指定します。
Fm
第 2 オペランドを保持する VFP レジスタを指定します。
Fd、Fn、Fm の精度は <precision> で指定した精度と一致させる必要があります。
用法
FMAC 命令は Fd + Fn * Fm を計算し、結果を Fd に格納します。
FNMAC 命令は Fd -Fn * Fm を計算し、結果を Fd に格納します。
FMSC 命令は -Fd + Fn * Fm を計算し、結果を Fd に格納します。
FNMSC 命令は -Fd -Fn * Fm を計算し、結果を Fd に格納します。
例外
これらの命令によって、無効演算例外、オーバフロー例外、アンダーフロー例外、あ
るいは不正確例外が発生することがあります。
例
FMACD
FMACS
ARM DUI0068BJ-00
d8, d0, d8
s20, s24, s28
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-27
ベクタ浮動小数点プログラミング
FNMSCSLE
6-28
s6, s0, s26
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.7.10
FMDRR と FMRRD
2 つの ARM レジスタと倍精度浮動小数点レジスタ間でレジスタの内容を転送します。
構文
FMDRR{cond} Dn, Rd, Rn
FMRRD{cond} Rd, Rn, Dn
説明:
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Dn
VFP 倍精度レジスタを指定します。
Rd, Rn
ARM レジスタを指定します。r15 は使用しないで下さい。
用法
FMDRR Dn, Rd, Rn は、Rd の内容を Dn の下位半分に転送し、Rn の内容を Dn の上位半
分に転送します。
FMRRD Rd, Rn, Dn は、Dn の下位半分の内容を Rd に転送し、上位半分の内容を Rn に
転送します。
例外
これらの命令では例外は発生しません。
アーキテクチャ
これらの命令は VFPv2 以上で使用できます。
例
FMDRR
d5, r3, r4
FMRRDPL r12, r2, d2
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-29
ベクタ浮動小数点プログラミング
6.7.11
FMDHR、
、FMDLR、
、FMRDH、
、FMRDL
ARM レジスタと倍精度浮動小数点レジスタ半分との間で内容を転送します。
構文
FMDHR{cond} Dn, Rd
FMDLR{cond} Dn, Rd
FMRDH{cond} Rd, Dn
FMRDL{cond} Rd, Dn
説明:
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Dn
VFP 倍精度レジスタを指定します。
Rd
ARM レジスタを指定します。Rd に r15 は使用できません。
用法
これらの命令は以下のように対で使用します。
•
FMDHR と FMDLR
FMDHR
Rd の内容を Dn の上位半分にコピーします。
FMDLR
Rd の内容を Dn の下位半分にコピーします。
•
FMRDH と FMRDL
FMRDH
Dn の上位半分の内容を Rd にコピーします。
FMRDL
Dn の下位半分の内容を Rd にコピーします。
例外
これらの命令では例外は発生しません。
例
FMDHR
FMDLR
FMRDH
FMRDL
FMDLRPL
6-30
d5,
d5,
r5,
r9,
d2,
r3
r12
d3
d3
r1
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.7.12
FMRS と FMSR
単精度浮動小数点レジスタと ARM レジスタ間で内容を転送します。
構文
FMRS{cond} Rd, Sn
FMSR{cond} Sn, Rd
説明:
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Sn
VFP 単精度レジスタを指定します。
Rd
ARM レジスタを指定します。Rd に r15 は使用できません。
用法
FMRS 命令は Sn の内容を Rd に転送します。
FMSR 命令は Rd の内容を Sn に転送します。
例外
これらの命令では例外は発生しません。
例
FMRS
FMSRNE
ARM DUI0068BJ-00
r2, s0
s30, r5
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-31
ベクタ浮動小数点プログラミング
6.7.13
FMRRS と FMSRR
2 つの単精度浮動小数点レジスタと 2 つの ARM レジスタ間で内容を転送します。
構文
FMRRS{cond} Rd, Rn, {Sn,Sm}
FMSRR{cond} {Sn,Sm}, Rd, Rn
説明:
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Sn, Sm
2 つの連続した単精度 VFP レジスタです。
Rd, Rn
ARM レジスタを指定します。r15 は使用しないで下さい。
用法
FMRRS 命令は Sn の内容を Rd に、Sm の内容を Rn に転送します。
FMSRR 命令は Rd の内容を Sn に、Rn の内容を Sm に転送します。
例外
これらの命令では例外は発生しません。
アーキテクチャ
これらの命令は VFPv2 以上で使用できます。
例
FMRRS
FMSRRNE
r2, r3, {s0,s1}
{s27,s28}, r5, r2
誤用例
FMRRS
FMSRR
6-32
r2, r3, {s2,s4}
{s5,s6}, r15, r0
; VFP registers must be consecutive
; you must not use r15
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.7.14
FMRX、
、FMXR、
、FMSTAT
ARM レジスタと VFP システムレジスタ間で内容を転送します。
構文
FMRX{cond} Rd, VFPsysreg
FMXR{cond} VFPsysreg, Rd
FMSTAT{cond}
説明:
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
cond
VFPsysreg VFP システムレジスタを指定します。通常は FPSCR、FPSID、FPEXC の
いずれかを使用します(P. 6-5「浮動小数点レジスタ」参照)。
ARM レジスタを指定します。
Rd
用法
FMRX 命令は VFPsysreg の内容を Rd に転送します。
FMXR 命令は Rd の内容を VFPsysreg に転送します。
FMSTAT 命令は FMRX r15, FPSCR の同義語です。この命令は浮動小数点条件フラグを
ARM CPSR 内の対応するフラグに転送します(P. 6-8「VFP と条件コード」参照)。
注
これらの命令は実行中の全ての VFP 演算が完了するまで ARM を停止させます。
例外
これらの命令では例外は発生しません。
例
FMSTAT
FMSTATNE
FMXR
FMRX
ARM DUI0068BJ-00
FPSCR, r2
r3, FPSID
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-33
ベクタ浮動小数点プログラミング
6.7.15
FMUL と FNMUL
浮動小数点の乗算と否定乗算を行います。FMUL と FNMUL は、スカラ、ベクタ、混合
のどの演算でも実行できます(P. 6-7「ベクタ演算とスカラ演算」参照)。
構文
FMUL<precision>{cond} Fd, Fn, Fm
FNMUL<precision>{cond} Fd, Fn, Fm
説明:
<precision>
単精度 S、倍精度 D のどちらかを指定する必要があります。
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Fd
演算結果を格納する VFP レジスタを指定します。
Fn
第 1 オペランドを保持する VFP レジスタを指定します。
Fm
第 2 オペランドを保持する VFP レジスタを指定します。
Fd、Fn、Fm の精度は <precision> で指定した精度と一致させる必要があります。
用法
FMUL 命令は Fn と Fm の値を乗算し、結果を Fd に格納します。
FNMUL 命令は Fn と Fm の値を乗算し、結果の否定を Fd に格納します。
例外
FMUL 命令と FNMUL 命令では、無効演算例外、オーバフロー例外、アンダーフロー例外、
あるいは不正確例外が発生することがあります。
例
FNMULS
FMULDLT
6-34
s10, s10, s14
d0, d7, d8
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.7.16
FSITO と FUITO
符号付き整数と符号なし整数をそれぞれ浮動小数点に変換します。
FSITO、FUITO は常にスカラ演算を実行します。
構文
FSITO<precision>{cond} Fd, Sm
FUITO<precision>{cond} Fd, Sm
説明:
<precision>
単精度 S、倍精度 D のどちらかを指定する必要があります。
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Fd
演算結果を格納する VFP レジスタを指定します。Fd の精度は
<precision> で指定した精度と一致させる必要があります。
Sm
整数オペランドを保持する VFP 単精度レジスタを指定します。
用法
FSITO 命令は Sm 内の符号付き整数値を浮動小数点に変換し、結果を Fd に格納します。
FUITO 命令は Sm 内の符号なし整数値を浮動小数点に変換し、結果を Fd に格納します。
例外
FSITOS 命令と FUITOS 命令では、不正確例外が発生することがあります。
FSITOD 命令と FUITOD 命令では、例外は発生しません。
例
FUITOD
FSITOD
FSITOSNE
ARM DUI0068BJ-00
d3, s31 ; unsigned integer to double-precision
d5, s16 ; signed integer to double-precision
s2, s2 ; signed integer to single-precision
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-35
ベクタ浮動小数点プログラミング
6.7.17
FSQRT
浮動小数点平方根命令です。この命令は、スカラ、ベクタ、混合のどの演算でも実行
できます(P. 6-7「ベクタ演算とスカラ演算」参照)。
構文
FSQRT<precision>{cond} Fd, Fm
説明:
<precision>
単精度 S、倍精度 D のどちらかを指定する必要があります。
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Fd
演算結果を格納する VFP レジスタを指定します。
Fm
オペランドを保持する VFP レジスタを指定します。
Fd と Fm の精度は <precision> で指定した精度と一致させる必要があります。
用法
FSQRT 命令は Fm の値の平方根を計算し、結果を Fd に格納します。
例外
FSQRT 命令は、無効演算例外または不正確例外を発生させることがあります。
例
FSQRTS
FSQRTD
FSQRTSNE
6-36
s4, s28
d14, d6
s15, s13
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.7.18
FTOSI と FTOUI
浮動小数点をそれぞれ符号付き整数と符号なし整数に変換します。
FTOSI、FTOUI は常にスカラ演算を実行します。
構文
FTOSI{Z}<precision>{cond} Sd, Fm
FTOUI{Z}<precision>{cond} Sd, Fm
説明:
0 への丸めを指定するオプションのパラメータです。このパラメータを
指定した場合には、FPSCR に指定されている丸めモードがオーバライド
されます。FPSCR は変更されません。
Z
<precision>
単精度 S、倍精度 D のどちらかを指定する必要があります。
cond
オプションの条件コードです(P. 6-8「VFP と条件コード」参照)。
Sd
整数結果を格納する VFP 単精度レジスタを指定します。
Fm
オペランドを保持する VFP レジスタを指定します。Fm の精度は
<precision> で指定した精度と一致させる必要があります。
用法
FTOSI 命令は Fm の浮動小数点値を符号付き整数に変換し、結果を Sd に格納します。
FTOUI 命令は Fm の浮動小数点値を符号なし整数に変換し、結果を Sd に格納します。
例外
FTOSI 命令と FTOUI 命令は、無効演算例外または不正確例外を発生させることがあり
ます。
例
FTOSID
FTOUID
FTOSIZS
ARM DUI0068BJ-00
s10, d2
s3, d1
s3, s31
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-37
ベクタ浮動小数点プログラミング
6.8
VFP 擬似命令
VFP 擬似命令は以下の 1 つだけです。
6.8.1
FLD 擬似命令
FLD 擬似命令は VFP 浮動小数点レジスタに単精度または倍精度の浮動小数点定数を
ロードします。
注
コマンドラインオプション -fpu に vfp または softvfp+vfp を設定している場合に
のみ FLD を使用できます。
このサブセクションでは FLD 擬似命令のみを説明します。FLD 命令の詳細については、
P. 6-23「FLD と FST」を参照して下さい。
構文
FLD<precision>{cond} fp-register,=fp-literal
説明:
<precision>
単精度 S、倍精度 D のどちらかを指定します。
cond
オプションの条件コードです。
fp-register ロード先の浮動小数点レジスタを指定します。
fp-literal 単精度または倍精度の浮動小数点リテラルを指定します(P. 3-22「浮動
小数点リテラル」参照)。
用法
アセンブラは定数をリテラルプールに格納し、この定数を読み出すためのプログラム
相対 FLD 命令を生成します。リテラルプール内の 1 ワードは、単精度定数のストアに
使用されます。倍精度定数のストアには 2 ワードが使用されます。
pc から定数へのオフセットは 1KB 未満にする必要があります。リテラルプールが範囲
内にあることを必ず確認して下さい。詳細については、P. 7-14「LTORG」を参照して
下さい。
6-38
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
例
FLDD
FLDS
ARM DUI0068BJ-00
d1,=3.12E106
s31,=3.12E-16
; loads 3.12E106 into d1
; loads 3.12E-16 into s31
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-39
ベクタ浮動小数点プログラミング
6.9
VFP ディレクティブとベクタ表記
本セクションに記載する情報は、armasm のみに適用されます。C/C++ コンパイラのイ
ンラインアセンブラには、このセクションに記載されているディレクティブとベクタ
表記のどちらも使用できません。
VFP ベクタの長さとストライドはコード内でアサートし、これをアセンブラにチェッ
クさせることができます。詳細については以下を参照して下さい。
•
VFPASSERT SCALAR:P. 6-41
•
VFPASSERT VECTOR:P. 6-42
VFPASSERT ディレクティブを使用する場合は、全ての VFP データ処理命令でベクタを
指定する必要があります。このベクタ表記を以下で説明します。VFPASSERT ディレク
ティブを使用しない場合には、このベクタ表記を使用しないで下さい。
VFP データ処理命令では、かぎ括弧(< >)を使用して VFP レジスタのベクタを指定し
ます。
sn は単精度スカラレジスタ n を示します。
sn <> はレジスタ n で始まり、長さとストライドが現在のベクタの長さとストライドに
よって決定される単精度ベクタを示します。
sn <L> はレジスタ n で始まり、長さが L、ストライドが 1 の単精度ベクタを示します。
sn <L:S> はレジスタ n で始まり、長さが L、ストライドが S の単精度ベクタを示します。
dn は倍精度スカラレジスタ n を示します。
dn <> はレジスタ n で始まり、長さとストライドが現在のベクタの長さストライドに
よって決定される倍精度ベクタを示します。
dn <L> はレジスタ n で始まり、長さが L、ストライドが 1 の倍精度ベクタを示します。
dn <L:S> はレジスタ n で始まり、長さが L、ストライドが S の倍精度ベクタを示します。
上記のベクタ表記には、DN および SN ディレクティブを使用して定義した名前を使用
できます(P. 7-11「DN と SN」参照)。
DN および SN ディレクティブ自体に上記のベクタ表記を使用しないで下さい。
6-40
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
6.9.1
VFPASSERT SCALAR
VFPASSERT SCALAR ディレクティブは、後続の VFP 命令がスカラモードであること
をアセンブラに通知します。
構文
VFPASSERT SCALAR
用法
VFPASSERT SCALAR ディレクティブを使用して、VFP モードが VECTOR であるコード
ブロックの終わりをマーキングすることができます。
VFPASSERT SCALAR ディレクティブは、変更が発生する命令の直後に配置します。こ
の命令は FMXR 命令であるのが一般的ですが、BL 命令の場合もあります。
ある関数がイグジットで VFP がベクタモードにあると予想する場合には、最後の命令
の直後にVFPASSERT SCALARディレクティブを配置します。このような関数はATPCS
に準拠していません。詳細については ADS デベロッパガイドの「プロシージャコール
標準の使用」を参照して下さい。
その他、以下を参照して下さい。
•
VFP ディレクティブとベクタ表記:P. 6-40
•
VFPASSERT VECTOR:P. 6-42
注
このディレクティブからはコードは生成されません。プログラマによるアサート目的
だけに使用します。アセンブラは、アサート同士の矛盾や、VFP データ処理命令に使
用されるベクタ表記との矛盾を検出すると、エラーメッセージを生成します。
アセンブラは、ベクタ長が 1 の場合でも、VFPASSERT SCALAR ディレクティブに続く
VFP データ処理命令のベクタ表記を無効にします。
例
VFPASSERT
faddd
fadds
fabss
ARM DUI0068BJ-00
SCALAR
d4, d4, d0
s4<3>, s0, s8<3>
s24<1>, s28<1>
;
;
;
;
;
scalar mode
okay
ERROR, vector in scalar mode
ERROR, vector in scalar mode
(even though length==1)
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-41
ベクタ浮動小数点プログラミング
6.9.2
VFPASSERT VECTOR
VFPASSERT VECTOR ディレクティブは、後続の VFP 命令がベクタモードにあること
をアセンブラに通知します。また、このディレクティブを使用してにベクタの長さと
ストライドを指定することも可能です。
構文
VFPASSERT VECTOR[<[n[:s]]>]
説明:
n
ベクタの長さ(1 ~ 8)を示します。
s
ベクタのストライド(1 ~ 2)を示します。
用法
VFP モードが VECTOR の命令ブロッ
VFPASSERT VECTOR ディレクティブを使用して、
クの開始位置と、ベクタの長さとストライドの変更をマーキングすることができます。
VFPASSERT VECTOR ディレクティブは、変更が発生する命令の直後に配置します。こ
の命令は FMXR 命令であるのが一般的ですが、BL 命令の場合もあります。
ある関数がエントリで VFP がベクタモードにあることを予想する場合には、その最初
の命令の直前に VFPASSERT VECTOR ディレクティブを配置します。このような関数
は、ATPCS に準拠していません。詳細については ADS デベロッパガイドの「プロシー
ジャコール標準の使用」の説明を参照して下さい。
その他、以下を参照して下さい。
•
VFP ディレクティブとベクタ表記:P. 6-40
•
VFPASSERT SCALAR:P. 6-41
注
このディレクティブからはコードは生成されません。プログラマによるアサーション
目的だけに使用します。アセンブラは、アサート同士の矛盾や、VFP データ処理命令
に使用されるベクタ表記との矛盾を検出すると、エラーメッセージを生成します。
6-42
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ベクタ浮動小数点プログラミング
例
FMRX
BIC
ORR
FMXR
r10,FPSCR
r10,r10,#0x00370000
r10,r10,#0x00020000
FPSCR,r10
VFPASSERT VECTOR
faddd d4, d4, d0
fadds s16<3>, s0, s8<3>
fabss s24<1>, s28<1>
; set length = 3, stride = 1
FMRX
BIC
ORR
FMXR
;
;
;
;
r10,FPSCR
r10,r10,#0x00370000
r10,r10,#0x00030000
FPSCR,r10
; set length = 4, stride = 1
VFPASSERT VECTOR<4>
fadds s24<4>, s0, s8<4>
fabss s24<2>, s24<2>
FMRX
BIC
ORR
FMXR
; assert vector mode, length 4, stride 1
; okay
; ERROR, wrong length
r10,FPSCR
r10,r10,#0x00370000
r10,r10,#0x00130000
FPSCR,r10
VFPASSERT VECTOR<4:2>
fadds s8<4>, s0, s16<4>
fabss s16<4:2>, s28<4:2>
fadds s8<>, s2, s16<>
ARM DUI0068BJ-00
assert vector mode, unspecified length and stride
ERROR, scalar in vector mode
okay
wrong length, but not faulted (unspecified)
; set length = 4, stride = 2
;
;
;
;
;
;
assert vector mode, length 4, stride 2
ERROR, wrong stride
okay
okay (s8 and s16 both have
length 4 and stride 2.
s2 is scalar.)
Copyright © 2000, 2001 ARM Limited. All rights reserved.
6-43
ベクタ浮動小数点プログラミング
6-44
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
第7章
ディレクティブについて
本章では、ARM アセンブラ armasm がサポートしているディレクティブについて説明
します。本章は以下のセクションから構成されています。
•
ディレクティブ一覧(アルファベット順):P. 7-2
•
シンボル定義ディレクティブ:P. 7-3
データ定義ディレクティブ:P. 7-13
メモリの割り当て、データ構造の定義、メモリの初期内容の設定
アセンブリ制御ディレクティブ:P. 7-26
•
条件付きアセンブリ、ループ、インクルード、マクロ
フレーム記述ディレクティブ:P. 7-33
•
•
•
•
通知ディレクティブ:P. 7-44
その他のディレクティブ:P. 7-49
注
これらのディレクティブは、ARM C/C++ コンパイラのインラインアセンブラでは使用
できません。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-1
ディレクティブについて
7.1
ディレクティブ一覧(アルファベット順)
表 7-1 各ディレクティブのページ番号
ALIGN:P. 7-50
EXPORT または GLOBAL:P. 7-58
INCLUDE:P. 7-63
AREA:P. 7-52
EXPORTAS:P. 7-59
INFO:P. 7-45
ASSERT:P. 7-44
EXTERN:P. 7-60
KEEP:P. 7-64
CN:P. 7-9
FIELD:P. 7-16
LCLA、LCLL、LCLS:P. 7-6
CODE16 と CODE32:P. 7-54
FN:P. 7-12
LTORG:P. 7-14
CP:P. 7-10
FRAME ADDRESS:P. 7-34
MACRO と MEND:P. 7-27
DATA:P. 7-25
FRAME POP:P. 7-35
MAP:P. 7-15
DCB:P. 7-18
FRAME PUSH:P. 7-36
MEXIT:P. 7-29
DCD と DCDU:P. 7-19
FRAME REGISTER:P. 7-37
NOFP:P. 7-65
DCDO:P. 7-20
FRAME RESTORE:P. 7-38
OPT:P. 7-46
DCFD と DCFDU:P. 7-21
FRAME SAVE:P. 7-39
REQUIRE:P. 7-65
DCFS と DCFSU:P. 7-22
FRAME STATE REMEMBER:P. 7-40
RLIST:P. 7-8
DCI:P. 7-23
FRAME STATE RESTORE:P. 7-41
RN:P. 7-67
DCQ と DCQU:P. 7-24
FUNCTION または PROC:P. 7-42
ROUT:P. 7-68
DCW と DCWU:P. 7-25
GBLA、GBLL、GBLS:P. 7-4
SETA、SETL、SETS:P. 7-7
DN と SN:P. 7-11
GET または INCLUDE:P. 7-61
DN と SN:P. 7-11
END:P. 7-55
GLOBAL:P. 7-62
SPACE:P. 7-17
ENDFUNC または ENDP:P. 7-43
IF、ELSE、ENDIF:P. 7-30
TTL と SUBT:P. 7-48
ENTRY:P. 7-56
IMPORT:P. 7-62
WHILE と WEND:P. 7-32
EQU:P. 7-57
INCBIN:P. 7-63
7-2
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.2
シンボル定義ディレクティブ
このセクションでは以下のディレクティブを説明します。
•
GBLA、GBLL、GBLS:P. 7-4
グローバル算術変数、論理変数、ストリング変数を宣言します。
•
LCLA、LCLL、LCLS:P. 7-6
ローカル算術変数、論理変数、ストリング変数を宣言します。
•
SETA、SETL、SETS:P. 7-7
算術変数、論理変数、ストリング変数の値をセットします。
•
RLIST:P. 7-8
汎用レジスタセットの名前を定義します。
•
CN:P. 7-9
コプロセッサレジスタ名を定義します。
•
CP:P. 7-10
コプロセッサ名を定義します。
•
DN と SN:P. 7-11
単精度 / 倍精度 VFP レジスタ名を定義します。
•
FN:P. 7-12
FPA レジスタ名を定義します。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-3
ディレクティブについて
7.2.1
GBLA、
、GBLL、
、GBLS
GBLA ディレクティブはグローバル算術変数を宣言し、変数の値を 0 に初期化します。
GBLL ディレクティブはグローバル論理変数を宣言し、変数の値を {FALSE} に初期化
します。
GBLS ディレクティブはグローバルストリング変数を宣言し、変数の値を NULL ストリ
ング("")に初期化します。
構文
<gblx> variable
説明:
<gblx>
GBLA、GBLL、GBLS のいずれかを指定します。
variable
変数の名前を指定します。variable はソースファイル内のシンボルに
使用されている一意の名前でなければなりません。
用法
定義済みの変数に対して上記ディレクティブのいずれかを使用すると、この変数は指
定した値と同じ値に再初期化されます。
この変数の有効範囲は、その変数を含むソースファイル内に制限されます。
この変数の値は、SETA、SETL、SETS のいずれかのディレクティブを使用して設定す
ることができます(P. 7-7「SETA、SETL、SETS」参照)。
ローカル変数の宣言については、P. 7-6「LCLA、LCLL、LCLS」を参照して下さい。
グローバル変数はアセンブラコマンドラインオプション(-predefine)を使用して
設定することもできます。詳細については P. 3-2「コマンド構文」を参照して下さい。
7-4
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
例
例 7-1 では、変数 objectsize を宣言し、objectsize の値に 0xFF を設定し、これ
を後の SPACE ディレクティブで使用しています。
例 7-1
objectsize
GBLA
SETA
.
.
.
SPACE
objectsize
0xFF
; declare the variable name
; set its value
; other code
objectsize
; quote the variable
例 7-2 は、armasm を呼び出すときの変数の宣言方法と設定方法を示しています。アセ
ンブリ時に変数の値を設定する必要がある場合には、この方法を使用して下さい。-pd
は -predefine の同義語です。
例 7-2
armasm -pd "objectsize SETA 0xFF" -o objectfile sourcefile
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-5
ディレクティブについて
7.2.2
LCLA、
、LCLL、
、LCLS
LCLA ディレクティブはローカル算術変数を宣言し、この変数の値を 0 に初期化します。
LCLL ディレクティブはローカル論理変数を宣言し、この変数の値を {FALSE} に初期化
します。
LCLS ディレクティブはローカルストリング変数を宣言し、この変数の値を NULL スト
リング("")に初期化します。
構文
<lclx> variable
説明:
<lclx>
LCLA、LCLL、LCLS のいずれかを指定します。
variable
変数の名前を指定します。variable は、この変数が含まれるマクロ内
で一意の名前である必要があります。
用法
定義済みの変数に対して上記ディレクティブのいずれかを使用すると、この変数は指
定した値と同じ値に再初期化されます。
この変数の有効範囲は、この変数を含むマクロの特定のインスタンスに制限されます
(P. 7-27「MACRO と MEND」参照)。
この変数の値は、SETA、SETL、SETS のいずれかのディレクティブを使用して設定す
ることができます(P. 7-7「SETA、SETL、SETS」参照)。
グローバル変数の宣言については、P. 7-4「GBLA、GBLL、GBLS」を参照して下さい。
例
$label
err
$label
7-6
MACRO
message $a
LCLS
err
SETS
; code
INFO
MEND
"error no: "
;
;
;
;
;
0, "err":CC::STR:$a
; Use string
Copyright © 2000, 2001 ARM Limited. All rights reserved.
Declare a macro
Macro prototype line
Declare local string
variable err.
Set value of err
ARM DUI0068BJ-00
ディレクティブについて
7.2.3
SETA、
、SETL、
、SETS
SETA ディレクティブはローカル算術変数またはグローバル算術変数の値を設定します。
SETL ディレクティブはローカル論理変数またはグローバル論理変数の値を設定します。
SETSディレクティブはローカルストリング変数またはグローバルストリング変数の値
を設定します。
構文
variable <setx> expr
説明:
<setx>
SETA、SETL、SETS のいずれかを指定します。
variable
GBLA、GBLL、GBLS、LCLA、LCLL、LCLS のいずれかのディレクティブ
で宣言される変数の名前を指定します。
expr
以下の表現で指定します。
•
SETA の場合は数値式(P. 3-20「数値式」参照)
•
SETL の場合は論理式(P. 3-23「論理式」参照)
•
SETS の場合はストリング式(P. 3-19「ストリング式」参照)
用法
上記ディレクティブのいずれかを使用するには、初めにグローバルまたはローカル宣
言ディレクティブを使用して variable を宣言する必要があります。詳細については、
P. 7-4「GBLA、GBLL、GBLS」、P. 7-6「LCLA、LCLL、LCLS」を参照して下さい。
変数名はコマンドラインから事前定義することも可能です。詳細については、P. 3-2「コ
マンド構文」を参照して下さい。
例
ARM DUI0068BJ-00
VersionNumber
GBLA
SETA
VersionNumber
21
Debug
GBLL
SETL
Debug
{TRUE}
VersionString
GBLS
SETS
VersionString
"Version 1.0"
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-7
ディレクティブについて
7.2.4
RLIST
RLIST(レジスタリスト)ディレクティブは、汎用レジスタセットの名前を定義します。
構文
name RLIST {list-of-registers}
説明:
name
レジスタセットに付ける名前を指定します。name には P. 3-9「事前定義
されるレジスタ名とコプロセッサ名」で事前定義された名前と同じ名前
を使用できません。
list-of-registers
レジスタ名とレジスタ範囲の一方または両方をカンマで区切って並べた
リストを指定します。このレジスタリストは{}で囲む必要があります。
用法
RLISTを使用して、LDM命令またはSTM命令で転送するレジスタセットの名前を指定す
ることができます。
LDM 命令と STM 命令は、最下位番号の物理レジスタを、受け取った順番に関係なく、必
ず最下位メモリアドレスに配置します。自分でシンボリックレジスタ名を定義すると、
レジスタリストが昇順でないことが分かりにくくなる場合があります。
このような場合にはレジスタリスト内のレジスタが必ず昇順で渡されるように、
-checkreglist アセンブラオプションを使用して下さい。レジスタが昇順で指定され
ていない場合には、警告が発行されます。
例
Context RLIST
7-8
{r0-r6,r8,r10-r12,r15}
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.2.5
CN
CN ディレクティブはコプロセッサレジスタの名前を定義します。
構文
name CN expr
説明:
コプロセッサレジスタに定義する名前を指定します。name には、P. 3-9
「事前定義されるレジスタ名とコプロセッサ名」で事前定義された名前と
同じ名前を使用することはできません。
name
定義する 0 ~ 15 のコプロセッサレジスタ番号を指定します。
expr
用法
CN を使用して、各レジスタの使用目的を覚えておけるようにレジスタに適切な名前を
割り当てることができます。
注
同一レジスタに複数の名前を付けて矛盾を生じさせるような使用方法は避けて下さい。
c0 ~ c15 の名前は事前定義されています。
例
power
ARM DUI0068BJ-00
CN
6
; defines power as a symbol for
; coprocessor register 6
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-9
ディレクティブについて
7.2.6
CP
CP ディレクティブは特定コプロセッサの名前を定義します。コプロセッサ番号は 0 ~
15 の範囲で指定する必要があります。
構文
name CP expr
説明:
name
コプロセッサに割り当てる名前を指定します。name には、P. 3-9「事前
定義されるレジスタ名とコプロセッサ名」で事前定義された名前と同じ
名前を使用することはできません。
expr
定義する 0 ~ 15 のコプロセッサ番号を指定します。
用法
CP を使用して、各コプロセッサの使用目的を覚えておけるようにコプロセッサに適切
な名前を割り当ることができます。
注
同一コプロセッサに複数の名前を付けて矛盾を生じさせるような使用方法は避けて下
さい。
p0 ~ p15 の名前は、コプロセッサ 0 ~ 15 用に事前定義されています。
例
dmu
7-10
CP
6
; defines dmu as a symbol for
; coprocessor 6
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.2.7
DN と SN
DN ディレクティブは特定の倍精度 VFP レジスタの名前を定義します。d0 ~ d15、D0
~ D15 の名前は事前定義されています。
SN ディレクティブは特定の単精度 VFP レジスタの名前を定義します。s0 ~ s31、S0 ~
S31 の名前は事前定義されています。
構文
name DN expr
name SN expr
説明:
name
VFP レジスタに割り当てる名前を指定します。name には、P. 3-9「事前
定義されるレジスタ名とコプロセッサ名」で事前定義された名前と同じ
名前を使用することはできません。
expr
定義する 0 ~ 15 の倍精度 VFP レジスタ番号、または必要に応じて 0 ~
31 の単精度 VFP レジスタ番号を指定します。
用法
DN または SN を使用して、各 VFP レジスタの使用目的を覚えておけるように VFP レジス
タに適切な名前を割り当てることができます。
注
同一レジスタに複数の名前を付けて矛盾を生じさせるような使用方法は避けて下さい。
DN/SN ディレクティブではベクタ長は指定できません(P. 6-40「VFP ディレクティブと
ベクタ表記」参照)。
例
ARM DUI0068BJ-00
energy
DN
6
; defines energy as a symbol for
; VFP double-precision register 6
mass
SN
16
; defines mass as a symbol for
; VFP single-precision register 16
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-11
ディレクティブについて
7.2.8
FN
FN ディレクティブは特定の FPA 浮動小数点レジスタの名前を定義します。f0 ~ f7、F0
~ F7 の名前は事前定義されています。
構文
name FN expr
説明:
浮動小数点レジスタに割り当てる名前を指定します。name には、P. 3-9
「事前定義されるレジスタ名とコプロセッサ名」で事前定義された名前と
同じ名前を使用することはできません。
name
定義する 0 ~ 7 の浮動小数点レジスタ番号を指定します。
expr
用法
FN を使用して、各 FPA 浮動小数点レジスタの使用目的を覚えておけるように、これら
のレジスタに適切な名前を割り当てることができます。
注
同一レジスタに複数の名前を付けて矛盾を生じさせるような使用方法は避けて下さい。
例
energy
7-12
FN
6
; defines energy as a symbol for
; floating-point register 6
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.3
データ定義ディレクティブ
このセクションでは以下のディレクティブを説明します。
•
LTORG:P. 7-14
•
リテラルプールの起点を設定します。
MAP:P. 7-15
•
記憶域マップの起点を設定します。
FIELD:P. 7-16
•
記憶域マップ内のフィールドを設定します。
SPACE:P. 7-17
値が 0 のメモリブロックを割り当てます。
•
DCB:P. 7-18
•
メモリバイトを割り当て、初期内容を指定します。
DCD と DCDU:P. 7-19
•
メモリワードを割り当て、初期内容を指定します。
DCDO:P. 7-20
•
メモリワードを割り当て、初期内容をスタティックベースレジスタからのオフ
セットとして指定します。
DCFD と DCFDU:P. 7-21
•
メモリダブルワードを割り当て、さらに初期内容を倍精度形式の浮動小数点数と
して指定します。
DCFS と DCFSU:P. 7-22
•
メモリワードを割り当て、初期内容を単精度浮動小数点数として指定します。
DCI:P. 7-23
•
メモリワードを割り当て、初期内容を指定します。この位置はデータでなく、コー
ドとしてマーキングします。
DCQ と DCQU:P. 7-24
•
メモリダブルワードを割り当て、さらに初期内容を倍精度の 64 ビット整数とし
て指定します。
DCW と DCWU:P. 7-25
•
メモリハーフワードを割り当て、初期内容を指定します。
DATA:P. 7-25
コードセクション内のデータをマークキングします。下位互換性を維持する目的
でサポートしていますが、今後のバージョンではサポートされません。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-13
ディレクティブについて
7.3.1
LTORG
LTORG ディレクティブはアセンブラに対し、現在のリテラルプールを直ちにアセンブ
ルするよう命令します。
構文
LTORG
用法
アセンブラは、各コードセクションの終わりで現在のリテラルプールをアセンブルし
ます。コードセクションの終わりは、後続セクションの開始位置にある AREA ディレク
ティブによって決定されるか、またはアセンブリの終わりとなります。
これらのデフォルトリテラルプールは、LDR、LDFD ならびに LDFS 擬似命令のいくつ
かで範囲外となる場合があります。詳細については、P. 4-82「LDR ARM 疑似命令」、
P. 5-41「LDR Thumb 擬似命令」を参照して下さい。リテラルプールが範囲内でアセン
ブルされたことを確認するには、LTORG を使用します。大きなプログラムでは、複数
のリテラルプールが必要となる場合があります。
LTORG ディレクティブは、プロセッサが定数を命令として実行しないように、無条件
分岐またはサブルーチン復帰命令の後に配置して下さい。
アセンブラはリテラルプール内のデータをワード境界で整列させます。
例
start
AREA
BL
func1
; function body
; code
LDR
r1,=0x55555555 ; => LDR R1, [pc, #offset to Literal Pool 1]
; code
MOV
pc,lr
; end function
LTORG
; Literal Pool 1 contains literal &55555555.
data
SPACE
END
7-14
Example, CODE, READONLY
func1
4200
; Clears 4200 bytes of memory,
; starting at current location.
; Default literal pool is empty.
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.3.2
MAP
MAP ディレクティブは記憶域マップの起点を指定されたアドレスに設定します。記憶
域マップの位置カウンタ {VAR} にも同じアドレスが設定されます。^ は MAP の同義語
です。
構文
MAP expr{,base-register}
説明:
expr
数値式またはプログラム相対式を指定します。
•
base-register を指定していない場合、expr は記憶域マップの
開始アドレスを求めます。記憶域マップの位置カウンタには、こ
のアドレスが設定されます。
•
expr がプログラム相対式の場合、マップ内でこれを使用する前に
ラベルを定義しておく必要があります。アセンブラの最初のパス
で、マップはこのラベルの定義を必要とします。
base-register
レジスタを指定します。base-register を指定した場合は、記憶域マッ
プの開始アドレスに expr のサムが使用され、ランタイムには
base-register の値が使用されます。
用法
記憶域マップを記述するには、MAP ディレクティブを FIELD ディレクティブと組み合
わせて使用します。
レジスタ相対ラベルを定義するために base-register を指定します。ベースレジス
タは、以降の FIELD ディレクティブで定義される全てのラベルで、次の MAP ディレク
ティブが出現するまで暗黙に認識されます。レジスタ相対ラベルはロード命令とスト
ア命令で使用することができます。この例については P. 7-16「FIELD」を参照して下
さい。
複数の記憶域マップを定義することで MAP ディレクティブを繰り返し使用できます。
最初の MAP ディレクティブが使用される前に、{VAR} カウンタに 0 がセットされます。
例
MAP
MAP
ARM DUI0068BJ-00
0,r9
0xff,r9
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-15
ディレクティブについて
7.3.3
FIELD
FIELD ディレクティブは、MAP ディレクティブで定義された記憶域マップ内の空間を
記述します。# は FIELD の同義語です。
構文
{label} FIELD expr
説明:
label
オプションのラベルです。ラベルを指定すると、label に記憶位置カウ
ンタ {VAR} の値が割り当てられます。記憶位置カウンタは expr の値で
インクリメントされます。
expr
記憶位置カウンタをインクリメントするバイト数を表現します。
用法
記憶域マップが base-register を指定する MAP ディレクティブで設定されている場合、
ベースレジスタは、次の MAP ディレクティブが出現するまで、後続の FIELD ディレク
ティブに定義される全てのラベルで暗黙に認識されます。これらのレジスタ相対ラベ
ルはロード命令とストア命令で引用できます(P. 7-15「MAP」参照)。
注
MAP、FIELD ならびにレジスタ相対ラベルを使用する場合は注意が必要です。詳細につ
いては P. 2-51「MAP ディレクティブと FIELD ディレクティブを使用したデータ構造の
記述」を参照して下さい。
例
以下の例は、MAP ディレクティブと FIELD ディレクティブを使用したレジスタ相対ラ
ベルの定義方法を示しています。
MAP
FIELD
Lab FIELD
LDR
7-16
0,r9
4
4
r0,Lab
;
;
;
;
;
set {VAR} to the address stored in r9
increment {VAR} by 4 bytes
set Lab to the address [r9 + 4]
and then increment {VAR} by 4 bytes
equivalent to LDR r0,[r9,#4]
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.3.4
SPACE
SPACE ディレクティブは値が 0 のメモリブロックを予約します。% は SPACE の同義語
です。
構文
{label} SPACE expr
説明:
予約する 0 のバイト数を指定します(P. 3-20「数値式」参照)。
expr
用法
SPACE を使用して Thumb コード内のラベル付きデータを定義する場合には、
DATA ディ
レクティブを使用する必要があります。詳細については P. 7-25「DATA」を参照して下
さい。
ALIGN ディレクティブを使用して、SPACE ディレクティブに続くコードを整列させる
ことができます。詳細については P. 7-50「ALIGN」を参照して下さい。
その他、以下を参照して下さい。
•
DCB:P. 7-18
•
DCD と DCDU:P. 7-19
•
DCDO:P. 7-20
•
DCW と DCWU:P. 7-25
例
data1
ARM DUI0068BJ-00
AREA
SPACE
MyData, DATA, READWRITE
255
; defines 255 bytes of zeroed store
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-17
ディレクティブについて
7.3.5
DCB
DCB ディレクティブは 1 バイト以上のメモリを割り当て、そのメモリの初回ランタイ
ムの内容を定義します。= は DCB の同義語です。
構文
{label} DCB expr{,expr}...
説明:
以下のどちらかを指定します。
•
-128 ~ 255 の範囲内にある整数を求める数値式(P. 3-20「数値式」
参照)
•
引用符で囲まれたストリング。この文字ストリングは、ストアす
る連続バイトにロードされます。
expr
用法
DCBの後に命令を続ける場合は、ALIGNディレクティブを使用してその命令を整列させ
て下さい。詳細については P. 7-50「ALIGN」を参照して下さい。
その他、以下を参照して下さい。
•
DCD と DCDU:P. 7-19
•
DCQ と DCQU:P. 7-24
•
DCW と DCWU:P. 7-25
•
SPACE:P. 7-17
例
C ストリングとは異なり、ARM アセンブラのストリングは NULL で終了しません。DCB
を以下のように使用することで、NULL で終わる C ストリングを構成できます。
C_string
7-18
DCB
"C_string",0
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.3.6
DCD と DCDU
DCD ディレクティブは、4 バイト境界で整列している 1 ワード以上のメモリを割り当
て、そのメモリの初回ランタイムの内容を定義します。
& は DCD の同義語です。
DCDUは、
メモリアライメントが任意であることを除いて、DCDと同じように作用します。
構文
{label} DCD{U} expr{,expr}
説明:
以下のどちらかを指定します。
•
数値式(P. 3-20「数値式」参照)
expr
•
プログラム相対式
用法
DCD は、4 バイトアライメントになるように、必要であれば最初に定義されるワードの
前に最大 3 バイトを挿入します。
アライメントが不要の場合は DCDU を使用します。
以下を参照して下さい。
•
DCB:P. 7-18
•
DCW と DCWU:P. 7-25
•
DCQ と DCQU:P. 7-24
•
SPACE:P. 7-17
例
ARM DUI0068BJ-00
data1
DCD
1,5,20
; Defines 3 words containing
; decimal values 1, 5, and 20
data2
DCD
mem06 + 4
; Defines 1 word containing 4 +
; the address of the label mem06
data3
AREA
DCB
DCDU
MyData, DATA, READWRITE
255
; Now misaligned ...
1,5,20
; Defines 3 words containing
; 1, 5 and 20, not word aligned
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-19
ディレクティブについて
7.3.7
DCDO
DCDO ディレクティブは 4 バイト境界で整列している 1 ワード以上のメモリを割り当て、
そのメモリの初回ランタイムの内容を、スタティックベースレジスタ sb(r9)からの
オフセットとして定義します。
構文
{label} DCDO expr{,expr}...
説明:
expr
レジスタ相対式またはラベルを指定します。ベースレジスタには sb を指
定する必要があります。
用法
DCDO を使用して、スタティックベースレジスタ相対再配置可能アドレスに使用するメ
モリ内の空間を割り当てることができます。
例
IMPORT
DCDO
7-20
externsym
externsym
; 32-bit word relocated by offset of
; externsym from base of SB section.
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.3.8
DCFD と DCFDU
DCFDディレクティブは、ワード境界整列の倍精度浮動小数点数値にメモリを割り当て、
そのメモリの初回ランタイムの内容を定義します。倍精度数値には 2 ワードが必要と
なるため、これを算術命令で使用するにはワード境界で整列させる必要があります。
DCDFU は、メモリアライメントが任意であることを除いて、DCFD と同じです。
構文
{label} DCFD{U} fpliteral{,fpliteral}...
説明:
fpliteral 倍精度浮動小数点リテラルを指定します(P. 3-22「浮動小数点リテラル」
参照)。
用法
アセンブラは、4 バイトアライメントになるように、必要であれば最初に定義される値
の前に最大 3 バイトのパディングを挿入します。
アライメントが不要の場合は DCFDU を使用して下さい。
fpliteral を内部形式に変換する際に使用されるワード順序は、選択した浮動小数点
アーキテクチャによって制御されます。-fpu none オプションを選択した場合、DCFD
と DCFDU のどちらも使用できません。
倍精度数値の範囲を以下に示します。
•
最大値 1.79769313486231571e+308
•
最小値 2.22507385850720138e–308
P. 7-22「DCFS と DCFSU」を参照して下さい。
例
DCFD
DCFDU
ARM DUI0068BJ-00
1E308,-4E-100
10000,-.1,3.1E26
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-21
ディレクティブについて
7.3.9
DCFS と DCFSU
DCFSディレクティブは、ワード境界整列の単精度浮動小数点数値にメモリを割り当て、
このメモリの初回ランタイムの内容を定義します。単精度数値に 1 ワードが使用され、
この値を算術演算で使用するにはワード境界で整列させる必要があります。
DCDSU は、メモリアライメントが任意であることを除いて、DCFS と同じです。
構文
{label} DCFS{U} fpliteral{,fpliteral}...
説明:
fpliteral 単精度浮動小数点リテラルを指定します(P. 3-22「浮動小数点リテラル」
参照)。
用法
DCFS は、4 バイトアライメントとなるように、必要であれば最初に定義される数値の前
に最大 3 バイトのパディングを挿入します。
アライメントが不要の場合は DCFSU を使用して下さい。
単精度数値の範囲を以下に示します。
•
最大値 3.40282347e+38
•
最小値 1.17549435e–38
P. 7-21「DCFD と DCFDU」を参照して下さい。
例
DCFS
DCFSU
7-22
1E3,-4E-9
1.0,-.1,3.1E6
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.3.10
DCI
ARM コードでは、DCI ディレクティブは 4 バイト境界で整列した 1 ワード以上のメモ
リを割り当て、このメモリの初回ランタイムの内容を定義します。
Thumb コードでは、DCI ディレクティブは 2 バイト境界で整列した 1 ハーフワード以
上のメモリを割り当て、このメモリの初回ランタイムの内容を定義します。
構文
{label} DCI expr{,expr}
説明:
数値式を指定します(P. 3-20「数値式」参照)。
expr
用法
DCIディレクティブはDCDディレクティブやDCWディレクティブと非常に類似していま
すが、位置がデータではなくコードとしてマーキングされます。使用しているアセン
ブラのバージョンでサポートされていない新しい命令をマクロで記述する場合には、
DCI を使用して下さい。
ARM コードでは、DCI は 4 バイトアライメントとなるように、必要に応じて最初に定
義されるワードの前に最大 3 バイトのパディングを挿入します。Thumb コードでは、
DCI は 2 バイトアライメントとなるように、必要に応じて先頭バイトのパディングを挿
入します。
P. 7-19「DCD と DCDU」、P. 7-25「DCW と DCWU」を参照して下さい。
例
MACRO
newinst
DCI
MEND
ARM DUI0068BJ-00
; this macro translates newinstr Rd,Rm
; to the appropriate machine code
$Rd,$Rm
0xe16f0f10 :OR: ($Rd:SHL:12) :OR: $Rm
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-23
ディレクティブについて
7.3.11
DCQ と DCQU
DCQ ディレクティブは、4 バイト境界で整列した 1 つ以上の 8 バイトのメモリブロック
を割り当て、このメモリの初回ランタイムの内容を定義します。
DCQU は、メモリアライメントが任意であることを除いて、DCQ と同じです。
構文
{label} DCQ{U} {-}literal{,{-}literal}...
説明:
literal
64 ビットの数値リテラルを指定します(P. 3-21「数値リテラル」参照)。
許容数値範囲は 0 ~ 264 - 1 です。
数値リテラルで通常使用できる文字に加え、literal の接頭文字として
マイナス符号(-)を付けることができます。この場合の許容数値範囲は
-.263 ~ -1 となります。
-n を指定すると、264 - n を指定したときと同じ結果が得られます。
用法
DCQ は、4 バイトアライメントになるように、必要であれば最初に定義される 8 バイトブ
ロックの前に最大 3 バイトのパディングを挿入します。
アライメントが不要の場合は DCQU を使用して下さい。
その他、以下を参照して下さい。
•
DCB:P. 7-18
•
DCD と DCDU:P. 7-19
•
DCW と DCWU:P. 7-25
•
SPACE:P. 7-17
例
data
7-24
AREA
DCQ
DCQU
MiscData, DATA, READWRITE
-225,2_101
; 2_101 means binary 101.
number+4
; number must already be defined.
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.3.12
DCW と DCWU
DCW ディレクティブは、2 バイト境界で整列する 1 ハーフワード以上のメモリを割り当
て、そのメモリの初回ランタイムの内容を定義します。
DCWU は、メモリアライメントが任意であることを除いて、DCW と同じです。
構文
{label} DCW expr{,expr}...
説明:
expr
-32768 ~ 65535 の範囲内にある整数を求める数値式を指定します(P. 3-20
「数値式」参照)。
用法
DCW は 2 バイトアライメントとなるように、必要であれば最初に定義されているハーフ
ワードの前に 1 バイトのパディングを挿入します。
アライメントが不要の場合は DCWU を使用して下さい。
その他、以下を参照して下さい。
•
DCB:P. 7-18
•
DCD と DCDU:P. 7-19
•
DCQ と DCQU:P. 7-24
•
SPACE:P. 7-17
例
data
7.3.13
DCW
-225,2*number
DCWU
number+4
; number must already be defined
DATA
DATA ディレクティブは現在使用されていません。このディレクティブはアセンブラに
無視されます。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-25
ディレクティブについて
7.4
アセンブリ制御ディレクティブ
このセクションでは以下のディレクティブについて説明します。
•
MACRO と MEND:P. 7-27
7.4.1
•
MEXIT:P. 7-29
•
IF、ELSE、ENDIF:P. 7-30
•
WHILE と WEND:P. 7-32
ネストディレクティブ
以下の構造は、最大 256 層までネストすることが可能です。
•
MACRO 定義
•
WHILE...WEND ループ
•
IF...ELSE...ENDIF 条件構造
•
INCLUDE ファイルインクルード
上記の制限は、ネストの順序にかかわらず、全ての構造に対して適用されます。構造
タイプごとの制限が 256 層ではありません。
7-26
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.4.2
MACRO と MEND
MACRO ディレクティブはマクロ定義の開始を宣言します。マクロ定義は MEND ディレ
クティブで終了します。詳細については P. 2-48「マクロの使用」を参照して下さい。
構文
マクロの定義にはこの 2 つのディレクティブを使用します。書式は以下の通りです。
{$label}
MACRO
macroname {$parameter{,$parameter}...}
; code
MEND
説明:
$label
マクロが呼び出されるときに、指定されたシンボルで置換される
パラメータです。このシンボルはラベルであるのが一般的です。
macroname
マクロの名前を指定します。命令またはディレクティブの名前で
始まる名前は使用しないで下さい。
$parameter
マクロが呼び出されるときに置換されるパラメータです。パラ
メータのデフォルト値は以下の形式を使用して設定することが
できます。
$parameter="default value"
デフォルト値の中、あるいは一端にスペースがある場合は、二重
引用符("")を使用する必要があります。
用法
マクロ内で WHILE...WEND ループまたは IF...ENDIF 条件を先頭に配置する場合に
は、MEND ディレクティブに到達する前に閉じておく必要があります。ループ内から終
了する場合など、マクロからの早期イグジットを許可する必要がある場合には、P. 7-29
「MEXIT」を参照して下さい。
マクロ本体では、$label、$parameter などのパラメータは他の変数と同じ方法で使
用できます(P. 3-14「アセンブリ時の変数の代入」参照)。これらのパラメータには、
マクロが呼び出されるごとに新しい値が与えられます。通常のシンボルと区別するた
め、パラメータは $ で始める必要があります。パラメータはいくつでも使用できます。
$label はオプションです。このオプションはマクロが内部ラベルを定義している場合
に使用すると効果的であり、マクロへのパラメータとして処理されます。必ずしもマ
クロ展開での最初の命令を表すものではありません。このマクロは全てのラベル位置
を定義します。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-27
ディレクティブについて
パラメータのデフォルト値を使用するには、| を引数として使用します。この引数を省
略すると、空ストリングが使用されます。
複数の内部ラベルを使用するマクロでは、異なる接尾文字を使用して各内部ラベルを
ベースラベルとして定義すると効果的です。
マクロ展開でスペースが不要の場合は、パラメータと後続テキストの間にドット(.)
を使用します。前述テキストとパラメータの間にはドット(.)を使用しないで下さい。
マクロはローカル変数の有効範囲を定義します(P. 7-6「LCLA、LCLL、LCLS」参照)。
マクロはネストすることが可能です(P. 7-26「ネストディレクティブ」参照)。
例
; macro definition
$label
$label.loop1
$label.loop2
MACRO
xmac
; code
; code
; code
BGE
; code
BL
BGT
; code
ADR
; code
MEND
; start macro definition
$p1,$p2
$label.loop1
$p1
$label.loop2
$p2
; end macro definition
; macro invocation
abc
abcloop1
abcloop2
7-28
xmac
; code
; code
; code
BGE
; code
BL
BGT
; code
ADR
; code
subr1,de
abcloop1
;
;
;
;
;
invoke macro
this is what is
is produced when
the xmac macro is
expanded
subr1
abcloop2
de
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
アセンブリ時に診断を生成するマクロ:
MACRO
diagnose
INFO
MEND
$param1="default"
0,"$param1"
;
;
;
;
Macro definition
This macro produces
assembly-time diagnostics
(on second assembly pass)
; macro expansion
diagnose
diagnose "hello"
diagnose |
7.4.3
; Prints blank line at assembly-time
; Prints "hello" at assembly-time
; Prints "default" at assembly-time
MEXIT
MEXIT ディレクティブは、マクロが終わる前にマクロ定義を終了します。
用法
マクロ本体から終了する必要がある場合には、MEXIT を使用します。マクロ本体で終
了していない WHILE...WEND 閉ループまたは IF...ENDIF 条件は、マクロが終了す
る前にアセンブラによって終了されます。
P. 7-27「MACRO と MEND」を参照して下さい。
例
$abc
ARM DUI0068BJ-00
MACRO
macro
abc
$param1,$param2
; code
WHILE condition1
; code
IF condition2
; code
MEXIT
ELSE
; code
ENDIF
WEND
; code
MEND
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-29
ディレクティブについて
7.4.4
IF、
、ELSE、
、ENDIF
IF ディレクティブは、命令シーケンスとディレクティブシーケンスの一方または両方
をアセンブルするかどうかを決定する条件を導入します。[ は IF の同義語です。
ELSE ディレクティブは、先行条件が失敗した場合に、アセンブルを実行したい命令
シーケンスとディレクティブシーケンスの一方または両方の開始位置をマーキングし
ます。| は ELSE の同義語です。
ENDIF ディレクティブは、条件付きでアセンブルしたい命令シーケンスとディレク
ティブシーケンスの一方または両方の終わりマーキングします。] は ENDIF の同義語
です。
構文
IF logical-expression
...
{ELSE
...}
ENDIF
説明:
logical-expression
{TRUE} または {FALSE} を返す式を指定します。
P. 3-30「比較演算子」を参照して下さい。
用法
IF と ENDIF、さらにオプションで ELSE を組み合わせて使用することにより、命令シー
ケンスとディレクティブシーケンスの一方または両方を、指定した条件下でのみアセ
ンブルまたは作用させることができます。
IF...ENDIF 条件はネストできます(P. 7-26「ネストディレクティブ」参照)。
7-30
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
例
例 7-3 では、NEWVERSION が定義されている場合に最初の命令セットをアセンブルし、
定義されていない場合は別のセットをアセンブルします。
例 7-3 定義されている変数に対する条件付きアセンブリ
IF :DEF:NEWVERSION
; first set of instructions/directives
ELSE
; alternative set of instructions/directives
ENDIF
armasm を以下のように呼び出すことによって NEWVERSION が定義されるため、最初の
命令セットとディレクティブセットがアセンブルされます。
armasm -PD "NEWVERSION SETL {TRUE}" test.s
armasm を以下のように呼び出すと NEWVERSION が定義されないため、2 番目の命令
セットとディレクティブセットがアセンブルされます。
armasm test.s
例 7-4 では、NEWVERSION の値が {TRUE} の場合は最初の命令セット、それ以外の場
合は別のセットをアセンブルします。
例 7-4 定義されている変数に対する条件付きアセンブリ
IF NEWVERSION = {TRUE}
; first set of instructions/directives
ELSE
; alternative set of instructions/directives
ENDIF
以下のように armasm を呼び出すと、最初の命令セットとディレクティブセットがア
センブルされます。
armasm -PD "NEWVERSION SETL {TRUE}" test.s
以下のように armasm を呼び出すと、2 番目の命令セットとディレクティブセットがア
センブルされます。
armasm -PD "NEWVERSION SETL {FALSE}" test.s
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-31
ディレクティブについて
7.4.5
WHILE と WEND
WHILE ディレクティブは繰り返しアセンブルされる命令シーケンスまたはディレク
ティブシーケンスを開始します。シーケンスは WEND ディレクティブで終了します。
構文
WHILE logical-expression
code
WEND
説明:
logical-expression
{TRUE} または {FALSE} を返す式を指定します(P. 3-23「論理式」参照)。
用法
WHILE ディレクティブと WEND ディレクティブを組み合わせて使用することで、命令
シーケンスを繰り返しアセンブルできます。繰り返し回数は 0 にすることが可能です。
WHILE...WEND ループ内で IF...ENDIF 条件を使用することができます。
WHILE...WEND ループはネストできます(P. 7-26「ネストディレクティブ」参照)。
例
count
count
7-32
SETA
1
WHILE
count <= 4
SETA
count+1
; code
; code
WEND
;
;
;
;
;
you are not restricted to
such simple conditions
In this case,
this code will be
repeated four times
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.5
フレーム記述ディレクティブ
このセクションでは以下のディレクティブについて説明します。
•
FRAME ADDRESS:P. 7-34
•
FRAME POP:P. 7-35
•
FRAME PUSH:P. 7-36
•
FRAME REGISTER:P. 7-37
•
FRAME RESTORE:P. 7-38
•
FRAME SAVE:P. 7-39
•
FRAME STATE REMEMBER:P. 7-40
•
FRAME STATE RESTORE:P. 7-41
•
FUNCTION または PROC:P. 7-42
•
ENDFUNC または ENDP:P. 7-43
上記のディレクティブを正しく使用すると:
•
特に既存コードを修正するときに、関数構成内のエラーを回避できます。
•
アセンブラに関数構成内のエラーを警告させることができます。
•
デバッグ中の関数呼び出しのバックトレースが可能になります。
•
デバッガによるアセンブラ関数のプロファイリングが可能になります。
アセンブラ関数のプロファイリングは必要であるものの、その他の目的ではフレーム
記述ディレクティブを使用しない場合:
•
FUNCTION と ENDFUNC、または PROC と ENDP のディレクティブ対を使用する
必要があります。
•
別の FRAME ディレクティブは省略可能です。
•
プロファイリングの必要な関数に対してのみ FUNCTION と ENDFUNC ディレク
ティブを使用する必要があります。
DWARF2 における標準構造フレームアドレスは、割り込みが発生する関数の呼び出し
フレームの位置を指定する、スタック上のアドレスとなります。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-33
ディレクティブについて
7.5.1
FRAME ADDRESS
FRAME ADDRESS ディレクティブは、後続命令の標準構造フレームアドレスの算出方
法を記述します。このディレクティブは、FUNCTION と ENDFUNC、または PROC と
ENDP のディレクティブ対を使用する関数内でのみ使用できます。
構文
FRAME ADDRESS reg[,offset]
説明:
reg
標準構造フレームアドレスのベースとなるレジスタを指定します。関数
で別のフレームポインタを使用しない場合は sp を指定します。
offset
reg からの標準構造フレームアドレスのオフセットです。offset が 0 の
場合は省略できます。
用法
コードが標準構造フレームアドレスのベースとなるレジスタを変更する場合、または
そのレジスタからの標準構造フレームアドレスのオフセットを変更する場合には、
FRAME ADDRESS を使用して下さい。FRAME ADDRESS は標準構造フレームアドレスの
計算を変更する命令の直後に配置する必要があります。
注
コードが単一命令を使用してレジスタの保存とスタックポインタの変更を行う場合、
FRAME ADDRESS と FRAME SAVE を併用する代わりに、FRAME PUSH を使用することが
できます(P. 7-36「FRAME PUSH」参照)。
コードが単一命令を使用してレジスタのロードとスタックポインタの変更を行う場
合、FRAME ADDRESS と FRAME RESTORE を使用する代わりに FRAME POP を使用す
ることができます(P. 7-35「FRAME POP」参照)。
例
_fn
7-34
FUNCTION
; CFA (Canonical Frame Address) is value
; of sp on entry to function
STMFD
sp!, {r4,fp,ip,lr,pc}
FRAME PUSH {r4,fp,ip,lr,pc}
SUB
sp,sp,#4
; CFA offset now changed
FRAME ADDRESS sp,24
; - so we correct it
ADD
fp,sp,#20
FRAME ADDRESS fp,4
; New base register
; code using fp to base call-frame on, instead of sp
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.5.2
FRAME POP
FRAME POP ディレクティブを使用して、呼び出し先がいつレジスタをリロードするか
をアセンブラに通知することができます。このディレクティブは、FUNCTION と
ENDFUNC、
またはPROCとENDPのディレクティブ対を用いた関数内でのみ使用できます。
関数内の最後の命令の後に、このディレクティブを使用する必要はありません。
構文
FRAME POP には以下に示す 2 つの構文があります。
FRAME POP {reglist}
FRAME POP n
説明:
reglist
関数へのエントリ時に保持していた値に復元されるレジスタのリストで
す。リストには 1 つ以上のレジスタを指定する必要があります。
n
スタックポインタの移動バイト数です。
用法
FRAME POP は、FRAME ADDRESS と FRAME RESTORE を使用することと同じです。こ
のディレクティブを使用すると、1 つの命令でレジスタをロードし、スタックポインタ
を変更することができます。
FRAME POP は、実際にポップした命令の直後に配置する必要があります。
アセンブラは標準構造フレームアドレスの新しいオフセットを算出します。このとき、
アセンブラは以下を想定します。
•
ポップする各 ARM レジスタはスタックの 4 バイトを占有していた。
•
ポップする各 FPA 浮動小数点レジスタはスタックの 12 バイトを占有していた。
•
ポップする各 VFP 単精度レジスタはスタックの 4 バイトを占有していた。上記
に加え、リストごとに 4 バイトワードが POP される。
P. 7-34「FRAME ADDRESS」、P. 7-38「FRAME RESTORE」を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-35
ディレクティブについて
7.5.3
FRAME PUSH
FRAME PUSH ディレクティブを使用して、呼び出し先がいつレジスタを保存するかを、
通常は関数エントリで、アセンブラに通知することができます。このディレクティブ
は FUNCTION と ENDFUNC、または PROC と ENDP のディレクティブ対を用いた関数内
でのみ使用できます。
構文
FRAME PUSH には以下に示す 2 つの構文があります。
FRAME PUSH {reglist}
FRAME PUSH n
説明:
reglist
標準構造フレームアドレスの下に連続してストアされるレジスタのリス
トを指定します。リストには 1 つ以上のレジスタを指定する必要があり
ます。
n
スタックポインタの移動バイト数です。
用法
FRAME PUSH は、FRAME ADDRESS と FRAME SAVE ディレクティブを使用することと同
じです。このディレクティブを使用することで、1 つの命令でレジスタをストアし、ス
タックポインタを変更することができます。
FRAME PUSH は、実際にプッシュした命令の直後に配置する必要があります。
アセンブラは標準フレームアドレスの新しいオフセットを算出します。このとき、ア
センブラは以下を想定しています。
•
プッシュする各 ARM レジスタはスタックの 4 バイトを占有する。
•
プッシュする各 FPA 浮動小数点レジスタはスタックの 12 バイトを占有する。
•
プッシュする VFP 単精度レジスタはスタックの 4 バイトを占有する。上記に加
え、リストごとに 4 バイトワードを占有する。
P. 7-34「FRAME ADDRESS」、P. 7-39「FRAME SAVE」を参照して下さい。
7-36
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
例
p
7.5.4
PROC ; Canonical frame address is sp + 0
EXPORT p
STMFD
sp!,{r4-r6,lr}
; sp has moved relative to the canonical frame address,
; and registers r4, r5, r6 and lr are now on the stack
FRAME PUSH {r4-r6,lr}
; Equivalent to:
; FRAME ADDRESS
sp,16
; 16 bytes in {r4-r6,lr}
; FRAME SAVE
{r4-r6,lr},-16
FRAME REGISTER
FRAME REGISTER ディレクティブを使用して、レジスタに保持されている関数の引数
の位置を記録するレコードを保存することができます。このディレクティブは、
FUNCTIONとENDFUNC、またはPROCとENDPのディレクティブ対を用いた関数内でのみ
使用できます。
構文
FRAME REGISTER reg1,reg2
説明:
reg1
関数へのエントリ時に引数を保持するレジスタを指定します。
reg2
値を保存するレジスタを指定します。
用法
FRAME REGISTER ディレクティブは、あるレジスタを使用して、関数へのエントリ時
に別のレジスタに保持されていた引数を保存する場合に使用します。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-37
ディレクティブについて
7.5.5
FRAME RESTORE
FRAME RESTORE ディレクティブを使用して、関数へのエントリ時に保持していた値
に指定レジスタの内容が復元されたことをアセンブラに通知できます。このディレク
ティブは、FUNCTION と ENDFUNC、または PROC と ENDP のディレクティブ対を用い
た関数内でのみ使用できます。
構文
FRAME RESTORE {reglist}
説明:
reglist
内容が復元されるレジスタのリストです。リストには 1 つ以上のレジス
タを指定する必要があります。
用法
FRAME RESTORE は、呼び出し先がスタックからレジスタをリロードした直後に使用し
ます。関数内の最後の命令の後では、このディレクティブを使用する必要はありません。
reglist には、整数レジスタまたは浮動小数点レジスタのどちらかを指定することが
できますが、両方は指定できません。
注
コードが 1 つの命令を使用してレジスタのロードとスタックポインタの変更を行う場
合は、FRAME RESTORE と FRAME ADDRESS を使用する代わりに FRAME POP を使用
することができます(P. 7-35「FRAME POP」参照)。
7-38
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.5.6
FRAME SAVE
FRAME SAVE ディレクティブは、標準構造フレームアドレスに相対する保存レジスタ
の内容の位置を記述します。このディレクティブは、FUNCTION と ENDFUNC、または
PROC と ENDP のディレクティブ対を用いた関数内でのみ使用できます。
構文
FRAME SAVE {reglist}, offset
説明:
reglist
標準構造フレームアドレスからの offset で始まり、連続してストアさ
れるレジスタのリストです。リストには 1 つ以上のレジスタを指定する
必要があります。
用法
FRAME SAVE は、呼び出し先がレジスタをスタックにストアした直後に配置します。
reglist には、バックトレースで不要なレジスタも指定することができます。アセン
ブラは、DWARF 呼び出しフレーム情報に記録する必要のあるレジスタを決定します。
注
コードが 1 つの命令でレジスタのストアとスタックポインタの変更を行う場合は、
FRAME SAVE と FRAME ADDRESS を使用する代わりに FRAME PUSH を使用できます
(P. 7-36「FRAME PUSH」参照)。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-39
ディレクティブについて
7.5.7
FRAME STATE REMEMBER
FRAME STATE REMEMBER ディレクティブは、標準構造フレームアドレスと保存レジ
スタ値の位置の算出方法に関する現在の情報を保存します。このディレクティブは
FUNCTIONとENDFUNC、またはPROCとENDPのディレクティブ対を用いた関数内でのみ
使用できます。
構文
FRAME STATE REMEMBER
用法
インラインイグジットシーケンスの間に、標準構造フレームアドレスの算出と保存レ
ジスタ値の位置に関する情報を変更することができます。イグジットシーケンスの後、
前と同じ情報を使用して別の分岐を継続させることができます。この情報を保存する
には FRAME STATE REMEMBER を、復元するには FRAME STATE RESTORE を使用し
ます。
これらのディレクティブはネストが可能です。各 FRAME STATE RESTORE ディレク
ティブは、それぞれ対応する FRAME STATE REMEMBER ディレクティブと対で使用す
る必要があります。以下を参照して下さい。
•
FRAME STATE RESTORE:P. 7-41
•
FUNCTION または PROC:P. 7-42
例
exitB
7-40
; function code
FRAME STATE REMEMBER
; save frame state before in-line exit sequence
LDMFD
sp!,{r4-r6,pc}
; no need to FRAME POP here, as control has
; transferred out of the function
FRAME STATE RESTORE
; end of exit sequence, so restore state
; code for exitB
LDMFD
sp!,{r4-r6,pc}
ENDP
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.5.8
FRAME STATE RESTORE
FRAME STATE RESTORE ディレクティブは、標準構造フレームアドレスの算出方法と
保存レジスタ値の位置に関する情報を復元します。このディレクティブは、FUNCTION
と ENDFUNC、または PROC と ENDP のディレクティブ対を用いた関数内でのみ使用で
きます。
構文
FRAME STATE RESTORE
用法
以下を参照して下さい。
•
FRAME STATE REMEMBER:P. 7-40
•
ARM DUI0068BJ-00
FUNCTION または PROC:P. 7-42
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-41
ディレクティブについて
7.5.9
FUNCTION または PROC
FUNCTION ディレクティブは ATPCS 準拠の関数の開始位置をマーキングします。PROC
は FUNCTION の同義語です。
構文
label FUNCTION
用法
FUNCTION を使用して関数の開始位置をマーキングすることができます。アセンブラは
ELF 形式の DWARF 呼び出しフレーム情報を生成する際に、FUNCTION を使用して関
数の開始を識別します。
FUNCTIONは標準構造フレームアドレスをspにセットし、フレーム状態スタックを空に
します。
各 FUNCTION ディレクティブは、それぞれ対応する ENDFUNC ディレクティブと対で
使用する必要があります。FUNCTION/ENDFUNC 対をネストすることも、PROC または
ENDP ディレクティブを含めることもできません。
P. 7-34「FRAME ADDRESS」、P. 7-41「FRAME STATE RESTORE」を参照して下さい。
例
dadd
7-42
FUNCTION
EXPORT dadd
STMFD
sp!,{r4-r6,lr}
FRAME PUSH {r4-r6,lr}
; subroutine body
LDMFD
sp!,{r4-r6,pc}
ENDFUNC
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.5.10
ENDFUNC または ENDP
ENDFUNC ディレクティブは ATPCS 準拠関数の終わりをマーキングします(P. 7-42
「FUNCTION または PROC」参照)。ENDP は ENDFUNC の同義語です。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-43
ディレクティブについて
7.6
通知ディレクティブ
このセクションでは以下のディレクティブについて説明します。
•
ASSERT
アセンブリ中にアサートが FALSE であることを検出すると、エラーメッセージ
を生成します。
•
INFO:P. 7-45
アセンブリ中に診断情報を生成します。
•
OPT:P. 7-46
リストオプションをセットします。
•
TTL と SUBT:P. 7-48
リストにタイトルとサブタイトルを挿入します。
7.6.1
ASSERT
ASSERT ディレクティブは、指定されているアサートが FALSE になると、アセンブリ
の 2 回目のパスでエラーメッセージを生成します。
構文
ASSERT logical-expression
説明:
logical-expression
{TRUE} または {FALSE} のどちらかを返すアサートを指定します。
用法
ASSERT を使用して、アセンブリ中に必要条件が満たされていることを確認することが
できます。
アサートが FALSE になるとエラーメッセージが生成され、アセンブリに失敗します。
P. 7-45「INFO」を参照して下さい。
例
ASSERT
7-44
label1 <= label2
;
;
;
;
Tests if the address
represented by label1
is <= the address
represented by label2.
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.6.2
INFO
INFO ディレクティブはアセンブリのいずれかのパスにおける診断生成をサポートし
ます。
! は INFO と非常に類似していますが、簡略化された報告が生成されます。
構文
INFO numeric-expression, string-expression
説明:
numeric-expression
アセンブリ中に評価される数値式です。式の結果が 0 の場合:
•
•
最初のパスでは何もアクションも発生しません。
2 番目のパスで string-expression が印字されます。
式の結果が 0 以外の場合には、エラーメッセージとして
string-expression が印字され、アセンブリが失敗します。
string-expression
ストリングを返す式を指定します。
用法
INFO を使用することにより、エラーメッセージを柔軟にカスタマイズすることができ
ます。数値式とストリング式にについては、P. 3-20「数値式」、P. 3-19「ストリング式」
を参照して下さい。
P. 7-44「ASSERT」も参照して下さい。
例
INFO
0, "Version 1.0"
IF endofdata <= label1
INFO
4, "Data overrun at label1"
ENDIF
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-45
ディレクティブについて
7.6.3
OPT
OPT ディレクティブは、ソースコード内からのリストオプションをセットします。
構文
OPT n
説明:
OPT ディレクティブの設定を示します。有効な設定については、表 7-2 を
参照して下さい。
n
表 7-2 OPT ディレクティブの設定
OPT n
作用
1
通常のリストをオンにします。
2
通常のリストをオフにします。
4
ページ送り。直ぐに書式送りを実行し、新規ページを開始します。
8
行番号カウンタを 0 にリセットします。
16
SET、GBL、LCL ディレクティブのリストをオンにします。
32
SET、GBL、LCL ディレクティブのリストをオフにします。
64
マクロ展開リストをオンにします。
128
マクロ展開リストをオフにします。
256
マクロ呼び出しリストをオンにします。
512
マクロ呼び出しリストをオフにします。
1024
1 パスのリストをオンにします。
2048
1 パスのリストをオフにします。
4096
条件付きディレクティブのリストをオンにします。
8192
条件付きディレクティブのリストをオフにします。
16384
MEND ディレクティブのリストをオンにします。
32768
MEND ディレクティブのリストをオフにします。
用法
リストを有効にするには、-list アセンブラオプションを指定して下さい。
7-46
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
デフォルトでは、-list オプションを使用することにより、変数宣言、マクロ展開、
呼び出し条件付きディレクティブ、MEND ディレクティブを含む通常のリストが生成さ
れます。このリストは 2 番目のパスでのみ生成されます。OPT ディレクティブは、コー
ド内からデフォルトのリストオプションを変更するときに使用します。-list オプ
ションの詳細については、P. 3-2「コマンド構文」を参照して下さい。
OPT を使用して、コードリストをフォーマットすることができます。例えば、関数やセ
クションの前に新規ページを指定することが可能です。
例
start
func1
ARM DUI0068BJ-00
AREA
; code
; code
BL
; code
OPT 4
; code
Example, CODE, READONLY
func1
; places a page break before func1
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-47
ディレクティブについて
7.6.4
TTL と SUBT
TTL ディレクティブは、リストファイルの各ページの先頭にタイトルを挿入します。こ
のタイトルは、別の TTL ディレクティブが発行されるまで各ページに印字されます。
SUBT ディレクティブは、リストファイルのページ上にサブタイトルを挿入します。サ
ブタイトルは別の SUBT ディレクティブが発行されるまで各ページに印字されます。
構文
TTL title
SUBT subtitle
説明:
title
タイトルを指定します。
subtitle
サブタイトルを指定します。
用法
リストファイルのページ先頭にタイトルを配置するには、TTL ディレクティブを使用
します。最初のページにタイトルを表示したい場合には、TTL ディレクティブをソー
スファイルの一行目に配置する必要があります。
タイトルを変更するには、別の TTL ディレクティブを使用します。新しい TTL ディレ
クティブは、次のページの先頭から有効となります。
リストファイルのページ先頭にサブタイトルを挿入するには、SUBT ディレクティブを
使用します。サブタイトルはタイトル下の行に表示されます。最初のページにサブタ
イトルを表示したい場合には、SUBT ディレクティブをソースファイルの一行目に配置
する必要があります。
サブタイトルを変更するには、別の SUBT ディレクティブを使用します。新しい SUBT
ディレクティブは、次のページの先頭から有効となります。
例
7-48
TTL
First Title
SUBT
First Subtitle
;
;
;
;
;
;
places a title on the first
and subsequent pages of a
listing file.
places a subtitle on the
second and subsequent pages
of a listing file.
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.7
その他のディレクティブ
このセクションでは以下のディレクティブについて説明します。
•
ALIGN:P. 7-50
ARM DUI0068BJ-00
•
AREA:P. 7-52
•
CODE16 と CODE32:P. 7-54
•
END:P. 7-55
•
ENTRY:P. 7-56
•
EQU:P. 7-57
•
EXPORT または GLOBAL:P. 7-58
•
EXTERN:P. 7-60
•
GET または INCLUDE:P. 7-61
•
GLOBAL:P. 7-62
•
IMPORT:P. 7-62
•
INCBIN:P. 7-63
•
INCLUDE:P. 7-63
•
KEEP:P. 7-64
•
NOFP:P. 7-65
•
REQUIRE:P. 7-65
•
REQUIRE8 と PRESERVE8:P. 7-66
•
RN:P. 7-67
•
ROUT:P. 7-68
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-49
ディレクティブについて
7.7.1
ALIGN
ALIGN ディレクティブは、0 でパディングすることにより、現在の位置を指定された
境界に整列させます。
構文
ALIGN {expr{,offset}}
説明:
expr
20 ~ 231 で 2 の累乗を求める数値式を指定します。
offset
任意の数値式を指定できます。
現在の位置は以下の形式を使用する次のアドレスに位置合わせされます。
offset + n * expr
expr を指定していない場合、ALIGN は現在の位置を次のワード(4 バイト)境界にセッ
トします。
用法
ALIGN を使用して、データやコードを適切な境界に整列させることができます。境界
整列は以下のような状況で行う必要があります。
•
ADR Thumb 擬似命令がワード境界で整列したアドレスしかロードできないのに
対し、Thumb コード内のラベルがワード境界で整列していない可能性がある場
合。この場合は、ALIGN 4 を使用して Thumb コード内のアドレスを 4 バイト境
界で整列させます。
•
ARM プロセッサの中には ALIGN を使用してキャッシュを活用できるものがあり
ます。例えば、ARM940T は 16 バイト行を使用するキャッシュを搭載していま
す。ALIGN 16 を使用することで、関数エントリを 16 バイト境界で整列させ、
キャッシュの効率性を最大限に高めることができます。
•
LDRD および STRD を使用したダブルワードのデータ転送を 8 バイト境界で整列
させる必要がある場合。このデータに LDRD または STRD を使用してアクセスす
る場合には、DCQ などのメモリ割り当てディレクティブ(P. 7-13「データ定義
ディレクティブ」参照)の前に ALIGN 8 を使用します。
•
1 行に単独で配置されているラベルが、任意の境界で整列している可能性がある
場合。それに続く ARM コードはワード境界で整列します(Thumb コードはハー
フワード境界で整列します)。したがって、このラベルはコードを正しくアドレ
ス指定していないことになります。この場合は、ラベルの前に ALIGN 4(Thumb
では ALIGN 2)を使用します。
アライメントがルーチンが配置されている ELF セクションの開始位置と相対している
場合。このセセクションは同じ境界か、さらに粗い境界で整列させる必要があります。
AREA ディレクティブに対する ALIGN 属性は指定方法が異なります(P. 7-52「AREA」、
P. 7-51「例」参照)。
7-50
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
例
rout1
rout2
AREA
; code
; code
MOV
ALIGN
; code
cacheable, CODE, ALIGN=3
; aligned on 8-byte boundary
AREA
DCB
ALIGN
DCB
OffsetExample, CODE
1
; This example places the two
4,3
; bytes in the first and fourth
1
; bytes of the same word.
pc,lr
8
; aligned only on 4-byte boundary
; now aligned on 8-byte boundary
AREA
Example, CODE, READONLY
LDR
r6,=label1
; code
MOV
pc,lr
label1 DCB
1
; pc now misaligned
ALIGN
; ensures that subroutine1 addresses
subroutine1
; the following instruction.
MOV r5,#0x5
start
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-51
ディレクティブについて
7.7.2
AREA
AREA ディレクティブはアセンブラに対し、新しいコードセクションまたはデータセク
ションのアセンブルを指示します。セクションは、名前の付いた独立のコードまたは
データの不可分チャンクであり、リンカによって操作されます。詳細については P. 2-15
「ELF セクションと AREA ディレクティブ」を参照して下さい。
構文
AREA sectionname{,attr}{,attr}...
説明:
sectionname セクションに付ける名前を指定します。
セクションには任意の名前を指定することができます。ただし、数字
で始まる名前はバー(縦線)で囲む必要があります。これに反すると
セクション名のエラーが生成されます。例:|1_DataArea|
一部の名前は既に使用されています。例えば、|.text| は C コンパイ
ラが生成するコードセクションに、あるいは C ライブラリに関連付け
られたコードセクションに使用されます。
attr
カンマで区切った 1 つ以上のセクション属性を指定します。以下は有
効な属性です。
ALIGN=expression
デフォルトでは、ELF セクションは 4 バイト境界で整列され
ます。expression は 0 ~ 31 の任意の整数を指定できます。
このセクション 2expression バイト境界で整列されます。例えば、
expression が 10 の場合、セクションは 1KB 境界で整列されま
す。これは ALIGN ディレクティブを指定する方法とは異なり
ます。P. 7-50「ALIGN」を参照して下さい。
注
コードセクションには、ALIGN=0 または ALIGN=1 を使用し
ないで下さい。
ASSOC=section
CODE
section は関連 ELF セクションを指定します。sectionname
は section を含む全てのリンクでインクルードする必要があ
ります。
命令属性を定義します。READONLY がデフォルトです。
COMDEF 共通セクション定義です。この ELF セクションには、コード
またはデータを含めることができます。このセクションは、他
のソースファイルに含まれる同じ名前のセクションと同一で
ある必要があります。
7-52
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
COMMON
DATA
NOINIT
同じ名前の同一 ELF セクションは、リンカによって同じメ
モリセクションにオーバレイされます。何らかの違いがある
場合、リンカは警告を生成し、セクションをオーバレイしま
せん。ADS リンカ / ユーティリティガイドの「リンカ」を参
照して下さい。
共通データセクションです。このセクション内にはコードも
データも定義しないで下さい。このセクションはリンカに
よって 0 に初期化されます。同じ名前の全ての共通セクショ
ンが、リンカによって同じメモリセクションにオーバレイさ
れます。これらのセクションが全て同じサイズであるとは限
りません。リンカは、名前ごとの最大の共通セクションに要
求される空間をできる限り割り当てます。
命令ではなく、データセクションです。READWRITE がデフォ
ルトです。
データセクションを初期化しない、または 0 に初期化するこ
とを示します。空間予約ディレクティブ SPACE、あるいは初
期化値を 0 とした DCB、DCD、DCDU、DCQ、DCQU、DCW、
DCWU のみが含まれます。リンク時、AREA を初期化しないか、
または 0 に初期化するかのどちらか決定することができます
(ADS リンカ / ユーティリティガイドの「リンカ」参照)。
セクションが書き込み不可であることを示します。コードエ
リアのデフォルトにはこの設定が使用されます。
READWRITE セクションが読み取り/書き込み可能であることを示します。
データエリアのデフォルトにはこの設定が使用されます。
READONLY
用法
AREAディレクティブを使用して、ソースファイルをELFセクションに細分化できます。
複数の AREA ディレクティブで同じ名前を使用できます。同じ名前の付いた全てのエリ
アが同一 ELF セクション内に配置されます。
通常は、コードとデータに別々の ELF セクションを使用する必要があります。一般的
に、大きなプログラムは適切な複数のコードセクションに分割できます。大きな独立
データセットも、通常は最も良い形で別々のセクションに配置されます。
ローカルラベルの有効範囲は AREA で定義し、オプションとして ROUT ディレクティブ
で細分化します(P. 3-16「ローカルラベル」、P. 7-68「ROUT」参照)。
アセンブリには最低 1 つの AREA ディレクティブが必要です。
例
以下の例では、Example と命名された読み出し専用の命令セクションを定義します。
AREA
ARM DUI0068BJ-00
Example,CODE,READONLY
; code
; An example code section.
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-53
ディレクティブについて
7.7.3
CODE16 と CODE32
CODE16 ディレクティブはアセンブラに対し、後続の命令を 16 ビット Thumb 命令とし
て解釈するよう指示します。また必要に応じ、次のハーフワード境界に整列させる目
的で 1 バイトのパディングを挿入します。
CODE32 ディレクティブはアセンブラに対し、後続の命令を 32 ビット ARM 命令とし
て解釈するよう指示します。必要に応じ、次のハーフワード境界に整列させる目的で 3
バイトのパディングを挿入します。
構文
CODE16
CODE32
用法
ARM コードと Thumb コードが混在するファイルでは:
•
ARM 状態から Thumb 状態に変更する場合は CODE16 を使用します。CODE16 は
必ず Thumb コードの前に配置する必要があります。
•
Thumb 状態から ARM 状態に変更する場合は CODE32 を使用します。CODE32 は
必ず ARM コードの前に配置する必要があります。
CODE16 と CODE32 をアセンブルしても、状態を変更する命令は生成されません。これ
らのディレクティブは、アセンブラに対して Thumb 命令または ARM 命令を適切にア
センブルし、必要であればパディングを挿入するように指示するだけです。
例
以下の例では、CODE16 を使用して ARM 命令から Thumb 命令に分岐する方法を示し
ます。
AREA
CODE32
ChangeState, CODE, READONLY
LDR
r0,=start+1
BX
r0
;
;
;
;
This section starts in ARM state
Load the address and set the
least significant bit
Branch and exchange instruction sets
; Not necessarily in same section
start
7-54
CODE16
MOV
r1,#10
; Following instructions are Thumb
; Thumb instructions
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.7.4
END
END ディレクティブは、ソースファイルの終わりに到達したことをアセンブラに通知
します。
構文
END
用法
どのアセンブリ言語ソースファイルも、最後の 1 行に END を単独で使用して終了する
必要があります。
ソースファイルが GET ディレクティブによって親ファイルにインクルードされている
場合には、アセンブラは親ファイルに戻り、GET ディレクティブに続く次の行からア
センブルを続行します。詳細については P. 7-61「GET または INCLUDE」を参照して下
さい。
最初のパスでエラーが発生することなく、トップレベルのソースファイル内で END に
到達すると、2 番目のパスが開始されます。
2 番目のパスでトップレベルのソースファイル内で END に到達すると、アセンブラは
アセンブリを終了して適切な出力を書き出します。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-55
ディレクティブについて
7.7.5
ENTRY
ENTRY ディレクティブはプログラムへのエントリポイントを宣言します。
構文
ENTRY
用法
プログラムには最低 1 つの ENTRY ポイントを指定する必要があります。ENTRY が存在
しない場合には、リンク時に警告が生成されます。
1 つのソースファイルで複数の ENTRY ディレクティブを使用することはできません。
全てのソースファイルに ENTRY ディレクティブを使用する必要はありません。1 つの
ソースファイルに複数の ENTRY が存在すると、アセンブリ時にエラーメッセージが生
成されます。
例
AREA
ENTRY
7-56
ARMex, CODE, READONLY
; Entry point for the application
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.7.6
EQU
EQU ディレクティブは、数値定数、レジスタ相対値あるいはプログラム相対値にシン
ボリック名を与えます。* は EQU の同義語です。
構文
name EQU expr{, type}
説明:
name
値に割り当てるシンボリック名を指定します。
expr
レジスタ相対アドレス、プログラム相対アドレス、絶対アドレス、32 ビッ
ト整数のいずれかを指定します。
type
オプションです。type には以下のいずれかを指定できます。
•
CODE16
•
CODE32
•
DATA
type は、expr に絶対アドレスを指定してはじめて使用することができ
ます。name がエクスポートされるとき、オブジェクトファイルに含ま
れるシンボルテーブル内の name エントリが、type に指定した CODE16、
CODE32、あるいは DATA でマーキングされます。この情報はリンカで使
用される場合があります。
用法
EQU を使用して定数を定義することができます。このディレクティブは C で定数を定義
する #define と類似しています。
シンボルのエクスポートについては、P. 7-64「KEEP」、P. 7-58「EXPORT または GLOBAL」
を参照して下さい。
例
ARM DUI0068BJ-00
abc EQU 2
; assigns the value 2 to the symbol abc.
xyz EQU label+8
; assigns the address (label+8) to the
; symbol xyz.
fiq EQU 0x1C, CODE32
; assigns the absolute address 0x1C to
; the symbol fiq, and marks it as code
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-57
ディレクティブについて
7.7.7
EXPORT または GLOBAL
EXPORT ディレクティブは、リンカが別々のオブジェクトファイルとライブラリファイ
ルにあるシンボル参照を解決する目的で使用できるシンボルを宣言します。GLOBAL は
EXPORT の同義語です。
構文
EXPORT {symbol}{[WEAK]}
説明:
symbol
エクスポートするシンボル名を指定します。シンボル名は大文字・小文
字が区別されます。symbol を省略した場合には、全てのシンボルがエ
クスポートされます。
[WEAK]
symbol の別のインスタンスをエクスポートする他のソースが存在しな
い場合に、これが指定されているインスタンスをインポートする必要が
あることを意味します。symbol を指定せずに [WEAK] を使用した場合
には、エクスポートされる全てのシンボルが WEAK になります。
用法
EXPORT を使用することにより、他のファイルに含まれるコードが、現在のファイルに
含まれるシンボルにアクセスすることができます。
[WEAK] 属性を使用すると、symbol の別のインスタンスが他のソースに存在する場合
には、[WEAK] が付いたインスタンスよりもそのインスタンスが優先されることをリン
カに通知できます。
P. 7-62「IMPORT」を参照して下さい。
例
AREA
EXPORT
DoAdd
7-58
ADD
Example,CODE,READONLY
DoAdd
; Export the function name
; to be used by external
; modules.
r0,r0,r1
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.7.8
EXPORTAS
EXPORTAS ディレクティブにより、シンボルをオブジェクトファイルにエクスポート
し、ソースファイル内の別のシンボルに対応させることができます。
構文
EXPORTAS symbol1, symbol2
説明:
symbol1
ソースファイル内のシンボル名を指定します。symbol1 は定義済みの名
前である必要があります。エリア名、ラベル、定数を含め、任意のシン
ボルを指定することができます。
symbol2
オブジェクトファイル内にエクスポートしたいシンボル名を指定しま
す。
シンボル名の大文字・小文字は区別されます。
用法
EXPORTAS を使用して、ソースファイル内のどのインスタンスも変更することなく、オ
ブジェクトファイル内のシンボルを変更することができます。
P. 7-58「EXPORT または GLOBAL」を参照して下さい。
例
AREA data1, DATA
;; starts a new area data1
AREA data2, DATA
;; starts a new area data2
EXPORTAS data2, data1 ;; the section symbol referred to as data2 will
;; appear in the object file string table as data1.
one EQU 2
EXPORTAS one, two
EXPORT one
ARM DUI0068BJ-00
;; the symbol 'two' will appear in the object
;; file's symbol table with the value 2.
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-59
ディレクティブについて
7.7.9
EXTERN
EXTERN ディレクティブは、現在のアセンブリで定義されない名前をアセンブラに通知
します。
EXTERN は IMPORT と非常に似ていますが、現在のアセンブリで指定した名前への参照
が検出されない場合に、その名前がインポートされない点が異なります(P. 7-62
「IMPORT」、P. 7-58「EXPORT または GLOBAL」参照)。
構文
EXTERN symbol{[WEAK]}
説明:
symbol
単独でアセンブルされるソースファイル、オブジェクトファイルあるい
はライブラリで定義されているシンボル名を指定します。シンボル名の
大文字・小文字は区別されます。
[WEAK]
このオプションを指定すると、シンボルがどこにも定義されていない場
合でもリンカはエラーメッセージを生成しません。さらに、まだインク
ルードされていないライブラリをリンカに検索させずに済みます。
用法
名前はリンク時に別のオブジェクトファイルで定義されたシンボルに解決されます。
このシンボルはプログラムアドレスとみなされます。[WEAK] が指定されていない場合
に、リンク時に対応するシンボルを検出できなければ、リンカはエラーを生成します。
[WEAK] を指定し、リンク時に対応するシンボルが検出されない場合:
•
参照が B 命令または BL 命令のデスティネーションである場合、そのシンボルの
値は次の命令のアドレスとみなされます。これにより、B 命令または BL 命令は
事実上 NOP となります。
•
その他の場合、シンボルの値は 0 とみなされます。
例
この例は、C++ ライブラリがリンクされているかどうかをテストし、その結果に基づ
いて条件付きで分岐する様子を示しています。
AREA
Example, CODE, READONLY
EXTERN __CPP_INITIALIZE[WEAK] ;
;
LDR
r0,__CPP_INITIALIZE
;
CMP
r0,#0
;
BEQ
nocplusplus
;
7-60
If C++ library linked, gets the address of
__CPP_INITIALIZE function.
If not linked, address is zeroed.
Test if zero.
Branch on the result.
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.7.10
GET または INCLUDE
GET ディレクティブは、アセンブル中のファイル内にファイルをインクルードします。
インクルードされたファイルは GET ディレクティブの位置でアセンブルされます。
INCLUDE は GET の同義語です。
構文
GET filename
説明:
filename
アセンブリでインクルードするファイルの名前を指定します。アセンブ
ラは、UNIX 形式または MS-DOS 形式のパス名を認識します。
用法
GET は、アセンブリにマクロ定義、EQU、記憶域マップをインクルードする場合に使用
すると効果的です。インクルードされたファイルのアセンブリが完了すると、アセン
ブリは GET ディレクティブの次の行から継続されます。
デフォルトでは、アセンブラはインクルードするファイルを現在の位置で検索します。
現在の位置は、呼び出しファイルが保存されているディレクトリです。検索パスにディ
レクトリを追加するには、-i アセンブラコマンドラインオプションを使用します。ス
ペースが含まれるファイル名とディレクトリ名は、二重引用符(" ")で囲む必要はあ
りません。
インクルードされるファイルに別の GET ディレクティブを含めることで、他のファイ
ルをインクルードできます(P. 7-26「ネストディレクティブ」参照)。
インクルードされるファイルが現在の位置と異なるディレクトリにある場合、インク
ルードされるファイルの終わりまでは、このディレクトリが現在の位置となります。そ
の後、前の現在の位置が復元されます。
GET はオブジェクトファイルのインクルードには使用できません(P. 7-63「INCBIN」参
照)。
例
AREA
GET
GET
GET
ARM DUI0068BJ-00
Example, CODE, READONLY
file1.s
; includes file1 if it exists
; in the current place.
c:\project\file2.s
; includes file2
c:\Program files\file3.s ; space is allowed
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-61
ディレクティブについて
7.7.11
GLOBAL
P. 7-58「EXPORT または GLOBAL」を参照して下さい。
7.7.12
IMPORT
IMPORT ディレクティブはアセンブラに対し、現在のアセンブリで定義されない名前を
通知します。
IMPORT は EXTERN と非常に似ていますが、現在のアセンブリで指定した名前が参照さ
れるかどうかに関係なく、その名前がインポートされる点が異なります。(P. 7-60
「EXTERN」、P. 7-58「EXPORT または GLOBAL」参照)。
構文
IMPORT symbol{[WEAK]}
説明:
symbol
単独でアセンブルされるソースファイル、オブジェクトファイルあるい
はライブラリで定義されているシンボル名を指定します。シンボル名の
大文字・小文字は区別されます。
WEAK
このオプションを指定すると、シンボルがどこにも定義されていない場
合でもリンカはエラーメッセージを生成しません。さらに、まだインク
ルードされていないライブラリをリンカに検索させずに済みます。
用法
指定した名前は、リンク時に別のオブジェクトファイル内で定義されているシンボル
に解決されます。このシンボルはプログラムアドレスとみなされます。[WEAK] を指定
していない場合、リンク時に対応するシンボルが検出されなければ、リンカがエラー
を生成します。
[WEAK] を指定し、リンク時に対応するシンボルが検出されない場合:
•
その参照が B 命令または BL 命令のデスティネーションである場合、シンボルの
値は次の命令のアドレスとみなされます。これにより、B 命令または BL 命令は
事実上 NOP となります。
•
その他の場合、シンボルの値は 0 とみなされます。
リンク時に検出されないシンボルへのアクセスを回避するには、P. 7-60「EXTERN」の
例に示したようなコードを使用します。
7-62
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.7.13
INCBIN
INCBIN ディレクティブは、アセンブル中のファイル内にファイルをインクルードしま
す。インクルードされるファイルはアセンブルされずに、そのままの状態でインクルー
ドされます。
構文
INCBIN filename
説明:
filename
アセンブリでインクルードされるファイルの名前を指定します。アセン
ブラは UNIX 形式または MS-DOS 形式のパス名を認識します。
用法
実行ファイル、リテラル、あるいは任意のデータは INCBIN を使用してインクルード
することができます。ファイルの内容は解釈されずに、現在の ELF セクションに 1 バ
イトずつ追加されます。アセンブリは INCBIN ディレクティブの次の行から継続され
ます。
デフォルトでは、アセンブラはインクルードするファイルを現在の位置で検索します。
現在の位置は、呼び出しているファイルが保存されているディレクトリです。検索パ
スにディレクトリを追加するには、-i アセンブラコマンドラインオプションを使用し
ます。スペースが含まれるファイル名とディレクトリ名は、二重引用符(" ")で囲む
必要はありません。
例
AREA
INCBIN
INCBIN
7.7.14
Example, CODE, READONLY
file1.dat
;
;
;
c:\project\file2.txt
;
includes file1 if it
exists in the
current place.
includes file2
INCLUDE
P. 7-61「GET または INCLUDE」を参照して下さい。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-63
ディレクティブについて
7.7.15
KEEP
KEEP ディレクティブは、オブジェクトファイル内のシンボルテーブルにローカルシン
ボルを保存するようアセンブラに指示じます。
構文
KEEP {symbol}
説明:
symbol
保存するローカルシンボルの名前を指定します。symbol を指定しない
場合は、レジスタ相対シンボルを除く全てのローカルシンボルが保存さ
れます。
用法
デフォルトでは、アセンブラは出力オブジェクトファイル内に以下のシンボルだけを
記述します。
•
エクスポートされたシンボル
•
再配置されているシンボル
KEEPを使用して、デバッグに役立つローカルシンボルを保存しておくことができます。
保存されたシンボルは、ARM デバッガとリンカのマップファイルに表示されます。
KEEP ではレジスタ相対シンボルは保存できません(P. 7-15「MAP」参照)。
例
label
7-64
ADC
KEEP
ADD
r2,r3,r4
label
r2,r2,r5
; makes label available to debuggers
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.7.16
NOFP
NOFP ディレクティブは、アセンブリ言語ソースファイル内での浮動小数点命令の使用
を禁止します。
構文
NOFP
用法
NOFP を使用することにより、ソフトウェアまたはターゲットハードウェアでサポート
されていない状況で、浮動小数点命令が使用されていないことを確認することができ
ます。
NOFP ディレクティブ以降に浮動小数点命令が出現すると、Unknown opcode エラーが
生成され、アセンブリが失敗します。
浮動小数点命令以降に NOFP ディレクティブが出現すると、アセンブラは以下のエラー
を生成し、アセンブリが失敗します。
Too late to ban floating point instructions
7.7.17
REQUIRE
REQUIRE ディレクティブはセクション間の依存関係を指定します。
構文
REQUIRE label
説明:
label
使用するラベルの名前を指定します。
用法
REQUIRE を使用して、関連セクションが直接呼び出されていない場合でもインクルー
ドさせることができます。REQUIRE ディレクティブを含むセクションがリンクにイン
クルードされると、リンカは指定されたラベルの定義を含むセクションもインクルー
ドします。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-65
ディレクティブについて
7.7.18
REQUIRE8 と PRESERVE8
REQUIRE8 ディレクティブは、現在のファイルに 8 バイトアライメントのスタックが
必要であることを示します。
PRESERVE8ディレクティブは、現在のファイルがスタックを8バイトアライメントで保
持することを示します。
構文
REQUIRE8
PRESERVE8
用法
LDRD 命令と STRD 命令(ダブルワード転送)は、アクセス先のアドレスが 8 バイト境界
で整列している場合のみ正常に機能します。
コード内で LDRD または STRD を使用し、スタックとの間で転送を行う場合には、
REQUIRE8 を使用して、スタックを 8 バイトアライメントで保持するオブジェクトだけ
がそのコードを呼び出すことをリンカに確認するように指示します。
コードがスタックを 8 バイトアライメントで保持する場合には、PRESERVE8 を使用し
てリンカに通知します。
リンカは、8 バイトアライメントのスタックを要求するコードが、直接的または間接的
に、スタックを 8 バイトアライメントで保持するコードのみによって呼び出されるこ
とを確認します。
7-66
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
ディレクティブについて
7.7.19
RN
RN ディレクティブは指定されたレジスタの名前を定義します。
構文
name RN expr
説明:
name
レジスタに割り当てる名前を指定します。name には、P. 3-9「事前定義
されるレジスタ名とコプロセッサ名」で示した事前定義されている名前
と同じ名前を使用することはできません。
expr
0 ~ 15 のレジスタ番号を返す式を指定します。
用法
RN を使用して、各レジスタの使用目的を覚えておけるように、レジスタに適切な名前
を割り当てることができます。同一レジスタに複数の名前を付けて混乱を生じさせる
ような使用方法は避けて下さい。
例
ARM DUI0068BJ-00
regname
RN
11
; defines regname for register 11
sqr4
RN
r6
; defines sqr4 for register 6
Copyright © 2000, 2001 ARM Limited. All rights reserved.
7-67
ディレクティブについて
7.7.20
ROUT
ROUT ディレクティブは、ローカルラベルの有効範囲境界をマーキングします(P. 3-16
「ローカルラベル」参照)。
構文
{name} ROUT
説明:
name
有効範囲に割り当てる名前を指定します。
用法
ROUT ディレクティブを使用して、ローカルラベルの有効範囲を制限することができま
す。これにより、誤って違うラベルを参照してしまうようなことを防げます。ROUT
ディレクティブが含まれていないエリアのローカルラベルの有効範囲は、そのエリア
全体となります(P. 7-52「AREA」参照)。
name オプションを使用して、各参照が正しいローカルラベルを指していることを確認
します。ラベルの名前またはラベルへの参照が、その前の ROUT ディレクティブとマッ
チしない場合には、アセンブラがエラーメッセージを生成してアセンブルを停止しま
す。
例
routineA
3routineA
4routineA
otherstuff
7-68
; code
ROUT
; code
; code
; code
BEQ
; code
BGE
; code
; code
; code
ROUT
; ROUT is not necessarily a routine
; this label is checked
%4routineA
%3
; this reference is checked
; refers to 3 above, but not checked
; this label is checked
; start of next scope
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
用語集
ADS
ARM デベロッパスイート参照。
ANSI
米国規格協会(American National Standards Institute)。他の中でも特にコンピュータソフ
トウェアの規格を規定する団体です。
Angel™
ARM ベースのハードウェアで実行するアプリケーションの開発とデバッグを可能にす
るプログラム。Angel は、ARM 状態または Thumb 状態で動作するアプリケーションを
デバッグすることができます。
Architecture
(アーキテクチャ)
同様の特性を持つプロセッサグループの識別に使用される用語。
ARM Developer Suite(
(ARM デベロッパスイート)
支援文書およびサンプルを含み、ARM ファミリの RISC プロセッサ用アプリケーショ
ンを記述してデバッグするためのアプリケーションスイート。
ARM eXtended Debugger(
(ARM 拡張デバッガ)
ARM 拡張デバッガ(AXD)はデバッグエージェントを利用してデバッグターゲット上
で動作するソフトウェアの実行を検査・制御するための、ARM の最新デバッガソフト
ウェア。AXD には Windows 版と UNIX 版の 2 つのバージョンがあります。
armsd
ARM DUI0068BJ-00
ARM シンボリックデバッガ(armsd)は、C 言語などのハイレベルデバッギングサポー
ト、アセンブリ言語のローレベルサポートを提供するインタラクティブなソースレベ
ルデバッガです。armsd は、サポートされている全てのプラットフォーム上で動作する
コマンドラインデバッガです。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
Glossary-1
用語集
ATPCS
ARM/Thumb プロシージャコール標準。サブルーチンコールに関するレジスタとスタッ
クの使用方法を定義します。
AXD
ARM 拡張デバッガ参照。
Big-endian(ビッグ
(ビッグ
エンディアン)
ワードの最下位バイトが最上位バイトよりも上位アドレスに位置するメモリ構成。
Byte(バイト)
(バイト)
8 ビットで構成されるメモリ域の単位。
Canonical Frame Address(標準構造フレームアドレス)
(標準構造フレームアドレス)
DWARF 2 におけるスタックの基準アドレスであり、関数のフレームの基準アドレスを
指定します。
CFA
Coprocessor
(コプロセッサ)
CPSR
Current place
(現在位置)
標準構造フレームアドレス参照。
特定の操作に使用される補助プロセッサ。一般的には、浮動小数点数値計算、シグナ
ル処理、メモリ管理などに使用されます。
カレントプロセッサステータスレジスタ参照。
コンパイラ用語では、コンパイルプロセスにインクルードされるファイルを含むディ
レクトリ。
Current Processor Status Register(カレントプロセッサステータスレジスタ)
(カレントプロセッサステータスレジスタ)
CPSR。制御ビットとフラグの現在の状態を保持するレジスタです。
保存プロセッサステータスレジスタを参照。
Debugger
(デバッガ)
別のアプリケーションの実行を監視 • 制御するアプリケーション。通常はアプリケー
ションプログラムフロー内のエラーを検出する目的で使用します。
Double-word
(ダブルワード)
64 ビット単位の情報。ダブルワードの内容は、指定されていない限り符号なし整数と
みなされます。
DWARF
Debug With Arbitrary Record Format(任意レコード形式でのデバッグ)の略。
ELF
実行リンク形式。
Global variables
(グローバル変数)
Halfword
(ハーフワード)
Image(イメージ)
(イメージ)
アプリケーション内の全コードがアクセスできる変数。
ローカル変数参照。
16 ビット単位の情報。ハーフワードの内容は、指定されていない限り符号なし整数と
みなされます。
実行を目的にプロセッサにロードされた実行可能ファイル。
プロセッサにロードされ、実行スレッドを与えられたバイナリ実行ファイル。1 つのイ
メージが複数のスレッドをもつ場合もあります。イメージは、デフォルトのスレッド
が実行されるプロセッサに関連付けられます。
Glossary-2
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
用語集
Interrupt(割り込み)
(割り込み)
外部シグナルなどが原因で、アプリケーションの通常処理シーケンス内に生じる変化。
Interworking
(インタワーキング)
ARM コードと Thumb コードの両方を使用するアプリケーションの生成。
Library
(ライブラリ)
アセンブラまたはコンパイラの出力オブジェクトの集合をグループ化した 1 つのリポ
ジトリ。
Linker(リンカ)
(リンカ)
1 つ以上のソースアセンブラ / コンパイラ出力オブジェクトから 1 つのイメージを生成
するソフトウェア。
Little-endian(リトル
(リトル
エンディアン)
ワードの最下位バイトが最上位バイトよりも下位アドレスに位置するメモリ構成。
Local variable
(ローカル変数)
PIC
作成元のサブルーチンだけがアクセス可能な変数。
グローバル変数参照。
位置独立コード。
ROPI 参照。
PID
位置独立データまたは ARM プラットフォーム独立開発カード。
RWPI 参照。
PSR
プログラムステータスレジスタ参照。
Processor Status Register(プロセッサステータスレジスタ)
(プロセッサステータスレジスタ)
多様な制御ビットとフラグを保持するレジスタ。
カレントプロセッサステータスレジスタ参照。
保存プロセッサステータスレジスタ参照。
Read Only Position Independent(読み出し専用位置独立)
(読み出し専用位置独立)
コードおよび読み出し専用データのアドレスをランタイムに変更できること。
Read Write Position Independent(読み出し
(読み出し / 書き込み位置独立)
読み出し / 書き込みデータのアドレスをランタイムに変更できること。
ROPI
読み出し専用位置独立参照。
RWPI
読み出し / 書き込み位置独立参照。
Saved Processor Status Register(保存プロセッサステータスレジスタ(
(保存プロセッサステータスレジスタ(SPSR)
))
(保存プロセッサステータスレジスタ(
最近の例外の発生前にカレントプロセッサステータスレジスタが保持していた内容の
コピーを保持するレジスタ。各例外モードに専用の SPSR があります。
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
Glossary-3
用語集
Scope(有効範囲)
(有効範囲)
アプリケーションコード内の特定の位置における関数または変数のアクセシビリ
ティ。グローバル有効範囲を持つシンボルは常にアクセス可能です。ローカルまたは
プライベート有効範囲を持つシンボルには、同じサブルーチンまたはプロジェクト内
のコードだけがアクセスできます。
Section
(セクション)
イメージを構成するソフトウェアコードまたはデータのブロック。
Semihosting
(セミホスティング)
ターゲットがアプリケーションコード内で発生した I/O 要求を、そのターゲットで実行
しようとするのではなく、ホストシステムに通知するメカニズム。
Software Interrupt(ソフトウェア割り込み)
(ソフトウェア割り込み)
プロセッサにプログラマが指定したサブルーチンを呼び出させる命令。ARM によって
セミホスティングを処理するために使用されます。
SPSR
保存プロセッサステータスレジスタ参照。
Stack(スタック)
(スタック)
サブルーチンを呼び出すコードのアドレスを記録するために使用されるメモリの部
分。スタックは、パラメータおよび一時変数にも使用することができます。
SWI
ソフトウェア割り込み参照。
Target(ターゲット)
(ターゲット)
ターゲットアプリケーションを実行する実ターゲットプロセッサ(実際の、またはシ
ミュレートされたプロセッサ)。
デバッギングセッションにおける基本オブジェクト。デバッギングシステムの基礎。
ターゲットソフトウェアを実行する環境。実質的には、実際の、またはシミュレート
されたプロセッサの集合を意味します。
Vector Floating Point(ベクタ浮動小数点)
(ベクタ浮動小数点)
複数のデータ値を 1 つの命令で処理できる浮動小数点コプロセッサの標準。
Veneer(ベニア)
(ベニア)
プロセッサ状態の変更要件、あるいは現在のプロセッサ状態では到達不可能なアドレ
スへの分岐要件があるときに、サブルーチンコールに使用される小さなコードブロッ
ク。
VFP
ベクタ浮動小数点参照。
Word(ワード)
(ワード)
32 ビット単位の情報。ワードの内容は、指定されていない限り符号なし整数とみなさ
れます。
Zero Initialized
(ゼロ初期化)
ZI
Glossary-4
初期値を持たない変数の保持に使用される R/W メモリです。通常、このメモリはリセッ
ト時にゼロに設定されます。
ゼロ初期化参照。
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Index
The items in this index are listed in alphabetical order, with symbols and numerics appearing at the end. The references given
are to page numbers.
A
Absolute addresses 3-15
ADD instruction 2-58
Addresses
loading into registers 2-30
ADR
ARM pseudo-instruction 4-78, 4-79
Thumb pseudo-instruction 5-40
ADR pseudo-instruction 2-30, 2-58
ADR Thumb pseudo-instruction 2-30
ADRL pseudo-instruction 2-30, 2-58
ALIGN directive 2-56, 7-50
Alignment 2-56
ALU status flags 2-20
:AND: operator 2-56
AREA directive 2-13, 2-15, 7-52
AREA directive (literal pools) 2-28
armsd
command syntax 3-2
Assembly language
absolute addresses 3-15
alignment 2-56
ARM DUI0068BJ-00
base register 2-52
binary operators 3-28
block copy 2-44
Boolean constants 2-14
built-in variables 3-10
case rules 2-12
character constants 2-14
code size 2-61
comments 2-13
condition code suffixes 2-21
conditional execution 2-20
constants 2-14
coprocessor names 3-9
data structures 2-51
defining macros 7-27
ELF sections 2-15
entry point 2-16, 7-56
examples 2-2, 2-15, 2-17, 2-22,
2-28, 2-31, 2-35, 2-37, 2-44,
2-61, 2-63
examples, Thumb 2-18, 2-24, 2-38,
2-46
execution speed 2-61
floating-point literals 3-22
format of source lines 3-8
global variables 7-4, 7-7
immediate constants, ARM 2-26
jump tables 2-32
labels 2-13, 3-15
line format 2-12
line length 2-12
literal pools 2-28
loading addresses 2-30
loading constants 2-25
local labels 2-13, 3-16
logical
expressions 3-23
variables 3-13
logical literals 3-23
macros 2-48
maintenance 2-56
maps 2-51
multiple register transfers 2-39
multiplicative operators 3-28
nesting subroutines 2-43
numeric constants 2-14, 3-13
Copyright © 2000, 2001 ARM Limited. All rights reserved.
Index-1
Index
numeric expressions 3-20
numeric literals 3-21
numeric variables 3-13
operator precedence 3-24, 3-25
padding 2-56
pc 2-5, 2-40, 2-43, 2-46, 3-10, 3-15,
3-23
program counter 2-5, 3-10, 3-15,
3-23
program-relative 2-13
expressions 3-23
program-relative labels 3-15
program-relative maps 2-54
register names 3-9
register-based
maps 2-53
register-relative
expressions 3-23
labels 3-15
register-relative address 2-13
relational operators 3-30
relative maps 2-52
shift operators 3-29
speed 2-61
stacks 2-42
string
expressions 3-19
manipulation 3-28
variables 3-13
string constants 2-14
string literals 3-19
subroutines 2-17
symbol naming rules 3-12
symbols 2-58, 3-12
Thumb block copy 2-46
unary operators 3-26
variable substitution 3-14
variables 3-13
built-in 3-10
global 7-4, 7-7
local 7-6, 7-7
VFP directives and notation 6-40
ASSERT directive 2-55, 2-65, 7-44
B
B instruction, Thumb 2-20
Barrel shifter 2-8, 2-20
Index-2
Barrel shifter, Thumb 2-10
:BASE: operator 2-58, 3-26
Base register 2-52
Binary operators, assembly 3-28
BL instruction 2-17
BL instruction, Thumb 2-20
Block copy, assembly language 2-44
Block copy, Thumb 2-46
Boolean constants, assembly language
2-14
Branch instructions 2-6
Branch instructions, Thumb 2-10
BX instruction 2-18
C
Case rules, assembly language 2-12
Character constants, assembly language
2-14
:CHR: operator 3-26
CN directive 7-9
Code size 2-22, 2-61
CODE16 directive 2-18, 3-2, 7-54
CODE32 directive 2-18, 7-54
Command syntax
armsd 3-2
Comments
assembly language 2-13
Condition code suffixes 2-21
Conditional execution, assembly 2-20,
2-22
Conditional execution, Thumb 2-9,
2-10
Constants, assembly 2-14
Coprocessor names, assembly 3-9
CP directive 7-10
CPSR 2-5, 2-20
Current Program Status Register 2-5
D
DATA directive 7-25
Data maps, assembly 2-51
Data processing instructions 2-6
Data processing instructions, Thumb
2-10
Data structure, assembly 2-51
DCB directive 7-18
DCD directive 7-19
DCDU directive 7-20
DCFD directive 7-21
DCFS directive 7-22
DCI directive 7-23
DCQ directive 7-24
DCW directive 7-25
directive 7-30
Directives, assembly language
ALIGN 2-56, 7-50
AREA 2-13, 2-15, 7-52
AREA (literal pools) 2-28
ASSERT 2-55, 2-65, 7-44
CN 7-9
CODE16 2-18, 3-2, 7-54
CODE32 2-18, 7-54
CP 7-10
DATA 7-25
DCB 7-18
DCD 7-19
DCDU 7-20
DCFD 7-21
DCFS 7-22
DCI 7-23
DCQ 7-24
DCW 7-25
DN 7-11
ELSE 7-30
END 2-16, 7-55
END (literal pools) 2-28
ENDFUNC 7-43
ENDIF 7-30
ENTRY 2-16, 7-56
EQU 3-13, 7-57
EXPORT 7-58, 7-59
EXTERN 7-60
FIELD 7-16
FN 7-12
FRAME ADDRESS 7-34
FRAME POP 7-35
FRAME PUSH 7-36
FRAME REGISTER 7-37
FRAME RESTORE 7-38
FRAME SAVE 7-39
FRAME STATE REMEMBER
7-40
FRAME STATE RESTORE 7-41
FUNCTION 7-42
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Index
GBLA 3-6, 3-13, 7-4, 7-46
GBLL 3-6, 3-13, 7-4, 7-46
GBLS 3-6, 3-13, 7-4, 7-46
GET 3-5, 7-61
GLOBAL 7-58, 7-59
IF 7-29, 7-30, 7-32
IMPORT 7-62
INCBIN 7-63
INCLUDE 3-5, 7-61
INFO 7-45
KEEP 7-64
LCLA 3-13, 7-6, 7-46
LCLL 3-13, 7-46
LCLS 3-13, 7-46
LTORG 7-14
MACRO 2-48, 7-27
MAP 2-51, 7-15
MEND 7-27, 7-46
MEXIT 7-29
nesting 7-26
NOFP 7-65
OPT 3-10, 7-46
REQUIRE 7-65, 7-66
RLIST 3-3, 7-8
RN 7-67
ROUT 2-13, 3-16, 3-17, 7-68
SETA 3-6, 3-10, 3-13, 7-7, 7-46
SETL 3-6, 3-10, 3-13, 7-7, 7-46
SETS 3-6, 3-10, 3-13, 7-7, 7-46
SN 7-11
SPACE 7-17
SUBT 7-48
TTL 7-48
VFPASSERT SCALAR 6-41
VFPASSERT VECTOR 6-42
WEND 7-32
WHILE 7-29, 7-32
! 7-45
# 7-16
% 7-17
& 7-19
* 7-57
= 7-18
] 7-30
^ 7-15
| 7-30
DN directive 7-11
ARM DUI0068BJ-00
E
I
ELSE directive 7-30
END directive 2-16, 7-55
END directive (literal pools) 2-28
ENDFUNC directive 7-43
ENDIF directive 7-30
ENTRY directive 2-16, 7-56
Entry point
assembly 7-56
Entry point, assembly 2-16
EQU directive 3-13, 7-57
Execution speed 2-22, 2-61
EXPORT directive 7-58, 7-59
EXTERN directive 7-60
IF directive 7-29, 7-30, 7-32
Immediate constants, ARM 2-26
IMPORT directive 7-62
INCBIN directive 7-63
INCLUDE directive 3-5, 7-61
:INDEX: operator 2-58, 3-26
INFO directive 7-45
Instruction set
ARM 2-6
Thumb 2-9
Instructions, assembly language
ADD 2-58
BL 2-17
BX 2-18
LDM 2-39, 2-54, 3-3, 7-8
LDM, Thumb 2-46
MOV 2-25, 2-26, 2-52
MRS 2-8
MSR 2-8
MVN 2-25, 2-26
POP, Thumb 2-46
PUSH, Thumb 2-46
STM 2-39, 2-54, 3-3, 7-8
STM, Thumb 2-46
Invoke 3-2
F
FIELD directive 7-16
floating-point literals, assembly 3-22
FN directive 7-12
FRAME ADDRESS directive 7-34
FRAME POP directive 7-35
FRAME PUSH directive 7-36
FRAME REGISTER directive 7-37
FRAME RESTORE directive 7-38
FRAME SAVE directive 7-39
FRAME STATE REMEMBER
directive 7-40
FRAME STATE RESTORE directive
7-41
FUNCTION directive 7-42
G
GBLA directive 3-6, 3-13, 7-4, 7-46
GBLL directive 3-6, 3-13, 7-4, 7-46
GBLS directive 3-6, 3-13, 7-4, 7-46
GET directive 3-5, 7-61
GLOBAL directive 7-58, 7-59
H
Halfwords
in load and store instructions 2-7
J
Jump tables, assembly language 2-32
K
KEEP directive 7-64
L
Labels, assembly 3-15
Labels, assembly language 2-13
Labels, local, assembly 3-16
LCLA directive 3-13, 7-6, 7-46
LCLL directive 3-13, 7-46
LCLS directive 3-13, 7-46
LDFD pseudo-instruction 6-38, 7-14
LDFS pseudo-instruction 7-14
Copyright © 2000, 2001 ARM Limited. All rights reserved.
Index-3
Index
LDM instruction 2-39, 2-54, 3-3, 7-8
Thumb 2-46
LDR
pseudo-instruction 2-25, 2-27, 2-35,
4-82
Thumb pseudo-instruction 5-41
LDR pseudo-instruction 7-14
:LEFT: operator 3-28
:LEN: operator 3-26
Line format, assembly language 2-12
Line length, assembly language 2-12
Link register 2-5, 2-17
Linking
assembly language labels 2-13
Literal pools, assembly language 2-28
Loading constants, assembly language
2-25
Local
labels, assembly 3-16
variables, assembly 7-6, 7-7
Local labels, assembly language 2-13
Logical
expressions, assembly 3-23
variable, assembly 3-13
Logical literals, assembly 3-23
LTORG directive 7-14
Nesting directives 7-26
Nesting subroutines, assembly language
2-43
NOFP directive 7-65
NOP pseudo-instruction 4-78, 4-84
NOP Thumb pseudo-instruction 5-43
Numeric constants, assembly 3-13
Numeric constants, assembly language
2-14
Numeric expressions, assembly 3-20
numeric literals, assembly 3-21
Numeric variable, assembly 3-13
O
Operator precedence, assembly 3-24,
3-25
Operators, assembly language
:BASE: 2-58
:INDEX: 2-58
:AND: 2-56
OPT directive 3-10, 7-46
P
M
MACRO directive 2-48, 7-27
MAP directive 2-51, 7-15
Maps, assembly language
program-relative 2-54
register-based 2-53
relative 2-52
MEND directive 7-27, 7-46
MEXIT directive 7-29
MOV instruction 2-25, 2-26, 2-52
MRS instruction 2-8
MSR instruction 2-8
Multiple register transfers 2-39
Multiplicative operators, assembly
3-28
MVN instruction 2-25, 2-26
Index-4
N
Padding 2-56
Parameters, assembly macros 2-48
pc, assembly 3-10, 3-15, 3-23
pc, assembly language 2-5, 2-40, 2-43,
2-46
POP instruction, Thumb 2-46
Processor modes 2-4
Program counter, assembly 3-10, 3-15,
3-23
program counter, assembly language
2-5
Program counter, Thumb 2-11
Program-relative
expressions 3-23
labels 3-15
Program-relative address 2-13
Program-relative maps 2-54
Prototype statement 2-48
Pseudo-instructions, assembly language
ADR 2-30, 2-58, 4-78, 4-79
ADR (Thumb) 2-30, 5-40
ADRL 2-30, 2-58
LDFD 6-38, 7-14
LDFS 7-14
LDR 2-25, 2-27, 2-35, 4-82, 7-14
LDR (literal pools) 2-28
LDR (Thumb) 5-41
NOP 4-78, 4-84
NOP (Thumb) 5-43
PUSH instruction, Thumb 2-46
R
Register
names, assembly 3-9
Register access, Thumb 2-9
Register banks 2-4
Register-based
symbols 2-58
Register-based maps 2-53
Register-relative
expressions 3-23
Register-relative address 2-13
Register-relative labels 3-15
Registers 2-4
Relational operators, assembly 3-30
Relative maps 2-52
REQUIRE directive 7-65, 7-66
:RIGHT: operator 3-28
RLIST directive 3-3, 7-8
RN directive 7-67
ROUT directive 2-13, 3-16, 3-17, 7-68
S
Scope, assembly language 2-13
SETA directive 3-6, 3-10, 3-13, 7-7,
7-46
SETL directive 3-6, 3-10, 3-13, 7-7,
7-46
SETS directive 3-6, 3-10, 3-13, 7-7,
7-46
Shift operators, assembly 3-29
SN directive 7-11
SPACE directive 7-17
Stack pointer 2-4
Stacks, assembly language 2-42
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00
Index
Status flags 2-20
STM instruction 2-39, 2-54, 3-3, 7-8
Thumb 2-46
:STR: operator 3-26
String
expressions, assembly 3-19
manipulation, assembly 3-28
variable, assembly 3-13
String constants, assembly language
2-14
String literals, assembly 3-19
Subroutines, assembly language 2-17
SUBT directive 7-48
Symbols
assembly language 3-12
assembly language, Naming rules
3-12
Symbols, register-based 2-58
W
WEAK symbol 7-60, 7-62
WEND directive 7-32
WHILE directive 7-29, 7-32
Symbols
! directive 7-45
# directive 7-16
% directive 7-17
& directive 7-19
* directive 7-57
= directive 7-18
^ directive 7-15
| directive 7-30
T
Thumb
BX instruction 2-18
conditional execution 2-20
direct loading 2-27
example assembly language 2-18
instruction set 2-9
LDM and STM instructions 2-46
popping pc 2-43
TTL directive 7-48
U
Unary operators, assembly 3-26
V
Variables, assembly 3-13
built-in 3-10
global 7-4, 7-7
local 7-6, 7-7
substitution 3-14
VFP directives and notation 6-40
VFPASSERT SCALAR directive 6-41
VFPASSERT VECTOR directive 6-42
ARM DUI0068BJ-00
Copyright © 2000, 2001 ARM Limited. All rights reserved.
Index-5
Index
Index-6
Copyright © 2000, 2001 ARM Limited. All rights reserved.
ARM DUI0068BJ-00