arm コンパイラツールチェーン アセンブラリファレ...

397
Copyright © 2010 ARM. All rights reserved. ARM DUI 0489BJID 011811) ARM ® コンパイラツールチェーン バージョン 4.1 アセンブラリファレンス

Upload: lecong

Post on 12-May-2018

277 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM® コンパイラツールチェーンバージョン 4.1

アセンブラリファレンス

Copyright © 2010 ARM. All rights reserved.ARM DUI 0489BJ(ID 011811)

Page 2: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM コンパイラツールチェーンアセンブラリファレンス

Copyright © 2010 ARM. All rights reserved.

リリース情報

本書には以下の変更が加えられています。

著作権

® または ™ のマークが付いた言葉およびロゴは、この著作権情報で別段に規定されている場合を除き、

ARM® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

各社の所有する商標です。

本書に記載されている情報の全部または一部、ならびに本書で紹介する製品は、著作権所有者の文書によ

る事前の許可を得ない限り、転用・複製することを禁じます。

本書に記載されている製品は、今後も継続的に開発・改良の対象となります。本書に含まれる製品および

その利用方法についての情報は、ARM が利用者の利益のために提供するものです。したがって当社では、

製品の市販性または利用の適切性を含め、暗示的・明示的に関係なく一切の責任を負いません。

本書は、本製品の利用者をサポートすることだけを目的としています。本書に記載されている情報の使

用、情報の誤りまたは省略、あるいは本製品の誤使用によって発生したいかなる損失・損傷についても、

ARM は一切責任を負いません。

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

機密保持ステータス

本書は非機密扱いであり、本書を使用、複製、および開示する権利は、ARM および ARM が本書を提供し

た当事者との間で締結した契約の条項に基づいたライセンスの制限により異なります。

製品ステータス

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

Web アドレス

http://www.arm.com

変更履歴

日付 発行 機密保持ステータス 変更点

2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン v4.1 リリー

2010 年 9 月 30 日 B 非機密扱い ARM コンパイラツールチェーン v4.1 のアッ

プデート 1

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. iiID 011811 Non-Confidential

Page 3: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

目次ARM コンパイラツールチェーン アセンブラリファレ

ンス

第 1 章 表記規則とフィードバック

第 2 章 アセンブラコマンドラインオプション2.1 アセンブラのコマンドライン構文 ........................................................................... 2-22.2 アセンブラコマンドラインオプション ................................................................... 2-3

第 3 章 ARM 命令と Thumb 命令3.1 命令の概要 ............................................................................................................... 3-23.2 命令の幅指定子 ..................................................................................................... 3-123.3 メモリアクセス命令 .............................................................................................. 3-133.4 汎用データ処理命令 .............................................................................................. 3-503.5 乗算命令 ................................................................................................................ 3-823.6 サチュレート命令 ................................................................................................ 3-1033.7 並列命令 .............................................................................................................. 3-1083.8 パック命令と展開命令 ......................................................................................... 3-1163.9 分岐命令と制御命令 ............................................................................................ 3-1233.10 コプロセッサ命令 ................................................................................................ 3-1323.11 その他の命令 ....................................................................................................... 3-1423.12 ThumbEE 命令 ..................................................................................................... 3-1593.13 疑似命令 .............................................................................................................. 3-1633.14 条件コード ........................................................................................................... 3-173

第 4 章 NEON と VFP プログラミング4.1 命令の概要 ............................................................................................................... 4-24.2 NEON と VFP に共通の命令 ................................................................................... 4-74.3 NEON 論理演算と比較演算 ................................................................................... 4-15

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. iiiID 011811 Non-Confidential

Page 4: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

目次

4.4 NEON 汎用データ処理命令 ................................................................................... 4-234.5 NEON シフト命令 ................................................................................................. 4-364.6 NEON 汎用算術命令 .............................................................................................. 4-444.7 NEON 乗算命令 ..................................................................................................... 4-584.8 NEON 要素と構造体のロード / ストア命令 .......................................................... 4-644.9 NEON 疑似命令および VFP 疑似命令 ................................................................... 4-724.10 VFP 命令 ................................................................................................................ 4-79

第 5 章 ワイヤレス MMX テクノロジの命令5.1 はじめに .................................................................................................................. 5-25.2 ワイヤレス MMX テクノロジに対する ARM のサポート ........................................ 5-35.3 ワイヤレス MMX の命令 ......................................................................................... 5-65.4 ワイヤレス MMX の疑似命令 .................................................................................. 5-8

第 6 章 ディレクティブリファレンス6.1 ディレクティブの一覧(アルファベット順) .......................................................... 6-26.2 シンボル定義ディレクティブ .................................................................................. 6-46.3 データ定義ディレクティブ ................................................................................... 6-186.4 アセンブリ制御ディレクティブ ............................................................................ 6-336.5 Frame ディレクティブ .......................................................................................... 6-426.6 通知ディレクティブ .............................................................................................. 6-576.7 命令セットと構文選択のディレクティブ .............................................................. 6-636.8 その他のディレクティブ ....................................................................................... 6-66

付録 A 『アセンブラリファレンス』に対する改訂

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. ivID 011811 Non-Confidential

Page 5: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

第 1 章 表記規則とフィードバック

以下では、表記規則とフィードバックの方法について説明します。

表記規則

以下の表記規則を使用しています。

monospace コマンド、ファイル名、プログラム名、ソースコードなど、キー

ボードから入力可能なテキストを示しています。

monospace コマンドまたはオプションに使用可能な略語を示します。コマン

ド名またはオプション名をすべて入力する代わりに、下線部分の文字だけを入力することができます。

monospace italic コマンドまたは関数の引数で、特定の値に置き換えることが可能なものを示しています。

monospace bold サンプルコード以外に使用される言語キーワードを示しています。

italic 重要事項、重要用語、相互参照、引用箇所を斜体で記載していま

す。

bold メニュー名などのユーザインタフェース要素を太字で記載してい

ます。また、適宜記述リスト内の重要箇所と ARM® プロセッサの

信号名にも太字を用いています。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 1-1ID 011811 Non-Confidential

Page 6: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

表記規則とフィードバック

本製品に関するフィードバック

本製品についてのご意見やご提案がございましたら、以下の情報を添えて購入元までお寄せ下さい。

• お名前と会社名

• 製品のシリアル番号

• 製品のリリース情報

• ご使用のプラットフォームの詳細(ハードウェアプラットフォーム、オペレーティングシステムの種類とバージョンなど)

• 問題を再現するサイズの小さな独立したサンプルコード

• 操作の目的と実際の動作に関する詳しい説明

• 使用したコマンド(コマンドラインオプションを含む)

• 問題を例示するサンプル出力

• ツールのバージョン情報(バージョン番号、ビルド番号を含む)

内容に関するフィードバック

内容に関するご意見につきましては、電子メールを [email protected] まで

送信して下さい。その際には、以下の内容を記載して下さい。

• タイトル

• 文書番号(ARM DUI 0489BJ)

• オンラインでご覧の場合は、該当するトピック名

• PDF 版の文書をご覧の場合は、問題のあるページ番号

• 問題点の簡潔な説明

また、補足すべき点や改善すべき点についての全般的なご提案もお待ちしております。

ARM では、技術情報記事や FAQ の拡充と共に、ドキュメントに対する更新と訂正を ARM Information Center にて定期的に行っております。

その他の情報

• ARM Information Center, http://infocenter.arm.com/help/index.jsp

• ARM Technical Support Knowledge Articles, http://infocenter.arm.com/help/topic/com.arm.doc.faqs/index.html

• Keil Distributors, http://www.keil.com/distis

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 1-2ID 011811 Non-Confidential

Page 7: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

第 2 章 アセンブラコマンドラインオプション

以下の各トピックでは、アセンブラ armasm で認識される ARM® コンパイラツールチェー

ンのアセンブラコマンドライン構文とコマンドラインオプションについて説明します。

• 「アセンブラのコマンドライン構文」 (ページ 2-2)• 「アセンブラコマンドラインオプション」 (ページ 2-3)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-1ID 011811 Non-Confidential

Page 8: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

2.1 アセンブラのコマンドライン構文

ARM アセンブラを起動するコマンドは以下のとおりです。

armasm {options} {inputfile}

各パラメータには以下の意味があります。

options アセンブラへのコマンドです。アセンブラを起動する際に、オプション

を任意に組み合わせて指定できます。各オプションはスペースで区切ります。一部のオプションでは値を指定できます。オプションの値を指定するには、"="(option=value)またはスペース文字(option value)を使

用します。

inputfile アセンブリソースファイルを指定します。複数のファイルを指定する場

合は、スペースで区切ります。入力ファイルとして、UAL または UAL 以前の ARM アセンブリ言語ソースファイルまたは Thumb® アセンブリ

言語ソースファイルを指定する必要があります。

関連項目

『コンパイラの使用』:

• 「コンパイラコマンドラインオプションの順序」 (ページ 3-11)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-2ID 011811 Non-Confidential

Page 9: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

2.2 アセンブラコマンドラインオプション

アセンブラでサポートされているコマンドラインオプションは次のとおりです。

• 「--16」 (ページ 2-5)• 「--32」 (ページ 2-5)• 「--apcs=qualifier…qualifier」 (ページ 2-5)• 「--arm」 (ページ 2-6)• 「--arm_only」 (ページ 2-7)• 「--bi」 (ページ 2-7)• 「--bigend」 (ページ 2-7)• 「--brief_diagnostics」 (ページ 2-7)• 「--checkreglist」 (ページ 2-7)• 「--compatible=name」 (ページ 2-8)• 「--cpreproc」 (ページ 2-8)• 「--cpreproc_opts=options」 (ページ 2-8)• 「--cpu=list」 (ページ 2-9)• 「--cpu=name」 (ページ 2-9)• 「--debug」 (ページ 2-9)• 「--depend=dependfile」 (ページ 2-10)• 「--depend_format=string」 (ページ 2-10)• 「--device=list」 (ページ 2-10)• 「--device=name」 (ページ 2-10)• 「--diag_error=tag{, tag}」 (ページ 2-11)• 「--diag_remark=tag{, tag}」 (ページ 2-11)• 「--diag_style=style」 (ページ 2-12)• 「--diag_suppress=tag{, tag}」 (ページ 2-12)• 「--diag_warning=tag{, tag}」 (ページ 2-13)• 「--dllexport_all」 (ページ 2-13)• 「--dwarf2」 (ページ 2-13)• 「--dwarf3」 (ページ 2-13)• 「--errors=errorfile」 (ページ 2-13)• 「--execstack」 (ページ 2-13)• 「--exceptions」 (ページ 2-14)• 「--exceptions_unwind」 (ページ 2-14)• 「--fpmode=model」 (ページ 2-14)• 「--fpu=list」 (ページ 2-15)• 「--fpu=name」 (ページ 2-16)• 「-g」 (ページ 2-17)• 「--help」 (ページ 2-17)• 「-idir{,dir, …}」 (ページ 2-17)• 「--keep」 (ページ 2-17)• 「--length=n」 (ページ 2-18)• 「--li」 (ページ 2-18)• 「--library_type=lib」 (ページ 2-18)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-3ID 011811 Non-Confidential

Page 10: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

• 「--licretry」 (ページ 2-18)• 「--list=file」 (ページ 2-18)• 「--list=」 (ページ 2-19)• 「--littleend」 (ページ 2-19)• 「-m」 (ページ 2-19)• 「--maxcache=n」 (ページ 2-19)• 「--md」 (ページ 2-20)• 「--no_code_gen」 (ページ 2-20)• 「--no_esc」 (ページ 2-20)• 「--no_execstack」 (ページ 2-20)• 「--no_exceptions」 (ページ 2-20)• 「--no_exceptions_unwind」 (ページ 2-21)• 「--no_hide_all」 (ページ 2-21)• 「--no_project」 (ページ 2-21)• 「--no_reduce_paths」 (ページ 2-21)• 「--no_regs」 (ページ 2-21)• 「--no_terse」 (ページ 2-22)• 「--no_unaligned_access」 (ページ 2-22)• 「--no_warn」 (ページ 2-22)• 「-o filename」 (ページ 2-22)• 「--pd」 (ページ 2-22)• 「--predefine "directive"」 (ページ 2-23)• 「--project=filename」 (ページ 2-23)• 「--reduce_paths」 (ページ 2-23)• 「--regnames=none」 (ページ 2-24)• 「--regnames=callstd」 (ページ 2-24)• 「--regnames=all」 (ページ 2-24)• 「--reinitialize_workdir」 (ページ 2-25)• 「--report-if-not-wysiwyg」 (ページ 2-25)• 「--show_cmdline」 (ページ 2-25)• 「--split_ldm」 (ページ 2-25)• 「--thumb」 (ページ 2-26)• 「--thumbx」 (ページ 2-26)• 「--unaligned_access」 (ページ 2-26)• 「--unsafe」 (ページ 2-26)• 「--untyped_local_labels」 (ページ 2-27)• 「--version_number」 (ページ 2-27)• 「--via=file」 (ページ 2-27)• 「--vsn」 (ページ 2-27)• 「--width=n」 (ページ 2-27)• 「--workdir=directory」 (ページ 2-28)• 「--xref」 (ページ 2-28)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-4ID 011811 Non-Confidential

Page 11: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

2.2.1 --16

UAL 以前の Thumb 構文を使用して、命令を Thumb® 命令として解釈するようにアセ

ンブラに指示します。このオプションは、ソースファイルの冒頭の CODE16 ディレク

ティブに相当します。UAL 構文を使用して Thumb 命令を指定するには、- - thumb オプ

ションを使用します。

関連項目

• 「--thumb」 (ページ 2-26)• 「ARM、THUMB、THUMBX、CODE16、CODE32」 (ページ 6-64)

2.2.2 --32

このオプションは --arm と同義です。

関連項目

• 「--arm」 (ページ 2-6)

2.2.3 --apcs=qualifier…qualifier

ARM アーキテクチャのプロシージャコール標準(AAPCS)を使用するかどうかを指

定します。コードセクションの属性を一部指定することもできます。

AAPCS は Base Standard Application Binary Interface for the ARM Architecture(BSABI)仕様の一部です。AAPCS に準拠したコードを記述すると、別々にコンパイルおよび

アセンブルしたモジュールを連動させることができます。

注 アセンブラにより生成されたコードは、AAPCS 修飾子の影響を受けません。AAPCS 修飾子は、inputfile 内のコードが AAPCS の特定のバリアントに準拠していることを

プログラマが確認するためのアサートです。AAPCS 修飾子により、アセンブラに

よって生成されたオブジェクトファイル内で属性が設定されます。リンカはこれらの属性を使用してファイルの互換性をチェックし、適切なライブラリバリアントを選択します。

qualifier の値は以下のとおりです。

なし inputfile で AAPCS が使用されないように指定します。AAPCS レジスタは設定されません。none を使用する場合、他の修飾子は使

用できません。

/interwork、 /nointerwork

/interwork は、inputfile のコードが ARM と Thumb で安全にイン

ターワークできるように指定します。デフォルトは /nointerwork です。

/inter、 /nointer

/interwork および /nointerwork と同義です。

/ropi、 /noropi /ropi は、inputfile のコードを読み出し専用の位置非依存(ROPI)とするように指定します。デフォルトは /noropi です。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-5ID 011811 Non-Confidential

Page 12: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

/pic、 /nopic /ropi および /noropi と同義です。

/rwpi、 /norwpi /rwpi は、inputfile のコードを読み書き可能な位置非依存(RWPI)とするように指定します。デフォルトは /norwpi です。

/pid、 /nopid /rwpi および /norwpi と同義です。

/fpic、 /nofpic /fpic は、inputfile のコードを読み出し専用の位置非依存とし、ア

ドレス参照が Linux の共有オブジェクトでの使用に適したものと

なるように指定します。デフォルトは /nofpic です。

/hardfp、 /softfp ハードウェアまたはソフトウェアの浮動小数点リンケージを要求

します。これによって、--fpu オプションを介して利用できる浮

動小数点ハードウェアのバージョンとは別に、プロシージャコール標準を指定することができます。プロシージャコール標準は --fpu オプションを使用して指定することもできますが、--apcs の使用を推奨します。浮動小数点サポートが無効である場合

(--fpu=none が指定されている、または他の方法で禁止されている

など)、/hardfp および /softfp は無視されます。浮動小数点サポー

トが許可されている場合で、なおかつ softfp の呼び出し規則が使

用された場合(--fpu=softvfp または --fpu=softvfp+vfp...)、/hardfp を指定するとエラーが発生します。

注 少なくとも 1 つの qualifier を指定する必要があります。qualifier を複数指定する場合、

リスト内の個々の修飾子間にスペースもコンマも挿入されていないことを確認して下さい。

armasm --apcs=/inter/ropi inputfile.s

関連項目

ARM アーキテクチャ向けプロシージャコール標準 , http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042-/index.html。

『コンパイラリファレンス』:

• 「--apcs=qualifer...qualifier」 (ページ 3-9)

『ARM プロセッサをターゲットとしたソフトウェア開発』:

• 第 5 章 ARM と Thumb のインターワーク

2.2.4 --arm

ARM 命令として命令を解釈するようにアセンブラに指示します。ただし、オブジェ

クトファイル中のコードが、必ずしも ARM コードだけとなるわけではありません。

これがデフォルトです。このオプションを使用した場合、ソースファイルの先頭で ARM または CODE32 ディレクティブを指定するのと同じ効果があります。

関連項目

• 「--32」 (ページ 2-5)• 「--arm_only」 (ページ 2-7)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-6ID 011811 Non-Confidential

Page 13: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

• 「ARM、THUMB、THUMBX、CODE16、CODE32」 (ページ 6-64)

2.2.5 --arm_only

ARM コードだけを生成するようにアセンブラに指示します。このオプションは --arm と似ていますが、アセンブラで Thumb コードの生成を禁止する特性も持っています。

関連項目

• 「--arm」 (ページ 2-6)

2.2.6 --bi

このオプションは --bigend と同義です。

関連項目

• 「--bigend」• 「--littleend」 (ページ 2-19)

2.2.7 --bigend

ビッグエンディアン ARM プロセッサに適したコードをアセンブルするようにアセン

ブラに指示します。デフォルトは --littleend です。

関連項目

• 「--littleend」 (ページ 2-19)

2.2.8 --brief_diagnostics

簡単な形式の診断出力を使用するようにアセンブラに指示します。この形式では、元のソース行は表示されず、1 行に収まらないエラーメッセージは折り返されませ

ん。デフォルトは --no_brief_diagnostics です。

関連項目

• 「--diag_error=tag{, tag}」 (ページ 2-11)• 「--diag_warning=tag{, tag}」 (ページ 2-13)

2.2.9 --checkreglist

RLIST、LDM、および STM レジスタリストをチェックして、すべてのレジスタが昇順の

レジスタ番号順に指定されていることを確認するようにアセンブラに指示します。レジスタが昇順で指定されていない場合は警告が表示されます。

このオプションの使用は廃止される予定です。代わりに --diag_warning 1206 を使用し

て下さい。

関連項目

• 「--diag_warning=tag{, tag}」 (ページ 2-13)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-7ID 011811 Non-Confidential

Page 14: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

2.2.10 --compatible=name

アセンブラで互換コードを生成する 2 番目のプロセッサまたはアーキテクチャ

(name)を指定します。

--compatible を使用してプロセッサ名またはアーキテクチャ名を指定する場合、--cpu オプションと --compatible オプションの name に指定できる有効な値は、いずれも

表 2-1 に示したものに限られます。また、それぞれ別のグループに属している値を指

定する必要があります。

コマンドラインでオプションの前のインスタンスをすべて無効にするには、- - compatible=NONE を指定します。

armasm --cpu=arm7tdmi --compatible=cortex-m3 inputfile.s

関連項目

• 「--cpu=name」 (ページ 2-9)

2.2.11 --cpreproc

入力ファイルを前処理してからアセンブルするために armcc を呼び出すようアセンブ

ラに指示します。

関連項目

• 「--cpreproc_opts=options」

『アセンブラの使用』:

• 「C プリプロセッサを使用する」 (ページ 7-22)

2.2.12 --cpreproc_opts=options

C プリプロセッサ使用時にアセンブラがコンパイラオプションを armcc に渡せるよう

にします。

options はオプションとその値のコンマ区切りリストです。

armasm --cpreproc --cpreproc_opts=’ -DDEBUG=1’ inputfile.s

関連項目

• 「--cpreproc」

表 2-1 互換性のあるプロセッサまたはアーキテクチャの組み合わせ

グループ 1

ARM7TDMI、4T

グループ 2

Cortex™-M0、Cortex-M1、

Cortex-M3、Cortex-M4、7-M、6-M、

6S-M

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-8ID 011811 Non-Confidential

Page 15: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

『アセンブラの使用』:

• 「C プリプロセッサを使用する」 (ページ 7-22)

2.2.13 --cpu=list

このオプションを使用すると、- - cpu name オプションと組み合わせて使用できる、サ

ポートされている CPU 名とアーキテクチャ名が一覧表示されます。

armasm --cpu=list

関連項目

• 「--cpu=name」

2.2.14 --cpu=name

ターゲットの CPU を設定します。命令によっては、間違ったターゲット CPU にアセ

ンブルされると、エラーまたは警告が表示される場合があります。

name に指定できる有効値は、4T、5TE、6T2 などのアーキテクチャの名前か、ARM7TDMI® などの部品番号です。デフォルトは ARM7TDMI です。

注 ARMv7 は有効な ARM アーキテクチャではありません。--cpu=7 を使用すると、

ARMv7-A、ARMv7-R、および ARMv7-M の各アーキテクチャで共通の Thumb 命令だ

けが生成されます。

--compatible を使用して別のプロセッサ名またはアーキテクチャ名を指定する場合、

--cpu オプションと --compatible オプションの name に指定できる有効な値は、いずれ

も表 2-1 (ページ 2-8)に示したものに限られます。

armasm --cpu=Cortex-M3 inputfile.s

関連項目

• 「--cpu=list」• 「--unsafe」 (ページ 2-26)• 「--compatible=name」 (ページ 2-8)• 『ARM アーキテクチャリファレンスマニュアル』,

http://infocenter.arm.com/help/topic/com.arm.doc.subset.arch.reference/index.html

2.2.15 --debug

DWARF デバッグテーブルを生成するようにアセンブラに指示します。- - debug は -g と同じ意味です。デフォルトは DWARF 3 です。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-9ID 011811 Non-Confidential

Page 16: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

注 ローカルシンボルは --debug では保持されません。デバッグのためにローカルシンボ

ルを保持する場合は、- - keep を指定する必要があります。

関連項目

• 「--dwarf2」 (ページ 2-13)• 「--dwarf3」 (ページ 2-13)• 「--keep」 (ページ 2-17)

2.2.16 --depend=dependfile

ソースファイル依存関係リストを dependfile に保存するようアセンブラに指示しま

す。これらのオプションは、make ユーティリティとの使用に適しています。

関連項目

• 「--depend_format=string」

2.2.17 --depend_format=string

このオプションを指定すると、UNIX の一部の make プログラムとの互換性を確保す

るために、出力依存ファイルの形式が UNIX 形式に変更されます。

string の値には、以下のいずれかを指定できます。

unix UNIX 形式のパス区切り文字を使用して依存関係ファイルを生成しま

す。

unix_escaped

動作は unix と同じですが、スペースをバックスラッシュでエスケープし

ます。

unix_quoted

動作は unix と同じですが、パス名を二重引用符で囲みます。

関連項目

• 「--depend=dependfile」

2.2.18 --device=list

このオプションは、- - device=name オプションと一緒に使用可能なサポートされている

デバイス名を一覧表示します。

関連項目

• 「--device=name」

2.2.19 --device=name

指定されたデバイスをターゲットとして選択し、関連するプロセッサ設定を設定します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-10ID 011811 Non-Confidential

Page 17: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

関連項目

• 「--device=list」 (ページ 2-10)• 「--cpu=name」 (ページ 2-9)• 『コンパイラリファレンス』の「--device=name」 (ページ 3-49)

2.2.20 --diag_error=tag{, tag}

アセンブラによって出力される診断メッセージは、{prefix}number という形式のタグ

で識別できます。prefix は A です。--diag_error オプションは、指定されたタグを持

つ診断メッセージにエラーの重大度を設定します。

これらのオプションでは複数のタグを指定できます。その場合は、各タグをコンマで区切ります。タグ番号の前には、オプションのアセンブラ接頭文字 A を指定できま

す。A 以外の接頭文字が含まれている場合、メッセージ番号は無視されます。

表 2-2 に、オプションの説明で使用される重要度という用語のそれぞれの意味を示し

ます。

すべての警告をエラーとして扱う場合は、tag を warning に設定します。

関連項目

• 「--brief_diagnostics」 (ページ 2-7)• 「--diag_warning=tag{, tag}」 (ページ 2-13)• 「--diag_suppress=tag{, tag}」 (ページ 2-12)

2.2.21 --diag_remark=tag{, tag}

アセンブラによって出力される診断メッセージは、{prefix}number という形式のタグ

で識別できます。prefix は A です。--diag_remark オプションは、指定されたタグを持

つ診断メッセージに注釈の重大度を設定します。

これらのオプションでは複数のタグを指定できます。その場合は、各タグをコンマで区切ります。タグ番号の前には、オプションのアセンブラ接頭文字 A を指定できま

す。A 以外の接頭文字が含まれている場合、メッセージ番号は無視されます。

関連項目

• 「--brief_diagnostics」 (ページ 2-7)

表 2-2 診断メッセージの重大度

重大度 説明

エラー アセンブリ言語の構文ルールまたはセマンティックルールの違反を示します。アセンブリは引き続き実行されますが、オブジェクトコードは生成されません。

警告 コードに問題を引き起こす可能性のある例外的な状況を示す警告です。重大度のエラーが検出されない限り、アセンブラは引き続き実行され、オブジェクトコードが生成されます。

注釈 一般的であるが、推奨されないアセンブリ言語の慣用を示します。これらの診断情報はデフォルトでは表示されません。重大度のエラーが検出されない限り、アセンブラは引き続き実行され、オブジェクトコードが生成されます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-11ID 011811 Non-Confidential

Page 18: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

• 「--diag_error=tag{, tag}」 (ページ 2-11)

2.2.22 --diag_style=style

指定された style で診断メッセージを表示するようにアセンブラに指示します。style は次のいずれかです。

arm ARM アセンブラの形式を使用してメッセージを表示します。- - diag_style が指定されていない場合は、これがデフォルトになります。

ide エラーのある行の行番号と文字数を表示します。これらの値は括弧に囲

まれて表示されます。

gnu GNU 形式でメッセージを表示します。

オプション --diag_style=ide を選択すると、オプション --brief_diagnostics が暗黙的

に選択されます。コマンドラインで --no_brief_diagnostics を明確に選択すると、

--diag_style=ide によって暗示される --brief_diagnostics の選択は無効になります。

オプション --diag_style=arm またはオプション --diag_style=gnu のいずれかを選択して

も、--brief_diagnostics を選択したことにはなりません。

関連項目

• 「--brief_diagnostics」 (ページ 2-7)• 「--diag_style=style」

2.2.23 --diag_suppress=tag{, tag}

アセンブラによって出力される診断メッセージは、{prefix}number という形式のタグ

で識別できます。prefix は A です。--diag_suppress オプションは、指定されたタグを

持つ診断メッセージを無効にします。

これらのオプションでは複数のタグを指定できます。その場合は、各タグをコンマで区切ります。

例えば、番号 1293 と 187 の警告メッセージを非表示にするには、以下のコマンドを使

用します。

armasm --diag_suppress=1293,187

タグ番号の前には、オプションのアセンブラ接頭文字 A を指定できます。以下に例を

示します。

armasm --diag_suppress=A1293,A187

A 以外の接頭文字が含まれている場合、メッセージ番号は無視されます。診断メッ

セージのタグは切り取ってコマンドラインに直接貼り付けることができます。

tag を次のいずれかに設定することもできます。

• warning(すべての警告を非表示にする場合)

• error(すべてのエラーを非表示にする場合)

関連項目

• 「--diag_error=tag{, tag}」 (ページ 2-11)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-12ID 011811 Non-Confidential

Page 19: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

2.2.24 --diag_warning=tag{, tag}

アセンブラによって出力される診断メッセージは、{prefix}number という形式のタグ

で識別できます。prefix は A です。--diag_warning オプションは、指定されたタグを持

つ診断メッセージに警告の重大度を設定します。

これらのオプションでは複数のタグを指定できます。その場合は、各タグをコンマで区切ります。タグ番号の前には、オプションのアセンブラ接頭文字 A を指定できま

す。A 以外の接頭文字が含まれている場合、メッセージ番号は無視されます。

すべてのエラーを警告として扱う場合は、tag を error に設定します。

関連項目

• 「--diag_error=tag{, tag}」 (ページ 2-11)

2.2.25 --dllexport_all

ソースディレクティブによってオーバーライドされない限り、エクスポートされたすべてのグローバルシンボルに STV_HIDDEN ではなく ELF における STV_PROTECTED 可視性

を付与します。

関連項目

• 「EXPORT、GLOBAL」 (ページ 6-79)

2.2.26 --dwarf2

このオプションを --debug とともに使用すると、DWARF 2 デバッグ テーブルを生成

するようにアセンブラに指示できます。

関連項目

• 「--debug」 (ページ 2-9)• 「--dwarf3」

2.2.27 --dwarf3

このオプションを --debug とともに使用すると、DWARF 3 デバッグ テーブルを生成

するようにアセンブラに指示できます。- - debug が指定されている場合、これがデフォ

ルトになります。

関連項目

• 「--debug」 (ページ 2-9)• 「--dwarf2」

2.2.28 --errors=errorfile

エラーメッセージを errorfile に出力するようにアセンブラに指示します。

2.2.29 --execstack

このオプションは .note.GNU-stack セクションを生成し、そのスタックを実行可能と

してマークします。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-13ID 011811 Non-Confidential

Page 20: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

実行可能な .note.GNU-stack セクションを生成するには、次のように AREA ディレク

ティブを使用することができます。

AREA |.note.GNU-stack|,ALIGN=0,READONLY,NOALLOC,CODE

--execstack および --no_execstack がない場合、.note.GNU-stack セクションは AREA ディ

レクティブで指定されない限り、生成されません。

関連項目

• 「--no_execstack」 (ページ 2-20)• 「AREA」 (ページ 6-71)

2.2.30 --exceptions

FUNCTION(または PROC)および ENDFUNC(または ENDP)で定義されているすべての関数

の例外テーブル生成をオンにするようにアセンブラに指示します。

関連項目

• 「--no_exceptions」 (ページ 2-20)• 「--exceptions_unwind」• 「--no_exceptions_unwind」 (ページ 2-21)• 「FRAME UNWIND ON」 (ページ 6-54)• 「FUNCTION、PROC」 (ページ 6-54)• 「ENDFUNC、ENDP」 (ページ 6-56)• 「FRAME UNWIND OFF」 (ページ 6-54)

2.2.31 --exceptions_unwind

可能な場合は、関数について unwind テーブルを生成するようにアセンブラに指示し

ます。これがデフォルトです。

さらに細かく制御するには、FRAME UNWIND ON および FRAME UNWIND OFF ディレクティブを

使用します。

関連項目

• 「--no_exceptions_unwind」 (ページ 2-21)• 「--exceptions」• 「--no_exceptions」 (ページ 2-20)• 「FRAME UNWIND ON」 (ページ 6-54)• 「FRAME UNWIND OFF」 (ページ 6-54)• 「FUNCTION、PROC」 (ページ 6-54)• 「ENDFUNC、ENDP」 (ページ 6-56)

2.2.32 --fpmode=model

浮動小数点モデルを指定し、リンク時に 適なライブラリを選択するようにライブラリの属性と浮動小数点の 適化を設定します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-14ID 011811 Non-Confidential

Page 21: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

注 このオプションによって、記述したコードを変更する必要はありません。

model には次のいずれかを指定できます。

none ソースコードでは、どのような浮動小数点型も浮動小数点命令も使用で

きません。このオプションは、明示的な --fpu=name オプションをオー

バーライドします。

ieee_full IEEE 標準で保証されているすべての機能、演算、および表現を、単精

度および倍精度で使用できます。演算モードは、実行時に動的に選択できます。

ieee_fixed も近い値に丸め、不正確な例外の発生を報告しない IEEE 標準。

ieee_no_fenv も近い値に丸め、例外を発生させない IEEE 標準。このモードは、

Java の浮動小数点算術モデルと互換性があります。

std 0 にフラッシュされる非正規化数があり、 も近い値に丸め、例外の発

生を報告しない IEEE 有限値。このモードは C および C++ と互換性があ

ります。これはデフォルトオプションです。

有限値は、IEEE 標準によって予測されます。NaN (非数)および無限

値は、IEEE モデルによって定義されている一部の状況で生成されない

場合があります。また、生成されたとしても、記号が同じになるとは限りません。さらに、ゼロの記号が、IEEE モデルによって予測された記

号でない場合もあります。

fast 適化を変更する値です。この場合、高速実行の代わりに精度が犠牲に

なります。このモードは IEEE 互換でも、標準 C 形式でもありません。

armasm --fpmode ieee_full inputfile.s

関連項目

• 「--fpu=name」 (ページ 2-16)

2.2.33 --fpu=list

このオプションを使用すると、- - fpu=name オプションと一緒に使用可能なサポートさ

れている FPU 名が一覧になります。

armasm --fpu=list

関連項目

• 「--fpu=name」 (ページ 2-16)• 「--fpmode=model」 (ページ 2-14)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-15ID 011811 Non-Confidential

Page 22: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

2.2.34 --fpu=name

ターゲットの浮動小数点ユニット(FPU)アーキテクチャを選択します。このオプ

ションを指定すると、- - cpu オプションによって設定された任意の暗示的 FPU がオー

バライドされます。明示的に指定した FPU に CPU との互換性がない場合、エラーが

生成されます。浮動小数点命令が間違ったターゲット FPU にアセンブルされたとき

にも、エラーまたは警告が表示される場合があります。

アセンブラによって、オブジェクトファイル内の name に対応するビルド属性が設定

されます。オブジェクトファイル間の互換性と、選択されるライブラリはリンカによって決定されます。

name の有効値は以下のとおりです。

none 浮動小数点アーキテクチャを選択しません。これにより、アセン

ブルされたオブジェクトファイルと任意の FPU でビルドされたオ

ブジェクトファイルとの互換性を確保できます。

vfpv3 アーキテクチャ VFPv3 に適合する、ハードウェアの浮動小数点ユ

ニットを選択します。

vfpv3_fp16 半精度浮動小数点拡張を備えたアーキテクチャ VFPv3 に適合す

る、ハードウェアの浮動小数点ユニットを選択します。

vfpv3_d16 アーキテクチャ VFPv3-D16 に適合する、ハードウェアの浮動小数

点ユニットを選択します。

vfpv3_d16_fp16 半精度浮動小数点拡張を備えたアーキテクチャ VFPv3-D16 に適合

する、ハードウェアの浮動小数点ユニットを選択します。

vfpv4 アーキテクチャ VFPv4 に適合する、ハードウェアの浮動小数点ユ

ニットを選択します。

vfpv4_d16 アーキテクチャ VFPv4-D16 に適合する、ハードウェアの浮動小数

点ユニットを選択します。

fpv4_sp アーキテクチャ FPv4 の単精度バリアントに適合するハードウェ

ア浮動小数点ユニットを選択します。

vfpv2 アーキテクチャ VFPv2 に適合する、ハードウェアの浮動小数点ユ

ニットを選択します。

softvfp ソフトウェア浮動小数点リンケージを選択します。- - fpu オプショ

ンを指定せず、選択された --cpu オプションで特定の FPU が示唆

されていない場合は、これがデフォルトになります。

softvfp+vfpv2 VFP 命令を使用するソフトウェア浮動小数点リンケージがある浮

動小数点ライブラリを選択します。

それ以外の点は、- - fpu vfpv2 を使用する場合と同等です。

softvfp+vfpv3 VFP 命令を使用するソフトウェア浮動小数点リンケージがある浮

動小数点ライブラリを選択します。

それ以外の点は、- - fpu vfpv3 を使用する場合と同等です。

softvfp+vfpv3_fp16 VFP 命令を使用するソフトウェア浮動小数点リンケージがある浮

動小数点ライブラリを選択します。

それ以外の点は、- - fpu vfpv3_fp16 を使用する場合と同等です。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-16ID 011811 Non-Confidential

Page 23: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

softvfp+vfpv3_d16 VFP 命令を使用するソフトウェア浮動小数点リンケージがある浮

動小数点ライブラリを選択します。

それ以外の点は、- - fpu vfpv3_d16 を使用する場合と同等です。

softvfp+vfpv3_d16_fp16

VFP 命令を使用するソフトウェア浮動小数点リンケージがある浮

動小数点ライブラリを選択します。

それ以外の点は、- - fpu vfpv3_d16_fp16 を使用する場合と同等です。

softvfp+vfpv4 VFP 命令を使用するソフトウェア浮動小数点リンケージがある浮

動小数点ライブラリを選択します。

それ以外の点は、- - fpu vfpv4 を使用する場合と同等です。

softvfp+vfpv4_d16 VFP 命令を使用するソフトウェア浮動小数点リンケージがある浮

動小数点ライブラリを選択します。

それ以外の点は、- - fpu vfpv4_d16 を使用する場合と同等です。

softvfp+fpv4_sp VFP 命令を使用するソフトウェア浮動小数点リンケージがある浮

動小数点ライブラリを選択します。

それ以外の点は、- - fpu fpv4_sp を使用する場合と同等です。

関連項目

• 「--fpmode=model」 (ページ 2-14)

2.2.35 -g

このオプションは --debug と同義です。

関連項目

• 「--debug」 (ページ 2-9)

2.2.36 --help

使用できるコマンドラインオプションの概要を表示するようにアセンブラに指示します。

2.2.37 -idir{,dir, …}

ソースファイルインクルードパスにディレクトリを追加します。このオプションを使用してディレクトリを追加する場合は、完全修飾ディレクトリ名を指定する必要があります。

関連項目

• 「GET、INCLUDE」 (ページ 6-82)

2.2.38 --keep

デバッガで使用できるように、オブジェクトファイルのシンボルテーブル内にローカルラベルを保持するようにアセンブラに指示します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-17ID 011811 Non-Confidential

Page 24: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

2.2.39 --length=n

リストするページの長さを n に設定します。ゼロを指定した場合、ページ番号なし

でリストされます。デフォルトは 66 行です。

関連項目

• 「--list=file」

2.2.40 --li

このオプションは --littleend と同義です。

関連項目

• 「--littleend」 (ページ 2-19)• 「--bigend」 (ページ 2-7)

2.2.41 --library_type=lib

リンク時に使用する選択したライブラリを有効にします。

lib には次のいずれかを指定できます。

standardlib リンク時にフル ARM ランタイムライブラリを選択するように指

定します。これがデフォルトです。

microlib リンク時に C マイクロライブラリ(microlib)を選択するように

指定します。

注 このオプションは、ライブラリを使用する際に、より特化した 適化を必要とする

ときに、コンパイラ、アセンブラ、またはリンカで使用できます。

このオプションでリンカを使用すると、他のすべての --library_type オプションが

オーバーライドされます。

関連項目

• 『ARM C および C++ ライブラリと浮動小数点サポートの使用』の「microlib を使用したアプリケーションの作成」 (ページ 3-7)

• 『コンパイラリファレンス』の「--library_type=lib」 (ページ 3-84)

2.2.42 --licretry

特定の FLEXnet エラーコードに遭遇したらすぐに、ライセンスの確認を約 10 秒間隔

で 大 10 回再試行するようにアセンブラに指示します。

2.2.43 --list=file

このオプションは、アセンブラによって生成されたアセンブリ言語の詳細なリストを file に出力するようにアセンブラに指示します。

file として - を指定すると、リストが stdout に送られます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-18ID 011811 Non-Confidential

Page 25: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

- - list の動作を制御するには、次のコマンドラインオプションを使用します。

• --no_terse• --width• --length• --xref

関連項目

• 「--no_terse」 (ページ 2-22)• 「--width=n」 (ページ 2-27)• 「--length=n」 (ページ 2-18)• 「--xref」 (ページ 2-28)

2.2.44 --list=

このオプションは、アセンブリ言語の詳細なリストを inputfile.lst に送信するよう

にアセンブラに指示します。

注 ファイル名なしで --list を使用すると、出力を inputfile.lst に送信できます。ただ

し、この構文は現在使用が制限されているため、この構文を使用するとアセンブラによって警告メッセージが表示されます。この構文は今後のリリースで廃止される予定です。代わりに --list= を使用して下さい。

関連項目

• 「--list=file」 (ページ 2-18)

2.2.45 --littleend

リトルエンディアン ARM プロセッサに適したコードをアセンブルするようにアセン

ブラに指示します。

関連項目

• 「--bigend」 (ページ 2-7)

2.2.46 -m

ソースファイル依存関係リストを stdout に書き込むようにアセンブラに指示します。

関連項目

• 「--md」 (ページ 2-20)

2.2.47 --maxcache=n

大ソースキャッシュサイズを n バイトに設定します。デフォルトは 8MB です。

armasm では、サイズが 8MB を下回ると警告が表示されます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-19ID 011811 Non-Confidential

Page 26: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

2.2.48 --md

ソースファイル依存関係リストを inputfile.d に書き込むようにアセンブラに指示し

ます。

関連項目

• 「-m」 (ページ 2-19)

2.2.49 --no_code_gen

パス 1 の後に終了するようにアセンブラに指示します。オブジェクトファイルは生

成されません。このオプションは、ソースコードまたはディレクティブの構文のチェックだけを行う場合に便利です。

2.2.50 --no_esc

\n や \t など、C 形式のエスケープ処理した特殊文字を無視するようにアセンブラに

指示します。

2.2.51 --no_execstack

このオプションは .note.GNU-stack セクションを生成し、そのスタックを実行不可能

としてマークします。

実行不可能な .note.GNU-stack セクションを生成するには、次のように AREA ディレク

ティブを使用することができます。

AREA |.note.GNU-stack|,ALIGN=0,READONLY,NOALLOC

--execstack および --no_execstack がない場合、.note.GNU-stack セクションは AREA ディ

レクティブで指定されない限り、生成されません。

コマンドラインオプションとソースディレクティブの両方が使用されていて、それらが異なる場合、スタックは実行可能とマークされます。

関連項目

• 「--execstack」 (ページ 2-13)• 「AREA」 (ページ 6-71)

2.2.52 --no_exceptions

例外テーブル生成をオフにするようにアセンブラに指示します。テーブルは生成されません。これがデフォルトです。

表 2-3 GNU-stack セクションに対するコマンドラインオプションと AREA ディレクティブの指定

--execstackコマンドラインオプション

--no_execstackコマンドラインオプション

execstack AREA ディレクティ

execstack execstack

no_execstack AREA ディレク

ティブ

execstack no_execstack

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-20ID 011811 Non-Confidential

Page 27: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

関連項目

• 「--exceptions」 (ページ 2-14)• 「--exceptions_unwind」 (ページ 2-14)• 「--no_exceptions_unwind」• 「FRAME UNWIND ON」 (ページ 6-54)• 「FRAME UNWIND OFF」 (ページ 6-54)

2.2.53 --no_exceptions_unwind

すべての関数について nounwind テーブルを生成するようにアセンブラに指示します。

関連項目

• 「--exceptions」 (ページ 2-14)• 「--no_exceptions」 (ページ 2-20)• 「--exceptions_unwind」 (ページ 2-14)

2.2.54 --no_hide_all

ソースディレクティブによってオーバーライドされない限り、エクスポートおよびインポートされたすべてのグローバルシンボルに STV_HIDDEN ではなく ELF における STV_DEFAULT 可視性を付与します。

関連項目

• 「EXPORT、GLOBAL」 (ページ 6-79)• 「IMPORT、EXTERN」 (ページ 6-83)

2.2.55 --no_project

プロジェクトテンプレートファイルの使用を禁止します。

関連項目

• 『コンパイラリファレンス』の「--project=filename?--no_project」 (ページ 3-110)

• 「--reinitialize_workdir」 (ページ 2-25)• 「--workdir=directory」 (ページ 2-28)

2.2.56 --no_reduce_paths

ファイルパスの冗長なパス名情報の除外を無効にします。これがデフォルトの設定です。このオプションは Windows システムでのみ使用できます。

関連項目

• 「--reduce_paths」 (ページ 2-23)• 『コンパイラリファレンス』の「--reduce_paths、--no_reduce_paths」

(ページ 3-111)

2.2.57 --no_regs

レジスタ名を事前定義しないようにアセンブラが設定されます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-21ID 011811 Non-Confidential

Page 28: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

このオプションの使用は廃止される予定です。代わりに --regnames=none を使用して

下さい。

関連項目

• 「--regnames=none」 (ページ 2-24)• 『アセンブラの使用』の「事前宣言されている主要なレジスタ名」 (ページ

3-15)• 『アセンブラの使用』の「事前宣言されている拡張レジスタ名」 (ページ 3-16)• 『アセンブラの使用』の「事前宣言されている XScale レジスタ名」 (ページ

3-17)• 『アセンブラの使用』の「事前宣言されているコプロセッサ名」 (ページ 3-19)

2.2.58 --no_terse

リストファイル内で条件付きアセンブリによってスキップされたアセンブラコードの行を表示するようにアセンブラに指示します。コマンドラインでこのオプションを指定していない場合、リストファイルにはスキップされたアセンブラコードが出力されません。

このオプションを指定すると、terse フラグが無効になります。デフォルトでは、

terse フラグは有効です。

関連項目

• 「--list=file」 (ページ 2-18)

2.2.59 --no_unaligned_access

オブジェクトファイルにおいて、非境界整列アクセスの使用を無効にする属性を設定するようにアセンブラに指示します。

関連項目

• 「--unaligned_access」 (ページ 2-26)

2.2.60 --no_warn

警告メッセージをオフにします。

関連項目

• 「--diag_warning=tag{, tag}」 (ページ 2-13)

2.2.61 -o filename

出力オブジェクトファイルに名前を付けます。このオプションが指定されていない場合、アセンブラは、inputfilename.o という形式でオブジェクトのファイル名を作成

します。このオプションでは大文字と小文字が区別されます。

2.2.62 --pd

このオプションは --predefine と同義です。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-22ID 011811 Non-Confidential

Page 29: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

関連項目

• 「--predefine "directive"」

2.2.63 --predefine "directive"

いずれかの SET ディレクティブを事前実行するようにアセンブラに指示します。これ

は条件付きアセンブリに便利です。

directive は、SETA、SETL、または SETS ディレクティブのいずれかです。directive は次

のように引用符で囲む必要があります。

armasm --predefine "VariableName SETA 20" inputfile.s

また、アセンブラは、変数の値を設定する前に、対応する GBLL、GBLS、または GBLA ディレクティブを実行して変数を定義します。

変数名では、大文字と小文字が区別されます。コマンドラインを使用して定義された変数は、コマンドラインで指定されたアセンブラソースファイルに対してグローバルです。

注 使用しているシステムのコマンドラインインタフェースによっては、\” など、特殊文

字を組み合わせたものを入力して、directive に文字列を含める必要があります。あ

るいは、- - via file を使用して --predefine 引数を含めることもできます。コマンドラ

インインタフェースでは --via ファイルからの引数を変更することはできません。

関連項目

• 「--pd」 (ページ 2-22)• 「定義される変数に基づく条件付きアセンブリ」 (ページ 6-40)

2.2.64 --project=filename

プロジェクトテンプレートファイルの使用を許可します。

プロジェクトテンプレートは、特定の設定のコマンドラインオプションなどのプロジェクト情報が含まれているファイルです。これらのファイルは、プロジェクトテンプレートの作業ディレクトリに保存されています。

関連項目

• 『コンパイラリファレンス』の「--project=filename?--no_project」 (ページ 3-110)

• 「--reinitialize_workdir」 (ページ 2-25)• 「--workdir=directory」 (ページ 2-28)

2.2.65 --reduce_paths

ファイルパスの冗長なパス名情報の除外を有効にします。このオプションは Windows システムでのみ使用できます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-23ID 011811 Non-Confidential

Page 30: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

Windows システムには、ファイルパスが 260 文字までという制限があります。絶対

名が 260 文字を超える相対パス名が存在する場合、--reduce_paths オプションを使用

して、ディレクトリを .. の対応するインスタンスとマッチアップし、directory/.. シーケンスをペアで削除することにより、絶対パス名の長さを短縮できます。

注 --reduce_paths オプションを使用してパスの長さを短縮するのではなく、長いファイ

ルパスや深いネスト構造のファイルパスを使用しないようにすることを推奨します。

関連項目

• 「--no_reduce_paths」 (ページ 2-21)• 『コンパイラリファレンス』の「--reduce_paths、--no_reduce_paths」

(ページ 3-111)

2.2.66 --regnames=none

レジスタ名を事前定義しないようにアセンブラが設定されます。

関連項目

• 「--regnames=callstd」• 「--regnames=all」• 「--no_regs」 (ページ 2-21)• 『アセンブラの使用』の「事前宣言されている主要なレジスタ名」 (ページ

3-15)• 『アセンブラの使用』の「事前宣言されている拡張レジスタ名」 (ページ 3-16)• 『アセンブラの使用』の「事前宣言されている XScale レジスタ名」 (ページ

3-17)• 『アセンブラの使用』の「事前宣言されているコプロセッサ名」 (ページ 3-19)

2.2.67 --regnames=callstd

- - apcs オプションで指定された、使用中の AAPCS バリアントに基づいて追加のレジ

スタ名を定義します。

関連項目

• 「--apcs=qualifier…qualifier」 (ページ 2-5)• 「--regnames=none」• 「--regnames=all」

2.2.68 --regnames=all

- - apcs の値にかかわらず、すべての AAPCS レジスタを定義します。

• 「--apcs=qualifier…qualifier」 (ページ 2-5)• 「--regnames=none」• 「--regnames=callstd」

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-24ID 011811 Non-Confidential

Page 31: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

2.2.69 --reinitialize_workdir

プロジェクトテンプレートの作業ディレクトリを再初期化するかどうかを指定できます。

関連項目

• 『コンパイラリファレンス』の「--reinitialize_workdir」• 「--project=filename」 (ページ 2-23)• 「--workdir=directory」 (ページ 2-28)

2.2.70 --report-if-not-wysiwyg

ソースコードで直接要求されていないエンコードをアセンブラが出力するときに報告するようアセンブラに指示します。アセンブラで次の処理を行うときに、報告が行われる可能性があります。

• MOV32 など、他のアセンブラで使用できない疑似命令を使用するとき

• 命令ニーモニックに直接対応しないエンコードを出力するとき(例えば、MOV 命令のアセンブル時にアセンブラが MVN エンコードを出力する場合)

• 命令構文のセマンティクス上不可欠な追加命令を挿入するとき(例えば、アセンブラは欠落している IT 命令を条件付き Thumb 命令の前に挿入できます)

2.2.71 --show_cmdline

このオプションは、アセンブラによって使用されたコマンドラインを出力します。アセンブラによって処理された後のコマンドラインを表示することによって、以下の点を確認できます。

• ビルドシステムによって使用されているコマンドライン

• 指定されたコマンドラインがアセンブラによってどのように解釈されているか(コマンドラインオプションの順序など)

コマンドは正規化されて表示されます。また、via ファイルの内容は展開されます。

出力結果は標準出力ストリーム(stdout)に送られます。

関連項目

• 「--via=file」 (ページ 2-27)

2.2.72 --split_ldm

多数のレジスタが含まれている LDM および STM 命令をエラーにするようにアセンブラ

に指示します。このオプションは使用が制限されています。

このオプションを指定すると、転送されたレジスタの 大数が次の数を超えた場合、LDM 命令はエラーになります。

• PC をロードしない LDM 命令の場合は 大 5 本まで

• PC をロードする LDM 命令の場合は 大 4 本まで

このオプションを指定すると、転送されたレジスタの 大数が 5 を超えた場合、STM 命令はエラーになります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-25ID 011811 Non-Confidential

Page 32: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

多数のレジスタの転送を回避すると、次のような ARM システムに対する割り込み遅

延を減らすことができます。

• キャッシュや書き込みバッファのない ARM システム(キャッシュレス ARM7TDMI など)

• ゼロウェイト状態モード、32 ビットメモリを使用する ARM システム

また、多数のレジスタの転送を回避すると、次の影響があります。

• コードサイズが増えます。

• キャッシュ付きシステムや、書き込みバッファ付きプロセッサには大きなメリットはありません。

• ゼロウェイト状態メモリを使用していないシステムや、低速なペリフェラルデバイスのあるシステムの場合はメリットはありません。このようなシステムの割り込みレイテンシは、 も速度の遅いメモリまたはペリフェラルデバイスへのアクセスに必要なサイクル数によって決まります。この割り込みレイテンシは通常、複数レジスタの転送によって誘発されるレイテンシよりも大きくなります。

2.2.73 --thumb

UAL 構文を使用して、命令を Thumb 命令として解釈するようにアセンブラに指示し

ます。このオプションは、ソースファイルの先頭の THUMB ディレクティブに相当しま

す。

関連項目

• 「--arm」 (ページ 2-6)• 「ARM、THUMB、THUMBX、CODE16、CODE32」 (ページ 6-64)

2.2.74 --thumbx

UAL 構文を使用して、命令を Thumb-2EE 命令として解釈するようにアセンブラに指

示します。このオプションは、ソースファイルの先頭の THUMBX ディレクティブに相

当します。

関連項目

• 「ARM、THUMB、THUMBX、CODE16、CODE32」 (ページ 6-64)

2.2.75 --unaligned_access

オブジェクトファイルにおいて、非境界整列アクセスの使用を有効にする属性を設定するようにアセンブラに指示します。

関連項目

• 「--no_unaligned_access」 (ページ 2-22)

2.2.76 --unsafe

異なるアーキテクチャの命令をエラーなしでアセンブルします。対応するエラーメッセージは警告メッセージに変更されます。演算子の優先順位に関する警告も非表示にされます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-26ID 011811 Non-Confidential

Page 33: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

関連項目

• 「--diag_error=tag{, tag}」 (ページ 2-11)• 「--diag_warning=tag{, tag}」 (ページ 2-13)• 『アセンブラの使用』の「バイナリ演算子」 (ページ 8-23)

2.2.77 --untyped_local_labels

Thumb コード内のローカルラベルの参照時に Thumb ビットを設定しないようにアセ

ンブラに指示します。

関連項目

• 「LDR 疑似命令」 (ページ 3-169)• 『アセンブラの使用』の「ローカルラベル」 (ページ 8-12)

2.2.78 --version_number

armasm のバージョンごとに増加する整数を表示するようにアセンブラに指示します。

整数の形式は PVbbbb です。各項目には以下の意味があります。

P メジャーバージョンを示します。

V マイナーバージョンを示します。

bbbb ビルド番号を示します。

例えば、アセンブラによって 400123 が出力された場合、armasm のバージョン番号は 4.0、ビルド番号は 123 です。

関連項目

• 「--vsn」• 「--help」 (ページ 2-17)

2.2.79 --via=file

file を開き、コマンドライン引数を読み込むようにアセンブラに指示します。

関連項目

• 『コンパイラリファレンス』の付録 B via ファイルの構文

2.2.80 --vsn

このオプションを選択すると、バージョン情報とライセンス情報が表示されます。

関連項目

• 「--version_number」• 「--help」 (ページ 2-17)

2.2.81 --width=n

リストするページの幅を n に設定します。デフォルトは 79 文字です。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-27ID 011811 Non-Confidential

Page 34: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

アセンブラコマンドラインオプション

関連項目

• 「--list=file」 (ページ 2-18)

2.2.82 --workdir=directory

このオプションを使用すると、プロジェクトテンプレートに作業ディレクトリを提供するかどうかを指定できます。

関連項目

• 「--project=filename」 (ページ 2-23)• 「--reinitialize_workdir」 (ページ 2-25)• 『コンパイラリファレンス』の「--workdir=directory」 (ページ 3-139)

2.2.83 --xref

このオプションを選択すると、マクロの内部と外部でシンボルが定義されている場所と使用されている場所について、相互参照情報をリストするようにアセンブラが設定されます。デフォルトはオフです。

関連項目

• 「--list=file」 (ページ 2-18)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 2-28ID 011811 Non-Confidential

Page 35: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

第 3 章 ARM 命令と Thumb 命令

以下の各トピックでは、ARM アセンブラでサポートされている ARM 命令、Thumb 命令(すべてのバージョン)、および ThumbEE 命令について説明します。

• 「命令の概要」 (ページ 3-2)• 「命令の幅指定子」 (ページ 3-12)• 「メモリアクセス命令」 (ページ 3-13)• 「汎用データ処理命令」 (ページ 3-50)• 「乗算命令」 (ページ 3-82)• 「サチュレート命令」 (ページ 3-103)• 「並列命令」 (ページ 3-108)• 「パック命令と展開命令」 (ページ 3-116)• 「分岐命令と制御命令」 (ページ 3-123)• 「コプロセッサ命令」 (ページ 3-132)• 「その他の命令」 (ページ 3-142)• 「ThumbEE 命令」 (ページ 3-159)• 「疑似命令」 (ページ 3-163)• 「条件コード」 (ページ 3-173)

命令セクションの中にはアーキテクチャサブセクションを含むものがあります。アーキテクチャサブセクションを持たない命令は、すべてのバージョンの ARM 命令セットお

よびすべてのバージョンの Thumb 命令セットで使用できるものです。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-1ID 011811 Non-Confidential

Page 36: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.1 命令の概要

表 3-1 は、ARM、Thumb、および ThumbEE 命令セットで使用できる命令の概要を示

しています。このセクションを使用して、個々の命令および疑似命令の説明に移動できます。

注 特に明記していない限り、ThumbEE 命令は Thumb 命令と同一です。

表 3-1 命令の参照ページ

ニーモニック 概要 ページアーキテクチャa

ADC、ADD キャリー付き加算、加算 (ページ 3-56)

すべて

ADR プログラム相対アドレスまたはレジスタ相対アドレスのロード(狭範囲)

(ページ 3-29)

すべて

ADRL 疑似命令 プログラム相対アドレスまたはレジスタ相対アドレスのロード(中範囲)

(ページ 3-164)

x6M

AND 論理積 (ページ 3-62)

すべて

ASR 算術右シフト (ページ 3-78)

すべて

B 分岐 (ページ 3-124)

すべて

BFC、BFI ビットフィールドのクリア命令と挿入命令 (ページ 3-117)

T2

BIC ビットクリア (ページ 3-62)

すべて

BKPT ブレークポイント (ページ 3-143)

5

BL リンク付き分岐命令 (ページ 3-124)

すべて

BLX リンク付き分岐、命令セットの変更 (ページ 3-124)

T

BX 分岐、命令セットの変更 (ページ 3-124)

T

BXJ 分岐、Jazelle® へ変更 (ページ 3-124)

J、x7M

CBZ、 CBNZ 0 と比較し、0 の(または 0 でない)場合に分岐する

命令

(ページ 3-130)

T2

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-2ID 011811 Non-Confidential

Page 37: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

CDP コプロセッサデータ処理命令 (ページ 3-133)

x6M

CDP2 コプロセッサデータ処理命令 (ページ 3-133)

5、x6M

CHKA 配列をチェックする命令 (ページ 3-161)

EE

CLREX 排他のクリア命令 (ページ 3-48)

K、x6M

CLZ 先行ゼロカウント (ページ 3-65)

5、x6M

CMN、CMP 否定値の比較、比較命令 (ページ 3-66)

すべて

CPS プロセッサ状態の変更命令 (ページ 3-149)

6

DBG デバッグ (ページ 3-155)

7

DMB、DSB データメモリバリア、データ同期バリア (ページ 3-156)

7、6M

ENTERX、LEAVEX ThumbEE との間の状態切り替え命令 (ページ 3-160)

EE

EOR 排他的論理和(XOR) (ページ 3-62)

すべて

HB、HBL、HBLP、HBP ハンドラの分岐、指定されたハンドラへの分岐 (ページ 3-162)

EE

ISB 命令同期バリア (ページ 3-156)

7、6M

IT If-Then (ページ 3-127)

T2

LDC コプロセッサロード (ページ 3-140)

x6M

LDC2 コプロセッサロード (ページ 3-140)

5、x6M

LDM 多重レジスタロード (ページ 3-35)

すべて

LDR レジスタロード(ワード) (ページ 3-13)

すべて

表 3-1 命令の参照ページ (続き)

ニーモニック 概要 ページアーキテクチャa

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-3ID 011811 Non-Confidential

Page 38: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

LDR 疑似命令 レジスタロード疑似命令 (ページ 3-169)

すべて

LDRB レジスタロード(バイト) (ページ 3-13)

すべて

LDRBT レジスタロード(バイト)、ユーザモード (ページ 3-13)

x6M

LDRD レジスタロード(2 ワード) (ページ 3-13)

5E、x6M

LDREX 排他的レジスタロード (ページ 3-45)

6、x6M

LDREXB、LDREXH 排他的レジスタロード(バイト、ハーフワード) (ページ 3-45)

K、x6M

LDREXD 排他的レジスタロード(ダブルワード) (ページ 3-45)

K、x7M

LDRH レジスタロード(ハーフワード) (ページ 3-13)

すべて

LDRHT レジスタロード(ハーフワード)、ユーザモード (ページ 3-13)

T2

LDRSB レジスタロード(符号付きバイト) (ページ 3-13)

すべて

LDRSBT レジスタロード(符号付きバイト)、ユーザモード (ページ 3-13)

T2

LDRSH レジスタロード(符号付きハーフワード) (ページ 3-13)

すべて

LDRSHT レジスタロード(符号付きハーフワード)、ユーザモード

(ページ 3-13)

T2

LDRT レジスタロード(ワード)、ユーザモード (ページ 3-13)

x6M

LSL、LSR 論理左シフト、論理右シフト (ページ 3-78)

すべて

MAR レジスタから 40 ビット累算器への移動命令 (ページ 3-158)

XScale

MCR レジスタからコプロセッサへの移動命令 (ページ 3-134)

x6M

MCR2 レジスタからコプロセッサへの移動命令 (ページ 3-134)

5、x6M

表 3-1 命令の参照ページ (続き)

ニーモニック 概要 ページアーキテクチャa

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-4ID 011811 Non-Confidential

Page 39: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

MCRR レジスタからコプロセッサへの移動命令 (ページ 3-134)

5E、x6M

MCRR2 レジスタからコプロセッサへの移動命令 (ページ 3-134)

6、x6M

MIA、MIAPH、MIAxy 乗算および内部 40 ビット累積 (ページ 3-101)

XScale

MLA 積和 (ページ 3-83)

x6M

MLS 積差 (ページ 3-83)

T2

MOV 移動 (ページ 3-68)

すべて

MOVT 上位ハーフワードにデータを代入する命令 (ページ 3-71)

T2

MOV32 疑似命令 レジスタへの 32 ビットイミディエート値の移動命

(ページ 3-167)

T2

MRA 40 ビット累算器からレジスタへの移動命令 (ページ 3-158)

XScale

MRC コプロセッサからレジスタへの移動命令 (ページ 3-135)

x6M

MRC2 コプロセッサからレジスタへの移動命令 (ページ 3-135)

5、x6M

MRRC コプロセッサからレジスタへの移動命令 (ページ 3-135)

5E、x6M

MRRC2 コプロセッサからレジスタへの移動命令 (ページ 3-135)

6、x6M

MRS PSR からレジスタへの移動命令 (ページ 3-145)

すべて

MRS システムコプロセッサからレジスタへの移動命令 (ページ 3-138)

7A、7R

MSR レジスタから PSR への移動命令 (ページ 3-147)

すべて

MSR レジスタからシステムコプロセッサへの移動命令 (ページ 3-137)

7A、7R

MUL 乗算 (ページ 3-83)

すべて

表 3-1 命令の参照ページ (続き)

ニーモニック 概要 ページアーキテクチャa

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-5ID 011811 Non-Confidential

Page 40: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

MVN データの各ビットを反転させてから代入する命令 (ページ 3-68)

すべて

NOP 操作なし (ページ 3-152)

すべて

ORN 論理和否定 (ページ 3-62)

T2

ORR 論理和 (ページ 3-62)

すべて

PKHBT、PKHTB ハーフワードのパック命令 (ページ 3-121)

6、7EM

PLD データをプリロード (ページ 3-33)

5E、x6M

PLDW 書き込むためにデータをプリロード (ページ 3-33)

7MP

PLI 命令をプリロード (ページ 3-33)

7

PUSH、POP レジスタをスタックに PUSH、スタックからレジス

タを POP(ページ 3-38)

すべて

QADD、QDADD、QDSUB、QSUB サチュレート算術演算 (ページ 3-104)

5E、7EM

QADD8、QADD16、QASX、QSUB8、

QSUB16、QSAX

並列符号付きサチュレート算術演算 (ページ 3-109)

6、7EM

RBIT ビット順序を反転 (ページ 3-76)

T2

REV、REV16、REVSH バイト順序を反転 (ページ 3-76)

6

RFE 例外からの復帰 (ページ 3-41)

T2、x7M

ROR レジスタの右ロテート (ページ 3-78)

すべて

RRX 拡張付き右ロテート (ページ 3-78)

x6M

RSB 逆減算 (ページ 3-56)

すべて

RSC キャリー付き逆減算 (ページ 3-56)

x7M

表 3-1 命令の参照ページ (続き)

ニーモニック 概要 ページアーキテクチャa

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-6ID 011811 Non-Confidential

Page 41: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

SADD8、SADD16、SASX 並列符号付き算術演算 (ページ 3-109)

6、7EM

SBC キャリー付き減算 (ページ 3-56)

すべて

SBFX、UBFX 符号付き / 符号なしビットフィールドの抽出命令 (ページ 3-118)

T2

SDIV 符号付き除算 (ページ 3-81)

7M、7R

SEL APSR の GE フラグに基づくバイトの選択 (ページ 3-74)

6、7EM

SETEND メモリアクセス時のエンディアン形式を設定する命令

(ページ 3-151)

6、x7M

SEV イベントを設定する命令 (ページ 3-153)

K、6M

SHADD8、SHADD16、SHASX、

SHSUB8、SHSUB16、SHSAX

符号付きでバイト、ハーフワード並列演算 (ページ 3-109)

6、7EM

SMC セキュアモニターコール (ページ 3-150)

Z

SMLAxy 符号付き積和(32 <= 16 x 16 + 32) (ページ 3-87)

5E、7EM

SMLAD デュアル符号付き積和 (ページ 3-96)

6、7EM

(32 <= 32 + 16 x 16 + 16 x 16)

SMLAL 符号付き積和(64 <= 64 + 32 x 32) (ページ 3-85)

x6M

SMLALxy 符号付き積和(64 <= 64 + 16 x 16) (ページ 3-90)

5E、7EM

SMLALD デュアル符号付き積和 long (ページ 3-98)

6、7EM

(64 <= 64 + 16 x 16 + 16 x 16)

SMLAWy 符号付き積和(32 <= 32 x 16 + 32) (ページ 3-89)

5E、7EM

SMLSD デュアル符号付き乗減累算 (ページ 3-96)

6、7EM

(32 <= 32 + 16 x 16 – 16 x 16)

表 3-1 命令の参照ページ (続き)

ニーモニック 概要 ページアーキテクチャa

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-7ID 011811 Non-Confidential

Page 42: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

SMLSLD デュアル符号付き乗減累算 long (ページ 3-98)

6、7EM

(64 <= 64 + 16 x 16 – 16 x 16)

SMMLA 符号付き上位ワード積和(32 <= TopWord(32 x 32 + 32))

(ページ 3-94)

6、7EM

SMMLS 符号付き上位ワード積差(32 <= TopWord(32 - 32 x 32))

(ページ 3-94)

6、7EM

SMMUL 符号付き上位ワード乗算(32 <= TopWord (32 x 32)) (ページ 3-94)

6、7EM

SMUAD、SMUSD デュアル符号付き乗算、および積の加算または減算 (ページ 3-92)

6、7EM

SMULxy 符号付き乗算(32 <= 16 x 16) (ページ 3-87)

5E、7EM

SMULL 符号付き乗算(64 <= 32 x 32) (ページ 3-85)

x6M

SMULWy 符号付き乗算(32 <= 32 x 16) (ページ 3-89)

5E、7EM

SRS 復帰状態のストア命令 (ページ 3-43)

T2、x7M

SSAT 符号付きサチュレート演算 (ページ 3-106)

6、x6M

SSAT16 符号付き並列ハーフワードサチュレート演算 (ページ 3-114)

6、7EM

SSUB8、SSUB16、SSAX 並列符号付き算術演算 (ページ 3-109)

6、7EM

STC コプロセッサストア命令 (ページ 3-140)

x6M

STC2 コプロセッサストア命令 (ページ 3-140)

5、x6M

STM 多重レジスタストア (ページ 3-35)

すべて

STR レジスタストア(ワード) (ページ 3-13)

すべて

STRB レジスタストア(バイト) (ページ 3-13)

すべて

STRBT レジスタストア(バイト)、ユーザモード (ページ 3-13)

x6M

表 3-1 命令の参照ページ (続き)

ニーモニック 概要 ページアーキテクチャa

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-8ID 011811 Non-Confidential

Page 43: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

STRD レジスタストア(2 ワード) (ページ 3-13)

5E、x6M

STREX 排他的レジスタストア (ページ 3-45)

6、x6M

STREXB、STREXH 排他的レジスタストア(バイト、ハーフワード) (ページ 3-45)

K、x6M

STREXD 排他的レジスタストア(ダブルワード) (ページ 3-45)

K、x7M

STRH レジスタストア(ハーフワード) (ページ 3-13)

すべて

STRHT レジスタストア(ハーフワード)、ユーザモード (ページ 3-13)

T2

STRT レジスタストア(ワード)、ユーザモード (ページ 3-13)

x6M

SUB 減算 (ページ 3-56)

すべて

SUBS PC、 lr スタックを行わない例外からの復帰命令 (ページ 3-60)

T2、x7M

SVC(以前の SWI) スーパーバイザコール (ページ 3-144)

すべて

SWP、SWPB レジスタとメモリ間のスワップ(ARM のみ) (ページ 3-49)

すべて、x7M

SXTAB、 SXTAB16、 SXTAH 加算オプション付きの符号拡張 (ページ 3-119)

6、7EM

SXTB、 SXTH 符号付き拡張 (ページ 3-119)

6

SXTB16 符号付き拡張 (ページ 3-119)

6、7EM

SYS システムコプロセッサ命令の実行 (ページ 3-139)

7A、7R

TBB、TBH テーブル分岐バイト、ハーフワード (ページ 3-131)

T2

TEQ 等価テスト (ページ 3-72)

x6M

TST テスト (ページ 3-72)

すべて

表 3-1 命令の参照ページ (続き)

ニーモニック 概要 ページアーキテクチャa

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-9ID 011811 Non-Confidential

Page 44: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

UADD8、UADD16、UASX 並列符号なし算術演算 (ページ 3-109)

6、7EM

UDIV 符号なし除算 (ページ 3-81)

7M、7R

UHADD8、UHADD16、UHASX、

UHSUB8、UHSUB16、UHSAX

並列符号なし半演算 (ページ 3-109)

6、7EM

UMAAL 符号なし積和累算 long (ページ 3-100)

6、7EM

(64 <= 32 + 32 + 32 x 32)

UMLAL、UMULL 符号なし積和累算、符号なし乗算 (ページ 3-85)

x6M

(64 <= 32 x 32 + 64)、(64 <= 32 x 32)

UQADD8、UQADD16、UQASX、

UQSUB8、UQSUB16、UQSAX

並列符号なしサチュレート算術演算 (ページ 3-109)

6、7EM

USAD8 符号なし絶対差の和 (ページ 3-112)

6、7EM

USADA8 符号なし絶対差の和の累算 (ページ 3-112)

6、7EM

USAT 符号なしサチュレート演算 (ページ 3-106)

6、x6M

USAT16 符号なし並列ハーフワードサチュレート演算 (ページ 3-114)

6、7EM

USUB8、USUB16、USAX 並列符号なし算術演算 (ページ 3-109)

6、7EM

UXTAB、 UXTAB16、 UXTAH 任意で加算を伴う符号なし拡張 (ページ 3-119)

6、7EM

UXTB、 UXTH 符号なし拡張 (ページ 3-119)

6

UXTB16 符号なし拡張 (ページ 3-119)

6、7EM

V* 詳細については、「第 4 章 NEON と VFP プログラミ

ング」を参照して下さい。

WFE、WFI、YIELD イベント待機、割り込み待機、明け渡し (ページ 3-153)

T2、6M

表 3-1 命令の参照ページ (続き)

ニーモニック 概要 ページアーキテクチャa

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-10ID 011811 Non-Confidential

Page 45: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

a. アーキテクチャ欄のエントリは次の意味を持ちます。

すべて ARM アーキテクチャのすべてのバージョンで使用できる命令です。

5 ARMv5T*、ARMv6*、および ARMv7 アーキテクチャで使用できる命令です。

5E ARMv5TE、ARMv6*、および ARMv7 アーキテクチャで使用できる命令です。

6 ARMv6* および ARMv7 アーキテクチャで使用できる命令です。

6M ARMv6-M および ARMv7 アーキテクチャで使用できる命令です。

x6M ARMv6-M アーキテクチャでは使用できない命令です。

7 ARMv7 アーキテクチャで使用できる命令です。

7M ARMv7E-M 実装を含む ARMv7-M アーキテクチャで使用できる命令です。

x7M ARMv6-M または ARMv7-M アーキテクチャ、および ARMv7E-M 実装では使用できない命令です。

7EM ARMv7E-M 実装では使用でき、ARMv7-M または ARMv6-M アーキテクチャでは使用できない命令

です。

7R ARMv7-R アーキテクチャで使用できる命令です。

7MP マルチプロセス拡張を実装した ARMv7 アーキテクチャで使用できる命令です。

EE ARM アーキテクチャの ThumbEE バリアントで使用できる命令です。

J ARMv5TEJ、ARMv6*、および ARMv7 アーキテクチャで使用できる命令です。

K ARMv6K および ARMv7 アーキテクチャで使用できる命令です。

T ARMv4T、ARMv5T*、ARMv6*、および ARMv7 アーキテクチャで使用できる命令です。

T2 ARMv6T2 以上のアーキテクチャで使用できる命令です。

XScale ARM アーキテクチャの XScale バージョンで使用できる命令です。

Z Security Extensions が実装されている場合に使用できる命令です。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-11ID 011811 Non-Confidential

Page 46: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.2 命令の幅指定子

命令の幅指定子 .W および .N は、ARMv6T2 以降向けにアセンブルされる Thumb コー

ドの命令サイズを制御します。

Thumb コード(ARMv6T2 以降)では、.W 幅指定子を設定することにより、16 ビット

エンコーディングが使用できる場合でも、アセンブラで 32 ビットエンコーディング

が行われます。.W 指定子は ARM コードとしてアセンブルするときには無視されま

す。

Thumb コードで .N 幅指定子を設定すると、アセンブラで 16 ビットエンコーディング

が使用されます。このとき、命令が 16 ビットでエンコードできない場合や .N を ARM コードで使用した場合には、エラーが発生します。

命令の幅指定子は、命令ニーモニックと条件コードの直後に置きます。次に例を示します。

BCS.W label ; 短分岐の場合も 32 ビ ッ ト命令を適用する

B.N label : ラ ベルが 16 ビ ッ ト命令の範囲外の場合はエ ラ ーが発生する

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-12ID 011811 Non-Confidential

Page 47: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3 メモリアクセス命令

このセクションは以下のサブセクションから構成されています。

• 「LDR と STR (イミディエートオフセット)」 (ページ 3-15)

イミディエートオフセット、プレインデクスイミディエートオフセット、またはポストインデクスイミディエートオフセットを使ったロードとストア。

• 「LDR と STR (レジスタオフセット)」 (ページ 3-18)

レジスタオフセット、プレインデクスレジスタオフセット、またはポストインデクスレジスタオフセットを使ったロードとストア。

• 「LDR と STR(非特権モード)」 (ページ 3-21)

ユーザモードでのロードとストア。

• 「LDR(PC 相対)」 (ページ 3-23)

レジスタロード命令です。アドレスは、PC からのオフセットです。

• 「LDR(レジスタ相対)」 (ページ 3-26)

レジスタロード命令です。アドレスはベースレジスタからのオフセットです。

• 「ADR(PC 相対)」 (ページ 3-29)

PC 相対アドレスのロード命令です。

• 「ADR(レジスタ相対)」 (ページ 3-31)

レジスタ相対アドレスのロード命令です。

• 「PLD、PLDW、PLI」 (ページ 3-33)

アドレスのプリロードを実行する命令です。

• 「LDM、STM」 (ページ 3-35)

多重レジスタロード / ストア命令です。

• 「PUSH および POP」 (ページ 3-38)

Lo レジスタと LR(オプション)をスタックにプッシュする命令です。

Lo レジスタと PC(オプション)をスタックからポップする命令です。

• 「RFE」 (ページ 3-41)

例外から復帰する命令です。

• 「SRS」 (ページ 3-43)

復帰状態をストアする命令です。

• 「LDREX と STREX」 (ページ 3-45)

排他的レジスタロード / ストア命令です。

• 「CLREX」 (ページ 3-48)

排他をクリアする命令です。

• 「SWP と SWPB」 (ページ 3-49)

レジスタとメモリ間のデータスワップ命令です。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-13ID 011811 Non-Confidential

Page 48: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

注 LDR 疑似命令もあります。この疑似命令をアセンブルすることによって、LDR 命令、

MOV 命令、または MVN 命令が生成されます。

関連項目

概念:

『アセンブラの使用』:

• 「メモリアクセス」 (ページ 5-30)

リファレンス:

• 「LDR 疑似命令」 (ページ 3-169)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-14ID 011811 Non-Confidential

Page 49: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.1 LDR と STR (イミディエートオフセット)

イミディエートオフセット、プレインデクスイミディエートオフセット、またはポストインデクスイミディエートオフセットを使ったロードとストア。

構文

op{type}{cond} Rt, [Rn {, #offset}] ; イ ミ デ ィ エー ト オ フ セ ッ ト

op{type}{cond} Rt, [Rn, #offset]!; プ レ イ ンデ ク ス

op{type}{cond} Rt, [Rn], #offset ; ポス ト イ ンデ ク ス

opD{cond} Rt, Rt2, [Rn {, #offset}] ; イ ミ デ ィ エー ト オ フ セ ッ ト、 ダ ブルワー ド

opD{cond} Rt, Rt2, [Rn, #offset]!; プ レ イ ンデ ク ス、 ダ ブルワー ド

opD{cond} Rt, Rt2, [Rn], #offset ; ポス ト イ ンデ ク ス、 ダ ブルワー ド

各パラメータには以下の意味があります。

op 次のいずれかを指定できます。

LDR レジスタロード

STR レジスタストア

type 次のいずれかを指定できます。

B 符号なしバイト(ロード時に 32 ビットにゼロ拡張)

SB 符号付きバイト(LDR のみ。32 ビットに符号拡張)

H 符号なしハーフワード(ロード時に 32 ビットにゼロ拡張)

SH 符号付きハーフワード(LDR のみ。32 ビットに符号拡張)

- 省略(ワード)

cond 任意の条件コードを指定します。

Rt ロードまたはストアするレジスタを指定します。

Rn メモリアドレスのベースとなるレジスタを指定します。

offset オフセットを指定します。offset が省略されると、アドレスは Rn の内容

となります。

Rt2 ダブルワードのロード / ストアで使用する追加のレジスタを指定しま

す。

命令セットやアーキテクチャによっては、一部のオプションを使用できない場合があります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-15ID 011811 Non-Confidential

Page 50: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

オフセットの範囲とアーキテクチャ

表 3-2 はオフセットの範囲とこれらの命令の使用可否を示します。

レジスタの制約条件

プレインデクスおよびポストインデクス形式では、Rn は Rt とは異なる必要がありま

す。

表 3-2 オフセットとアーキテクチャ、LDR/STR、ワード、ハーフワード、バイト

命令イミディエートオフセット

プレインデクスポストインデクス

アーキテクチャ

ARM、ワードまたはバイト a –4095 ~ 4095 –4095 ~ 4095 –4095 ~ 4095 すべて

ARM、符号付きバイト、ハーフ

ワード、符号付きハーフワード

–255 ~ 255 –255 ~ 255 –255 ~ 255 すべて

ARM、ダブルワード –255 ~ 255 –255 ~ 255 –255 ~ 255 v5TE +

32 ビット Thumb、ワード、ハーフ

ワード、符号付きハーフワード、バイト、符号付きバイト a

–255 ~ 4095 –255 ~ 255 –255 ~ 255 v6T2、v7

32 ビット Thumb、ダブルワード –1020 ~ 1020 c –1020 ~ 1020 c –1020 ~ 1020 c v6T2、v7

16 ビット Thumb、ワード b 0 ~ 124 c 該当なし 該当なし すべての T

16 ビット Thumb、符号なしハーフ

ワード b0 ~ 62 d 該当なし 該当なし すべて

の T

16 ビット Thumb、符号なしバイト b

0 ~ 31 該当なし 該当なし すべての T

16 ビット Thumb、ワード、Rn は SP e

0 ~ 1020 c 該当なし 該当なし すべての T

16 ビット ThumbEE、ワード b –28 ~ 124 c 該当なし 該当なし T-2EE

16 ビット ThumbEE、ワード、Rn は R9 e

0 ~ 252 c 該当なし 該当なし T-2EE

16 ビット ThumbEE、ワード、Rn は R10 e

0 ~ 124 c 該当なし 該当なし T-2EE

a. ワードのロードでは Rt に PC(プログラムカウンタ)を指定できます。PC へのロードを実行すると、ロードさ

れたアドレスにある命令への分岐が発生します。ARMv4 では、ロードされたアドレスのビット [1:0] は 0b00 になっている必要があります。ARMv5T 以降のバージョンでは、ビット [1:0] が 0b10 であってはなりません。ビッ

ト [0] が 1 になっている場合、Thumb 状態で実行が継続されます。それ以外の場合は、ARM 状態で継続されま

す。

b. Rt と Rn には R0 ~ R7 の範囲のレジスタを指定する必要があります。

c. 4 の倍数

d. 必ず 2 の倍数

e. Rt には R0 ~ R7 の範囲のレジスタを指定する必要があります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-16ID 011811 Non-Confidential

Page 51: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

ダブルワードレジスタの制約条件

プレインデクスおよびポストインデクス形式では、Rn は Rt2 とは異なる必要がありま

す。

Thumb 命令の場合、Rt または Rt2 に SP または PC は指定できません。

ARM 命令には、以下の制約条件が適用されます。

• Rt には偶数番号のレジスタを指定する必要があります。

• Rt に LR は指定できません。

• R12 を Rt に使用しないことを強く推奨します。

• Rt2 は R (t + 1) である こ と が必要です。

PC の使用

ARM 命令の場合:

• Rt での PC は LDR ワード命令で使用でき、Rn での PC は LDR 命令で使用できます。

• Rt での PC は STR ワード命令で使用でき、Rn の PC はイミディエートオフセット

構文の STR 命令(Rn にライトバックしない形式)で使用できます。ただし、こ

れらは廃止される予定です。

これらの ARM 命令では、他の PC の使用は許されません。

Thumb 命令では、Rt での PC は LDR ワード命令で使用でき、Rn での PC は LDR 命令で使

用できます。これらの Thumb 命令では、他の PC の使用は許されません。

SP の使用

SP は Rn で使用できます。

ARM では、Rt での SP をワード命令で使用できます。Rt での SP の非ワード命令での

使用は、ARM コードでは非推奨です。

Thumb では、Rt での SP はワード命令だけで使用できます。これらの命令で、Rt での SP を他の方法で使用した場合、Thumb コードでの動作は予測不可能です。

LDR r8,[r10] ; R10 のア ド レ スか ら R8 を読み取る。

LDRNE r2,[r5,#960]!; R5 のア ド レ スの 960 バイ ト上のワードか ら

; R2 を条件付きで読み取り、

; R5 を 960 バイ ト分イ ン ク リ メ ン トする。

STR r2,[r9,#consta-struc] ; consta-struc は、

; 0 ~ 4095 の範囲内の定数を求める式。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-17ID 011811 Non-Confidential

Page 52: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.2 LDR と STR (レジスタオフセット)

レジスタオフセット、プレインデクスレジスタオフセット、またはポストインデクスレジスタオフセットを使ったロードとストア。

構文

op{type}{cond} Rt, [Rn, +/-Rm {, shift}] ; レジス タ オ フ セ ッ ト

op{type}{cond} Rt, [Rn, +/-Rm {, shift}]!; プ レ イ ンデ ク ス ; ARM のみ

op{type}{cond} Rt, [Rn], +/-Rm {, shift} ; ポス ト イ ンデ ク ス ; ARM のみ

opD{cond} Rt, Rt2, [Rn, +/-Rm] ; レジス タ オ フ セ ッ ト、 ダ ブルワー ド ; ARM のみ

opD{cond} Rt, Rt2, [Rn, +/-Rm]!; プ レ イ ンデ ク ス、 ダ ブルワー ド ; ARM のみ

opD{cond} Rt, Rt2, [Rn], +/-Rm ; ポス ト イ ンデ ク ス、 ダ ブルワー ド ; ARM のみ

各パラメータには以下の意味があります。

op 次のいずれかを指定できます。

LDR レジスタロード

STR レジスタストア

type 次のいずれかを指定できます。

B 符号なしバイト(ロード時に 32 ビットにゼロ拡張)

SB 符号付きバイト(LDR のみ。32 ビットに符号拡張)

H 符号なしハーフワード(ロード時に 32 ビットにゼロ拡張)

SH 符号付きハーフワード(LDR のみ。32 ビットに符号拡張)

- 省略(ワード)

cond 任意の条件コードを指定します。

Rt ロードまたはストアするレジスタを指定します。

Rn メモリアドレスのベースとなるレジスタを指定します。

Rm オフセットとして使用される値を保持するレジスタを指定します。Rm に PC は指定できません。–Rm は Thumb コードでは使用できません。

shift 任意に指定できるシフトです。

Rt2 ダブルワードのロード / ストアで使用する追加のレジスタを指定しま

す。

命令セットやアーキテクチャによっては、一部のオプションを使用できない場合があります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-18ID 011811 Non-Confidential

Page 53: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

オフセットレジスタとシフトオプション

表 3-3 はオフセットの範囲とこれらの命令の使用可否を示します。

レジスタの制約条件

プレインデクスおよびポストインデクス形式の場合:

• Rn は Rt とは異なる必要があります。

• ARMv6 より前のアーキテクチャでは、Rn は Rm とは異なる必要があります。

ダブルワードレジスタの制約条件

ARM 命令には、以下の制約条件が適用されます。

• Rt には偶数番号のレジスタを指定する必要があります。

• Rt に LR は指定できません。

• R12 を Rt に使用しないことを強く推奨します。

• Rt2 は R (t + 1) であることが必要です。

• LDRD 命令では、Rm は Rt および Rt2 と異なる必要があります。

表 3-3 オプションとアーキテクチャ、LDR/STR (レジスタオフセット)

命令 +/–Rm a シフトアーキテクチャ

ARM、ワードまたはバイト b +/–Rm LSL #0 ~ 31

LSR #1 ~ 32

すべて

ASR #1 ~ 32

ROR #1 ~ 31

RRX

ARM、符号付きバイト、ハーフワード、符号

付きハーフワード

+/–Rm 該当なし すべて

ARM、ダブルワード +/–Rm 該当なし v5TE +

32 ビット Thumb、ワード、ハーフワード、符

号付きハーフワード、バイト、符号付きバイト b

+Rm LSL #0 ~ 3 v6T2、v7

16 ビット Thumb、ダブルワード以外のすべてc

+Rm 該当なし すべての T

16 ビット ThumbEE、ワード b +Rm LSL #2(必須) T-2EE

16 ビット ThumbEE、ハーフワード、符号付き

ハーフワード b+Rm LSL #1(必須) T-2EE

16 ビット ThumbEE、バイト、符号付きバイト b

+Rm 該当なし T-2EE

a. +/–Rm となっているところでは、–Rm、+Rm、または Rm を使用できます。+Rm となっているところでは、

–Rm を使用できません。

b. ワードのロードでは Rt に PC(プログラムカウンタ)を指定できます。PC へのロードを実行すると、ロードさ

れたアドレスにある命令への分岐が発生します。ARMv4 では、ロードされたアドレスのビット [1:0] は 0b00 になっている必要があります。ARMv5T 以降のバージョンでは、ビット [1:0] が 0b10 であってはなりません。ビッ

ト [0] が 1 になっている場合、Thumb 状態で実行が継続されます。それ以外の場合は、ARM 状態で継続されま

す。

c. Rt、Rn、Rm はいずれも R0 ~ R7 の範囲にします。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-19ID 011811 Non-Confidential

Page 54: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

• プレインデクスおよびポストインデクス形式では、Rn は Rt2 とは異なる必要が

あります。

PC の使用

ARM 命令の場合:

• Rt での PC は LDR ワード命令で使用でき、Rn での PC はレジスタオフセット構文

の LDR 命令(Rn にライトバックしない形式)で使用できます。

• Rt での PC は STR ワード命令で使用でき、Rn での PC はレジスタオフセット構文

の STR 命令(Rn にライトバックしない形式)で使用できます。ただし、これら

は廃止される予定です。

ARM 命令では、他の PC の使用は許されません。

Thumb 命令では、Rt での PC は LDR ワード命令で使用できます。これらの Thumb 命令

では、他の PC の使用は許されません。

SP の使用

SP は Rn で使用できます。

ARM では、Rt での SP をワード命令で使用できます。Rt での SP の非ワード命令での

使用は、ARM コードでは非推奨です。

Thumb では、Rt での SP はワード命令だけで使用できます。これらの命令で、Rt での SP を他の方法で使用した場合、Thumb コードでの動作は予測不可能です。

Rm での SP の使用は、Thumb 状態では結果が予測不可能であり、ARM 状態では非推

奨です。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-20ID 011811 Non-Confidential

Page 55: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.3 LDR と STR(非特権モード)

バイト、ハーフワード、またはワードを非特権モードでロードおよびストアします。

これらの命令が特権モードのソフトウェアで実行されると、非特権モードのソフトウェアで実行されたときと同じ制約条件でメモリにアクセスします。

これらの命令は、非特権モードのソフトウェアで実行されたとき、対応するロードまたはストア命令とまったく同様に動作します。例えば、LDRSBT は LDRSB と同様に動

作します。

構文

op{type}T{cond} Rt, [Rn {, #offset}] ; イ ミ デ ィ エー ト オ フ セ ッ ト (Thumb-2 のみ)

op{type}T{cond} Rt, [Rn] {, #offset} ; ポス ト イ ンデ ク ス (ARM のみ)

op{type}T{cond} Rt, [Rn], +/-Rm {, shift} ; ポス ト イ ンデ ク ス (レジス タ) (ARM のみ)

各パラメータには以下の意味があります。

op 次のいずれかを指定できます。

LDR レジスタロード

STR レジスタストア

type 次のいずれかを指定できます。

B 符号なしバイト(ロード時に 32 ビットにゼロ拡張)

SB 符号付きバイト(LDR のみ。32 ビットに符号拡張)

H 符号なしハーフワード(ロード時に 32 ビットにゼロ拡張)

SH 符号付きハーフワード(LDR のみ。32 ビットに符号拡張)

- 省略(ワード)

cond 任意の条件コードを指定します。

Rt ロードまたはストアするレジスタを指定します。

Rn メモリアドレスのベースとなるレジスタを指定します。

offset オフセットを指定します。オフセットを指定しなかった場合、アドレス

は Rn 内の値になります。

Rm オフセットとして使用される値を保持するレジスタを指定します。Rm に PC は指定できません。

shift 任意に指定できるシフトです。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-21ID 011811 Non-Confidential

Page 56: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

オフセットの範囲とアーキテクチャ

表 3-2 (ページ 3-16) はオフセットの範囲とこれらの命令の使用可否を示します。

表 3-4 オフセットとアーキテクチャ、LDR/STR (ユーザモード)

命令イミディエートオフセット

ポストインデクス

+/–Rm a シフトアーキテクチャ

ARM、ワード、バイト 該当なし –4095 ~ 4095 +/–Rm LSL #0 ~ 31

すべて

LSR #1 ~ 32

ASR #1 ~ 32

ROR #1 ~ 31

RRX

ARM、符号付きバイト、ハーフ

ワード、符号付きハーフワード

該当なし –255 ~ 255 +/–Rm 該当なし v6T2、v7

32 ビット Thumb、ワード、ハー

フワード、符号付きハーフワード、バイト、符号付きバイト

0 ~ 255 該当なし 該当なし v6T2、v7

a. –Rm、+Rm、または Rm を使用できます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-22ID 011811 Non-Confidential

Page 57: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.4 LDR(PC 相対)

レジスタロード命令です。アドレスは、PC からのオフセットです。

構文

LDR{type}{cond}{.W} Rt, label

LDRD{cond} Rt, Rt2, label ; ダ ブルワー ド

各パラメータには以下の意味があります。

type 次のいずれかを指定できます。

B 符号なしバイト(ロード時に 32 ビットにゼロ拡張)

SB 符号付きバイト(LDR のみ。32 ビットに符号拡張)

H 符号なしハーフワード(ロード時に 32 ビットにゼロ拡張)

SH 符号付きハーフワード(LDR のみ。32 ビットに符号拡張)

- 省略(ワード)

cond 任意の条件コードを指定します。

.W 任意に指定できる幅指定子を指定します。

Rt ロードまたはストアするレジスタを指定します。

Rt2 2 番目にロードまたはストアするレジスタを指定します。

label PC 相対式を指定します。

label は現在の命令から限定された距離にある必要があります。

注 同等の構文が ARM コードの STR 命令で利用できますが、それらは非推奨です。

オフセットの範囲とアーキテクチャ

アセンブラは、PC からオフセットを算出します。label が範囲外である場合、アセン

ブラはエラーを生成します。

表 3-5 はラベルと現在の命令との間の可能なオフセットを示します。

表 3-5 PC 相対オフセット

命令オフセット範囲

アーキテクチャ

ARM LDR、LDRB、LDRSB、LDRH、LDRSH a +/– 4095 すべて

ARM LDRD +/– 255 v5TE +

32 ビット Thumb LDR、LDRB、LDRSB、LDRH、LDRSH a

+/– 4095 v6T2、v7

32 ビット Thumb LDRD +/– 1020 b v6T2、v7

16 ビット Thumb LDR c 0-1020 b すべての T

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-23ID 011811 Non-Confidential

Page 58: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

注 ARMv7-M では、LDRD(PC 相対)命令はワード境界で整列されているアドレス上にあ

る必要があります。

Thumb-2 での LDR(PC 相対)

.W 幅指定子を指定して、LDR で Thumb-2 コードの 32 ビット命令を生成できます。

LDR.W を指定した場合は、16 ビット LDR を使用してターゲットに到達できる場合でも、

常に 32 ビット命令が生成されます。

参考として、32 ビット Thumb-2 LDR 命令を使用して到達できるターゲットで失敗が発

生する場合でも、.W 指定なしの LDR は常に 16 ビット Thumb コードの命令を生成しま

す。

ダブルワードレジスタの制約条件

Thumb-2 命令の場合、Rt または Rt2 に SP または PC は指定できません。

ARM 命令には、以下の制約条件が適用されます。

• Rt には偶数番号のレジスタを指定する必要があります。

• Rt に LR は指定できません。

• R12 を Rt に使用しないことを強く推奨します。

• Rt2 は R (t + 1) である こ と が必要です。

SP の使用

ARM では、Rt での SP を LDR ワード命令で使用できます。Rt での SP の LDR 非ワード命

令での使用は、ARM コードでは非推奨です。

Thumb では、Rt での SP は LDR ワード命令だけで使用できます。これらの命令での、

他のすべての SP の使用は、Thumb コードでは結果が予測不可能です。

関連項目

概念:

『アセンブラの使用』:

• 「レジスタ相対式と PC 相対式」 (ページ 8-7)

リファレンス:

• 「疑似命令」 (ページ 3-163)

• 「Thumb-2 での LDR(PC 相対)」

a. ワードのロードでは Rt に PC(プログラムカウンタ)を指定できます。PC へのロー

ドを実行すると、ロードされたアドレスにある命令への分岐が発生します。

ARMv4 では、ロードされたアドレスのビット [1:0] は 0b00 になっている必要があり

ます。ARMv5T 以降のバージョンでは、ビット [1:0] が 0b10 であってはなりませ

ん。ビット [0] が 1 になっている場合、Thumb 状態で実行が継続されます。それ以

外の場合は、ARM 状態で継続されます。

b. 4 の倍数で指定して下さい。

c. Rt には R0 ~ R7 の範囲のレジスタを指定する必要があります。バイト、ハーフワー

ド、ダブルワードの 16 ビット命令はありません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-24ID 011811 Non-Confidential

Page 59: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-25ID 011811 Non-Confidential

Page 60: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.5 LDR(レジスタ相対)

レジスタロード命令です。アドレスはベースレジスタからのオフセットです。

構文

LDR{type}{cond}{.W} Rt, label

LDRD{cond} Rt, Rt2, label ; ダ ブルワー ド

各パラメータには以下の意味があります。

type 次のいずれかを指定できます。

B 符号なしバイト(ロード時に 32 ビットにゼロ拡張)

SB 符号付きバイト(LDR のみ。32 ビットに符号拡張)

H 符号なしハーフワード(ロード時に 32 ビットにゼロ拡張)

SH 符号付きハーフワード(LDR のみ。32 ビットに符号拡張)

- 省略(ワード)

cond 任意の条件コードを指定します。

.W 任意に指定できる幅指定子を指定します。

Rt ロードまたはストアするレジスタを指定します。

Rt2 2 番目にロードまたはストアするレジスタを指定します。

label FIELD ディレクティブで定義されるシンボルを指定します。label は、

MAP ディレクティブを使用して定義されるベースレジスタからのオフ

セットを指定します。

label は、ベースレジスタ内の値から限定された距離にある必要があり

ます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-26ID 011811 Non-Confidential

Page 61: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

オフセットの範囲とアーキテクチャ

アセンブラは、ベースレジスタからオフセットを算出します。label が範囲外である

場合、アセンブラはエラーを生成します。

表 3-5 (ページ 3-23) はラベルと現在の命令との間の可能なオフセットを示します。

Thumb-2 での LDR(レジスタ相対)

.W 幅指定子を指定して、LDR で Thumb-2 コードの 32 ビット命令を生成できます。

LDR.W を指定した場合は、16 ビット LDR を使用してターゲットに到達できる場合でも、

常に 32 ビット命令が生成されます。

参考として、32 ビット Thumb-2 LDR 命令を使用して到達できるターゲットで失敗が発

生する場合でも、.W 指定なしの LDR は常に 16 ビット Thumb コードの命令を生成しま

す。

表 3-6 レジスタ相対オフセット

命令オフセット範囲

アーキテクチャ

ARM LDR、LDRBa

a. ワードのロードでは Rt に PC(プログラムカウンタ)を指定できます。PC へのロー

ドを実行すると、ロードされたアドレスにある命令への分岐が発生します。

ARMv4 では、ロードされたアドレスのビット [1:0] は 0b00 になっている必要があり

ます。ARMv5T 以降のバージョンでは、ビット [1:0] が 0b10 であってはなりませ

ん。ビット [0] が 1 になっている場合、Thumb 状態で実行が継続されます。それ以

外の場合は、ARM 状態で継続されます。

+/– 4095 すべて

ARM LDRSB、LDRH、LDRSH +/– 255 すべて

ARM LDRD +/– 255 v5TE +

32 ビット Thumb LDR、LDRB、LDRSB、LDRH、LDRSH a

–255 ~ 4095 v6T2、v7

32 ビット Thumb LDRD +/– 1020 b

b. 4 の倍数で指定して下さい。

v6T2、v7

16 ビット Thumb LDR c

c. Rt およびベースレジスタは R0 ~ R7 の範囲内にある必要があります。

0 ~ 124 b すべての T

16 ビット Thumb LDRH c 0 ~ 62 d

d. 2 の倍数で指定して下さい。

すべての T

16 ビット Thumb LDRB c 0 ~ 31 すべての T

16 ビット Thumb LDR、ベースレジスタは SPe

e. Rt には R0 ~ R7 の範囲のレジスタを指定する必要があります。

0 ~ 1020 b すべての T

16 ビット ThumbEE LDR c –28 ~ 124 b T-2EE

16 ビット Thumb LDR、ベースレジスタは R9 e 0 ~ 252 b T-2EE

16 ビット ThumbEE LDR、ベースレジスタは R10 e

0 ~ 124 b T-2EE

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-27ID 011811 Non-Confidential

Page 62: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

ダブルワードレジスタの制約条件

Thumb-2 命令の場合、Rt または Rt2 に SP または PC は指定できません。

ARM 命令には、以下の制約条件が適用されます。

• Rt には偶数番号のレジスタを指定する必要があります。

• Rt に LR は指定できません。

• R12 を Rt に使用しないことを強く推奨します。

• Rt2 は R (t + 1) である こ と が必要です。

PC の使用

Rt での PC をワード命令で使用できます。これらの命令では、他の PC の使用は許さ

れません。

SP の使用

ARM では、Rt での SP をワード命令で使用できます。Rt での SP の非ワード命令での

使用は、ARM コードでは非推奨です。

Thumb では、Rt での SP はワード命令だけで使用できます。これらの命令で、Rt での SP を他の方法で使用した場合、Thumb コードでの動作は予測不可能です。

関連項目

概念

『アセンブラの使用』:

• 「レジスタ相対式と PC 相対式」 (ページ 8-7)

リファレンス:

• 「疑似命令」 (ページ 3-163)

• 「Thumb-2 での LDR(レジスタ相対)」 (ページ 3-27)

• 「FIELD」 (ページ 6-21)

• 「MAP」 (ページ 6-20)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-28ID 011811 Non-Confidential

Page 63: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.6 ADR(PC 相対)

ADR は、デスティネーションレジスタに PC 相対アドレスを生成します(ラベルは現

在の領域)。

構文

ADR{cond}{.W} Rd,label

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

.W 任意に指定できる幅指定子を指定します。

Rd ロードするデスティネーションレジスタを指定します。

label PC 相対式を指定します。

label は現在の命令から限定された距離にある必要があります。

使用法

ADR は、位置非依存コードを生成します。アセンブラにより、PC に対して値を加算

または減算する命令が生成されるためです。

より広範囲の有効なアドレスをアセンブルするには、ADRL 疑似命令を使用します。

label は、ADR 命令と同じアセンブラ領域内のアドレスに評価される必要があります。

BX または BLX 命令のターゲットを生成するために ADR を使用するときは、ターゲット

に Thumb 命令が含まれている場合、そのアドレスの Thumb ビット(ビット 0)を設

定する必要があります。

オフセットの範囲とアーキテクチャ

アセンブラは、PC からオフセットを算出します。label が範囲外である場合、アセン

ブラはエラーを生成します。

表 3-5 (ページ 3-23) はラベルと現在の命令との間の可能なオフセットを示します。

表 3-7 PC 相対オフセット

命令 オフセット範囲 アーキテクチャ

ARM ADR 詳細については、「「定数としての Operand2」 (ページ 3-51)」を参照して下

さい。

すべて

32 ビット Thumb ADR

+/– 4095 v6T2、v7

16 ビット Thumb ADR a

a. Rd には R0 ~ R7 の範囲のレジスタを指定する必要があります。

0-1020 b

b. 4 の倍数で指定して下さい。

すべての T

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-29ID 011811 Non-Confidential

Page 64: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

Thumb-2 の ADR

.W 幅指定子を指定して、ADR で Thumb-2 コードの 32 ビット命令を生成できます。.W と共に ADR を指定した場合は、16 ビット命令でアドレスを生成できる場合でも、常に 32 ビット命令が生成されます。

参考として、32 ビット Thumb-2 ADD 命令を使用して生成できるアドレスで失敗が発生

する場合でも、.W 指定なしの ADR は常に 16 ビット Thumb コードの命令を生成します。

制限

Thumb コードでは、Rd を PC または SP にすることはできません。

ARM コードでは、Rd を PC または SP にすることができますが、SP の使用は非推奨で

す。

関連項目

概念

『アセンブラの使用』:

• 「レジスタ相対式と PC 相対式」 (ページ 8-7)

リファレンス:

• 「ADRL 疑似命令」 (ページ 3-164)

• 「AREA」 (ページ 6-71)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-30ID 011811 Non-Confidential

Page 65: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.7 ADR(レジスタ相対)

ADR は、デスティネーションレジスタにレジスタ相対アドレスを生成します(ラベル

は記憶域マップに定義)。

構文

ADR{cond}{.W} Rd,label

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

.W 任意に指定できる幅指定子を指定します。

Rd ロードするデスティネーションレジスタを指定します。

label FIELD ディレクティブで定義されるシンボルを指定します。label は、

MAP ディレクティブを使用して定義されるベースレジスタからのオフ

セットを指定します。

label は、ベースレジスタから限定された距離にある必要があります。

使用法

ADR は、記憶域マップ内の名前付きフィールドに簡単にアクセスするためのコードを

生成します。

より広範囲の有効なアドレスをアセンブルするには、ADRL 疑似命令を使用します。

制限

Thumb コード:

• Rd を PC にすることはできません。

• Rd を SP にできるのは、ベースレジスタが SP の場合のみです。

オフセットの範囲とアーキテクチャ

アセンブラは、ベースレジスタからオフセットを算出します。label が範囲外である

場合、アセンブラはエラーを生成します。

表 3-5 (ページ 3-23) はラベルと現在の命令との間の可能なオフセットを示します。

表 3-8 レジスタ相対オフセット

命令 オフセット範囲 アーキテクチャ

ARM ADR 詳細については、「「定数としての Operand2」 (ページ 3-51)」を参照して下

さい。

すべて

32 ビット Thumb ADR

+/– 4095 v6T2、v7

16 ビット Thumb ADR、ベースレジス

タは SP a

0-1020 b すべての T

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-31ID 011811 Non-Confidential

Page 66: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

Thumb-2 の ADR

.W 幅指定子を指定して、ADR で Thumb-2 コードの 32 ビット命令を生成できます。.W と共に ADR を指定した場合は、16 ビット命令でアドレスを生成できる場合でも、常に 32 ビット命令が生成されます。

参考として、32 ビット Thumb-2 ADD 命令を使用して生成できるアドレスで失敗が発生

する場合でも、.W 指定なしの ADR(ベースレジスタは SP)は常に 16 ビット Thumb コードの命令を生成します。

関連項目

概念

『アセンブラの使用』:

• 「レジスタ相対式と PC 相対式」 (ページ 8-7)

リファレンス:

• 「MAP」 (ページ 6-20)

• 「FIELD」 (ページ 6-21)

• 「ADRL 疑似命令」 (ページ 3-164)

• 「条件コード」 (ページ 3-173)

a. Rd に指定するレジスタは、R0 ~ R7 の範囲にあるか、SP である必要があります。

Rd が SP の場合、オフセット範囲は –508 ~ 508 です。4 の倍数で指定して下さい。

b. 4 の倍数で指定して下さい。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-32ID 011811 Non-Confidential

Page 67: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.8 PLD、PLDW、PLI

データと命令をプリロードする命令です。プロセッサは、アドレスからデータまたは命令のロードが実行されることをメモリシステムに事前に通知することができます。

構文

PLtype{cond} [Rn {, #offset}]

PLtype{cond} [Rn, +/-Rm {, shift}]

PLtype{cond} label

各パラメータには以下の意味があります。

type 以下のいずれかになります。

D データアドレス

DW 書き込むためのデータアドレス

I 命令アドレス

構文で label が指定されている場合は、type を DW にすることはできませ

ん。

cond 任意の条件コードを指定します。

注 cond を指定できるのは、Thumb-2 コードで、前に IT 命令を使用した場合

のみです。この命令は、ARM では無条件命令なので、cond を使用しな

いで下さい。

Rn メモリアドレスのベースとなるレジスタを指定します。

offset イミディエートオフセットを指定します。オフセットを指定しなかった

場合、アドレスは Rn 内の値になります。

Rm オフセットとして使用される値を保持するレジスタを指定します。

shift 任意に指定できるシフトです。

label PC 相対式を指定します。

オフセットの範囲

このオフセットは、プリロードが発生する前に Rn の値に適用されます。その結果は、

プリロード用のメモリアドレスとして使用されます。使用できるオフセットの範囲を以下に示します。

• ARM 命令:–4095 ~ +4095• Thumb-2 命令:–255 ~ +4095(Rn が PC でない場合)

• Thumb-2 命令:–4095 ~ +4095(Rn が PC である場合)

アセンブラは、PC からオフセットを算出します。label が範囲外である場合、アセン

ブラはエラーを生成します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-33ID 011811 Non-Confidential

Page 68: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

レジスタオフセットまたはシフトレジスタオフセット

ARM では、Rm の値は Rn の値に対して加算または減算されます。Thumb-2 では、Rm の値は Rn の値に加算できますが、減算はできません。この結果は、プリロード用のメ

モリアドレスとして使用されます。

可能なシフトの範囲を以下に示します。

• Thumb-2 命令:LSL #0 ~ #3

• ARM 命令:以下のいずれかの範囲

— LSL #0 ~ #31— LSR #1 ~ #32— ASR #1 ~ #32— ROR #1 ~ #31— RRX

プリロード用のアドレス境界調整

プリロード命令では、境界調整チェックは実行されません。

レジスタの制約条件

Rm に PC は指定できません。Thumb 命令の場合、Rm には SP も指定できません。

以下の構文の Thumb 命令では、Rn に PC を指定できません。

PLtype{cond} [Rn, +/-Rm{, #shift}]

アーキテクチャ

ARM PLD は ARMv5TE 以降で使用できます。

32 ビット Thumb PLD は ARMv6T2 以降で使用できます。

PLDW を使用できるのは、マルチプロセス拡張を実装した ARMv7 以降だけです。

PLI を使用できるのは ARMv7 以降だけです。

16 ビットの Thumb PLD、PLDW、および PLI 命令はありません。

これらはヒント命令であり、その実装はオプションです。実装されていない場合、NOP として実行されます。

関連項目

概念

『アセンブラの使用』:

• 「レジスタ相対式と PC 相対式」 (ページ 8-7)

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-34ID 011811 Non-Confidential

Page 69: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.9 LDM、STM

多重レジスタロード / ストア命令です。ARM 状態ではレジスタ R0 ~ R15(PC)の

任意の組み合わせを転送できますが、Thumb 状態では制限がいくつかあります。

構文

op{addr_mode}{cond} Rn{!}, reglist{^}

各パラメータには以下の意味があります。

op 次のいずれかを指定できます。

LDM 複数のレジスタをロードします。

STM 複数のレジスタをストアします。

addr_mode 以下のいずれかを指定します。

IA 転送単位でアドレスをポストインクリメントします。これは

デフォルト値なので、省略できます。

IB 転送単位でアドレスをプレインクリメントします(ARM のみ)。

DA 転送単位でアドレスをポストデクリメントします(ARM のみ)。

DB 転送単位でアドレスをプレデクリメントします。

スタックを実装するときなどに、スタック指向のアドレッシングモード接尾文字を使用することもできます。

cond 任意の条件コードを指定します。

Rn ベースレジスタです。つまり、転送に使用する初期アドレスが保持され

る ARM レジスタです。Rn に PC は指定できません。

! 任意に指定できる接尾文字です。! を指定すると、 終アドレスが Rn にライトバックされます。

reglist ロードまたはストアするレジスタのリストを中括弧で囲んで指定しま

す。レジスタ範囲も指定できます。複数のレジスタまたはレジスタ範囲を指定する場合は、コンマで区切る必要があります。

^ 任意に指定できる接尾文字です。ARM 状態でのみ使用できます。ユー

ザモードやシステムモードでは使用できません。この接尾文字には以下の目的があります。

• 命令に(任意のアドレッシングモードで)LDM を指定し、reglist に PC(R15)が含まれている場合、通常の多重レジスタ転送が行わ

れるだけでなく、SPSR が CPSR にコピーされます。これは、例外ハ

ンドラからの復帰に必要です。したがって、この接尾文字は必ず例外モードから使用して下さい。

• 例外モードで使用されない場合には、現在のモードのレジスタではなく、ユーザモードのレジスタとの間でデータ転送が実行されます。

32 ビット Thumb 命令の reglist に関する制約条件

32 ビット Thumb 命令では、以下の制約条件が適用されます。

• SP をリストに含めることはできません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-35ID 011811 Non-Confidential

Page 70: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

• STM 命令では、PC をリストに含めることはできません。

• LDM 命令では、PC と LR を両方ともリストに含めることはできません。

• リストには複数のレジスタを指定する必要があります。

reglist にレジスタが 1 つしか指定されていない STM または LDM 命令を記述した場合は、

自動的に同等の STR または LDR 命令に書き換えられます。逆アセンブルリストとソー

スコードを比較する場合は、この点に注意して下さい。

アセンブラの --diag_warning 1645 コマンドラインオプションを使用して、いつ命令置

換が発生したかを確認できます。

ARM 命令の reglist に関する制約条件

ARM ストア命令は、reglist に SP および PC を持つことができますが、reglist に SP または PC を含む命令は非推奨です。

ARM ロード命令は、reglist に SP および PC を持つことができますが、reglist に SP を含むか、reglist に PC と LR の両方を含む命令は非推奨です。

16 ビット命令

これらの命令のサブセットの 16 ビットバージョンは、Thumb コードで使用できま

す。

16 ビット命令には、以下の制約条件が適用されます。

• reglist に指定するレジスタはすべて Lo レジスタである必要があります。

• Rn は Lo レジスタである必要があります。

• addr_mode は省略する(または IA を指定する)必要があります。つまり、転送単

位でアドレスをポストインクリメントする必要があります。

• STM 命令に対してライトバックを指定する必要があります。

• Rn が reglist にない場合、LDM 命令に対してライトバックを指定する必要があり

ます。

注 Rn を reglist 内の 下位レジスタとして指定する、ライトバックが使用される 16 ビッ

ト Thumb STM 命令の使用は非推奨です。

また、PUSH および POP 命令は STM および LDM 命令のサブセットなので、STM および LDM 命令を使用して表現できます。PUSH と POP の一部の形式は、16 ビット命令でもありま

す。

注 これらの 16 ビット命令は、Thumb-2EE では使用できません。

PC へのロード

PC(プログラムカウンタ)へのロードを実行すると、ロードされたアドレスにある

命令への分岐が発生します。

ARMv4 では、ロードされたアドレスのビット [1:0] は 0b00 になっている必要があり

ます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-36ID 011811 Non-Confidential

Page 71: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

ARMv5T 以降には以下のような特徴があります。

• ビット [1:0] は 0b10 にできません。

• ビット [0] が 1 なら、Thumb 状態で実行が継続します。

• ビット [0] が 0 なら、ARM 状態で実行が継続します。

ベースレジスタのロードまたはストアとライトバックの使用

ARM または 16 ビット Thumb 命令では、Rn が reglist に含まれていて、ライトバック

が ! 接尾文字で指定されていると、以下のようになります。

• 命令に STM または STMIA が指定され、Rn が reglist 内で も番号の小さいレジス

タである場合は、Rn の初期値がストアされます。

• 上記以外の場合は、ロードまたはストアされる Rn の値を信頼できません。

Rn が reglist に含まれていて、ライトバックが ! 接尾文字で指定されている場合、32 ビット Thumb 命令は予測不可能です。

LDM r8,{r0,r2,r9} ; LDMIA は LDM と同じ意味 STMDB r1!,{r3-r6,r11,r12}

誤用例

STM r5!,{r5,r4,r9} ; R5 にス ト ア される値は予測不可能

LDMDA r2, {} ; リ ス ト に少な く と も 1 つのレジス タ が必要

関連項目

概念

『アセンブラの使用』:

• 「LDM および STM を使用したスタックの実装」 (ページ 5-25)

リファレンス:

• 「PUSH および POP」 (ページ 3-38)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-37ID 011811 Non-Confidential

Page 72: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.10 PUSH および POP

完全降順スタックに対してレジスタのプッシュとポップを実行します。

構文

PUSH{cond} reglist

POP{cond} reglist

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

reglist レジスタの非空リストで、中括弧で囲まれます。レジスタ範囲も中に含

まれます。複数のレジスタまたはレジスタ範囲を指定する場合は、コンマで区切る必要があります。

使用法

PUSH は STMDB sp!, reglist と同じ意味です。また、POP は LDMIA sp! reglist と同じ意味

です。このような場合は、PUSH および POP ニーモニックを使用するのが適切です。

注 LDM および LDMFD は LDMIA と同じ意味です。STMFD は STMDB と同じ意味です。

レジスタは、番号順にスタックにストアされます。 も小さな番号のレジスタが下位アドレスにストアされます。

reglist に PC を含む POP

この命令は、スタックから PC にポップされたアドレスへの分岐を発生させます。一

般的には、サブルーチンからの復帰に使用します。サブルーチンでは LR がサブルー

チン開始位置でスタックにプッシュされます。

ARMv5T 以降には以下のような特徴があります。

• ビット [1:0] は 0b10 にできません。

• ビット [0] が 1 なら、Thumb 状態で実行が継続します。

• ビット [0] が 0 なら、ARM 状態で実行が継続します。

ARMv4 では、ロードされたアドレスのビット [1:0] は 0b00 になっている必要があり

ます。

Thumb 命令

これらの命令のサブセットは、Thumb 命令セットで使用できます。

16 ビット命令には、以下の制約条件が適用されます。

• PUSH の場合、reglist が格納できるのは、Lo レジスタと LR だけです。

• POP の場合、reglist が格納できるのは、Lo レジスタと PC だけです。

32 ビット命令には、以下の制約条件が適用されます。

• reglist に SP を格納できません。

• PUSH の場合、reglist に PC を格納できません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-38ID 011811 Non-Confidential

Page 73: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

• POP の場合、reglist に LR と PC のいずれかを格納できますが、両方は格納でき

ません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-39ID 011811 Non-Confidential

Page 74: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

ARM 命令の reglist に関する制約条件

ARM プッシュ命令は、reglist に SP および PC を持つことができますが、reglist に SP または PC を含む命令は非推奨です。

ARM ポップ命令は、reglist に SP および PC を持つことができますが、reglist に SP を含むか、reglist に PC と LR の両方を含む命令は非推奨です。

PUSH {r0,r4-r7} PUSH {r2,lr} POP {r0,r10,pc} ; 16 ビ ッ ト バージ ョ ンは使用できない

関連項目

リファレンス:

• 「LDM、STM」 (ページ 3-35)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-40ID 011811 Non-Confidential

Page 75: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.11 RFE

例外から復帰する命令です。

構文

RFE{addr_mode}{cond} Rn{!}

各パラメータには以下の意味があります。

addr_mode 以下のいずれかを指定します。

IA 転送単位でアドレスをポストインクリメントします(フル下

降スタック)。

IB 転送単位でアドレスをプレインクリメントします(ARM のみ)。

DA 転送単位でアドレスをポストデクリメントします(ARM のみ)。

DB 転送単位でアドレスをプレデクリメントします。

addr_mode を省略すると、デフォルトで IA(ポストインクリメント)が

使用されます。

cond 任意の条件コードを指定します。

注 cond を指定できるのは、Thumb コードで、前に IT 命令を使用した場合

のみです。この命令は、ARM では無条件命令です。

Rn ベースレジスタを指定します。Rn に PC は指定できません。

! 任意に指定できる接尾文字です。! を指定すると、 終アドレスが Rn にライトバックされます。

使用法

SRS 命令を使用して復帰状態を保存した場合は、RFE を使用して例外から復帰できま

す。Rn は通常は SP であり、復帰状態情報は保存されます。

演算

Rn に保持されているアドレスと、その次のアドレスから、PC と CPSR をロードしま

す。また、必要に応じて Rn を更新できます。

注釈

RFE は、アドレスを PC に書き込みます。例外復帰後に使用される命令セットに合わ

せて、このアドレスの境界整列を調整する必要があります。

• ARM 命令セットに復帰するには、PC に書き込むアドレスをワード境界で整列

する必要があります。

• Thumb 命令セットに復帰するには、PC に書き込むアドレスをハーフワード境

界で整列する必要があります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-41ID 011811 Non-Confidential

Page 76: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

• Jazelle® 命令セットに復帰する場合、PC に書き込むアドレスの境界整列につい

て、制限はありません。

上記の規則に従わなかった場合、予測不可能な結果が生じます。ただし、適切な例外開始メカニズムの後で復帰するために命令を使用する場合、ソフトウェア側に特別な予防策は必要ありません。

アドレスがワード境界で整列されていない場合、RFE は Rn の 下位 2 ビットを無視し

ます。

アーキテクチャ上では、RFE によって生成される、メモリの各ワードへのアクセスの

時間的順序が定義されていません。アクセス順序の影響を受けるメモリマップされた I/O 位置では、この命令を使用しないで下さい。

非特権モードでのソフトウェア実行時には RFE を使用しないで下さい。

Thumb-2EE. では RFE を使用しないで下さい。

アーキテクチャ

この ARM 命令は、ARMv6 以降で使用できます。

この 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ただし、ARMv7-M アーキテクチャでは使用できません。

この命令の 16 ビットバージョンはありません。

RFE sp!

関連項目

概念

『アセンブラの使用』:

• 「プロセッサモード、および特権モードと非特権モードでのソフトウェア実行」 (ページ 3-6)

リファレンス:

• 「SRS」 (ページ 3-43)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-42ID 011811 Non-Confidential

Page 77: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.12 SRS

スタックに復帰状態をストアする命令です。

構文

SRS{addr_mode}{cond} sp{!}, #modenum

SRS{addr_mode}{cond} #modenum{!} ; UAL 以前の構文

各パラメータには以下の意味があります。

addr_mode 以下のいずれかを指定します。

IA 転送単位でアドレスをポストインクリメントします。

IB 転送単位でアドレスをプレインクリメントします(ARM のみ)。

DA 転送単位でアドレスをポストデクリメントします(ARM のみ)。

DB 転送単位でアドレスをプレデクリメントします(完全降順ス

タック)。

addr_mode を省略すると、デフォルトで IA(ポストインクリメント)が

使用されます。スタックを実装するときなどに、スタック指向のアドレッシングモード接尾文字を使用することもできます。

cond 任意の条件コードを指定します。

注 cond を指定できるのは、Thumb コードで、前に IT 命令を使用した場合

のみです。この命令は、ARM では無条件命令です。

! 任意に指定できる接尾文字です。! を指定すると、modenum によって指定

されたモードの SP に 終アドレスがライトバックされます。

modenum バンク付き SP がベースレジスタとして使用されるモードの番号を指定

します。定義済みのモード番号だけを使用する必要があります。

演算

SRS は、modenum によって指定されたモードの SP が保持するアドレスとその次のワー

ドに、現在のモードの LR と SPSR をそれぞれストアします。また、modenum によって

指定されたモードの SP を必要に応じて更新できます。この命令は、一般的にスタッ

クへのアクセスに使用される STM 命令と互換性があります。

注 完全降順スタックに対しては、SRSFD または SRSDB を使用する必要があります。

使用法

SRS 命令を使用して、自動的に選択された別のスタックに、例外ハンドラの復帰状態

をストアできます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-43ID 011811 Non-Confidential

Page 78: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

注釈

アドレスがワード境界で整列されていないところでは、SRS は、指定されたアドレス

の 下位 2 ビットを無視します。

アーキテクチャ上では、SRS によって生成される、メモリの各ワードへのアクセスの

時間的順序が定義されていません。アクセス順序の影響を受けるメモリマップされた I/O 位置では、この命令を使用しないで下さい。

ユーザモードとシステムモードには SPSR がないため、SRS は使用しないで下さい。

Thumb-2EE では SRS を使用しないで下さい。

modenum で監視モードを指定した場合、SRS は非セキュア状態で予測できません。

アーキテクチャ

この ARM 命令は、ARMv6 以降で使用できます。

この 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ただし、ARMv7-M アーキテクチャでは使用できません。

この命令の 16 ビットバージョンはありません。

R13_usr EQU 16 SRSFD sp,#R13_usr

関連項目

概念

『アセンブラの使用』:

• 「LDM および STM を使用したスタックの実装」 (ページ 5-25)

• 「プロセッサモード、および特権モードと非特権モードでのソフトウェア実行」 (ページ 3-6)

リファレンス:

• 「LDM、STM」 (ページ 3-35)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-44ID 011811 Non-Confidential

Page 79: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.13 LDREX と STREX

排他的レジスタロード / ストア命令です。

構文

LDREX{cond} Rt, [Rn {, #offset}]

STREX{cond} Rd, Rt, [Rn {, #offset}]

LDREXB{cond} Rt, [Rn]

STREXB{cond} Rd, Rt, [Rn]

LDREXH{cond} Rt, [Rn]

STREXH{cond} Rd, Rt, [Rn]

LDREXD{cond} Rt, Rt2, [Rn]

STREXD{cond} Rd, Rt, Rt2, [Rn]

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Rd 復帰ステータスのデスティネーションレジスタを指定します。

Rt ロードまたはストアするレジスタを指定します。

Rt2 ダブルワードのロードとストアに使用する 2 番目のレジスタを指定しま

す。

Rn メモリアドレスのベースとなるレジスタを指定します。

offset Rn の値に適用される任意のオフセットを指定します。offset は Thumb-2 命令でのみ使用可能です。offset を省略した場合、オフセットは 0 とし

て処理されます。

LDREX

LDREX は、メモリからデータをロードします。

• 物理アドレスに共有 TLB 属性が設定されている場合、LDREX は、その物理アド

レスに現在のプロセッサの排他的アクセスを示すタグを付け、他の物理アドレスに対するこのプロセッサの排他的アクセスタグをクリアします。

• 共有 TLB 属性が設定されていない場合、LDREX は、実行中のプロセッサがま

だアクセスしていないタグ付きの物理アドレスがあることを示すタグを付けます。

STREX

STREX は、メモリへの条件付きストアを実行します。条件を以下に示します。

• 物理アドレスに共有 TLB 属性が設定されておらず、実行中のプロセッサによっ

てまだアクセスされていないタグ付きの物理アドレスが存在する場合は、この命令によるストアが実行され、タグがクリアされて、Rd に 0 が戻ります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-45ID 011811 Non-Confidential

Page 80: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

• 物理アドレスに共有 TLB 属性が設定されておらず、実行中のプロセッサによっ

てアクセスされていないタグ付きの物理アドレスが存在しない場合は、ストアは発生せず、Rd に 1 が戻ります。

• 物理アドレスに共有 TLB 属性が設定されており、その物理アドレスに実行中の

プロセッサによる排他的アクセスのタグが付けられている場合は、ストアが発生してタグがクリアされ、Rd に 0 が戻ります。

• 物理アドレスに共有 TLB 属性が設定されており、その物理アドレスに実行中の

プロセッサによる排他的アクセスのタグが付けられていない場合は、ストアは発生せず、Rd に 1 が戻ります。

制限

Rd、Rt、Rt2、Rn のいずれにも PC は指定できません。

STREX では、Rd に Rt、Rt2、または Rn と同じレジスタは指定できません。

ARM 命令には、以下の制約条件が適用されます。

• Rt には偶数番号のレジスタ(LR 以外)を指定する必要があります。

• Rt2 は R?t+1? であることが必要です

• offset は使用できません。

Thumb 命令の場合:

• Rd、Rt、Rt2 のいずれにも SP は指定できません。

• LDREXD では、Rt と Rt2 に同じレジスタは指定できません。

• offset には、0 ~ 1020 の範囲内にある 4 の倍数を指定できます。

使用法

LDREX 命令と STREX 命令を使用して、マルチプロセッサの共有メモリシステムでプロ

セス間通信を実装できます。

パフォーマンス上の理由から、対応する LDREX 命令と STREX 命令の間に記述する命令

の数は 小限に抑えて下さい。

注 STREX 命令で使用されるアドレスは、直前に実行された LDREX 命令で使用されたアド

レスと同一である必要があります。異なるアドレスに対して STREX 命令を実行する

と、その結果は予測不可能になります。

アーキテクチャ

ARM LDREX と STREX は ARMv6 以降で使用できます。

ARM LDREXB、LDREXH、LDREXD、STREXB、STREXD、および STREXH は ARMv6K 以降で使用で

きます。

これらの 32 ビット Thumb 命令はいずれも ARMv6T2 以降で使用できます。ただし、

LDREXD と STREXD は ARMv7-M アーキテクチャでは使用できません。

これらの命令の 16 ビットバージョンはありません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-46ID 011811 Non-Confidential

Page 81: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

MOV r1, #0x1 ; ロ ッ ク取得値を ロードするtry LDREX r0, [LockAddr] ; ロ ッ ク値を ロー ドする

CMP r0, #0 ; ロ ッ ク フ リ ーか ど う か

STREXEQ r0, r1, [LockAddr] ; ロ ッ ク の取得を試みる

CMPEQ r0, #0 ; 成功し たかど う か

BNE try ; 失敗し た場合は再試行する

.... ; 成功し た場合はロ ッ ク取得済み

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-47ID 011811 Non-Confidential

Page 82: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.14 CLREX

排他をクリアする命令です。排他アクセスを要求しているアドレスが存在することを示す、実行中のプロセッサのローカルレコードをクリアします。

構文

CLREX{cond}

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

注 cond を指定できるのは、Thumb コードで、前に IT 命令を使用した場合

のみです。この命令は、ARM では無条件命令です。

使用法

CLREX 命令を使用して、密に結合されている排他アクセスモニタをオープンアクセス

状態に戻すことができます。これにより、メモリへのダミーストアを行う必要がなくなります。

CLREX が、アドレスから排他アクセスの要求がある実行中のプロセッサのグローバル

レコードもクリアするかどうかは、実装によって定義されます。

アーキテクチャ

この ARM 命令は、ARMv6K 以降で使用できます。

この 32 ビット Thumb 命令は ARMv7 以降で使用できます。

16 ビットの Thumb CLREX 命令はありません。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

• 『ARM アーキテクチャリファレンスマニュアル』, http://infocenter.arm.com/help/topic/com.arm.doc.subset.arch.reference/index.html

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-48ID 011811 Non-Confidential

Page 83: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.3.15 SWP と SWPB

レジスタとメモリ間のデータスワップ命令です。

構文

SWP{B}{cond} Rt, Rt2, [Rn]

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

B 任意に指定できる接尾文字です。B を指定した場合は、バイトがスワッ

プされます。指定しなかった場合は、32 ビットワードがスワップされ

ます。

Rt デスティネーションレジスタを指定します。Rt に PC は指定できません。

Rt2 ソースレジスタを指定します。Rt2 に Rt と同じレジスタを指定できます。

Rt2 に PC は指定できません。

Rn メモリ内のアドレスを保持します。Rn には、Rt および Rt2 とは異なるレ

ジスタを指定する必要があります。Rn に PC は指定できません。

使用法

SWP と SWPB を使用して、セマフォを実装できます。

• メモリからのデータが Rt にロードされます。

• Rt2 の内容がメモリに保存されます。

• Rt2 が Rt と同じレジスタになっている場合、レジスタの内容がそのメモリの場

所にある内容とスワップされます。

ARMv6 以降では、SWP および SWPB の使用はお勧めできません。LDREX および STREX 命令

を使用すると、ARMv6 以降で洗練されたセマフォを実装できます。

アーキテクチャ

これらの ARM 命令は、ARM アーキテクチャのすべてのバージョンで使用できます。

Thumb では SWP または SWPB 命令はありません。

関連項目

リファレンス:

• 「LDREX と STREX」 (ページ 3-45)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-49ID 011811 Non-Confidential

Page 84: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4 汎用データ処理命令

このセクションは以下のサブセクションから構成されています。

• 「フレキシブル第 2 オペランド(Operand2)」 (ページ 3-51)

• 「定数としての Operand2」 (ページ 3-51)

• 「シフトが任意に実行されるレジスタとしての Operand2」 (ページ 3-52)

• 「シフト演算」 (ページ 3-52)

• 「ADD、SUB、RSB、ADC、SBC、RSC」 (ページ 3-56)

キャリー付きまたはキャリーなしの加算、減算、および逆減算です。

• 「SUBS PC、lr」 (ページ 3-60)

スタックをポップしない例外からの復帰です。

• 「AND、ORR、EOR、BIC、ORN」 (ページ 3-62)

論理積、論理和、排他的論理和(XOR)、論理和否定、およびビットクリアで

す。

• 「CLZ」 (ページ 3-65)

先行ゼロカウント命令です。

• 「CMP、CMN」 (ページ 3-66)

比較命令と比較否定命令です。

• 「MOV、MVN」 (ページ 3-68)

データ代入命令とデータを代入してビット反転させる命令です。

• 「MOVT」 (ページ 3-71)

上位にデータを代入する命令です。

• 「TST、TEQ」 (ページ 3-72)

テスト命令と等価テスト命令です。

• 「SEL」 (ページ 3-74)

APSR の GE フラグの状態に基づいて、各オペランドからバイトを選択する命令

です。

• 「REV、REV16、REVSH、RBIT」 (ページ 3-76)

バイトまたはビットを反転する命令です。

• 「ASR、LSL、LSR、ROR、RRX」 (ページ 3-78)

算術右シフト命令です。

• 「SDIV、UDIV」 (ページ 3-81)

符号付き除算と符号なし除算です。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-50ID 011811 Non-Confidential

Page 85: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.1 フレキシブル第 2 オペランド(Operand2)

ARM および Thumb の汎用データ処理命令の多くに、フレキシブル第 2 オペランドを

使用できます。このオペランドは、各命令の構文の記述において Operand2 と表記され

ています。

Operand2 は次のいずれかです。

• 定数

• レジスタと任意に指定できるシフト

3.4.2 定数としての Operand2

Operand2 定数は次の形式で指定できます。

#constant

constant は数値を求める式です。

ARM 命令では、constant には、32 ビットのワード内で 8 ビットの値を右に任意の偶

数ビット分ロテートして得られる任意の値を指定できます。

Thumb 命令では、constant には以下の値を指定できます。

• 32 ビットのワード内で 8 ビットの値を左に任意のビット数シフトして得られる

定数

• 0x00XY00XY 形式の任意の定数

• 0xXY00XY00 形式の任意の定数

• 0xXYXYXYXY 形式の任意の定数

注 上記の定数の X と Y は 16 進数の値です。

また、少数の命令では、constant により広い範囲の値を指定することができます。詳

細については、各命令の説明を参照して下さい。

MOVS、MVNS、ANDS、ORRS、ORNS、EORS、BICS、TEQ、または TST 命令で Operand2 定数を使用

するときに、その定数が 255 よりも大きく、8 ビット値のシフトによって得られる場

合は、キャリーフラグは定数のビット [31] に更新されます。Operand2 がそれ以外の

定数の場合、これらの命令はキャリーフラグに影響しません。

命令置換

constant の値を使用できなくても、論理反転または否定が使用できる場合は、アセン

ブラは等価な命令を生成し、constant を反転または否定します。

例えば、アセンブラは CMP Rd, #0xFFFFFFFE という命令を CMN Rd, #0x2 という等価の命令と

してアセンブルすることがあります。

逆アセンブルリストとソースコードを比較する場合は、この点に注意して下さい。

アセンブラの --diag_warning 1645 コマンドラインオプションを使用して、いつ命令置

換が発生したかを確認できます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-51ID 011811 Non-Confidential

Page 86: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.3 シフトが任意に実行されるレジスタとしての Operand2

Operand2 レジスタは次の形式で指定できます。

Rm {, shift}

各パラメータには以下の意味があります。

Rm 第 2 オペランドのデータを保持するレジスタです。

shift 任意に指定できる、定数または Rm に適用されるレジスタ制御シフト量

です。以下の値を指定できます。

ASR #n n ビット算術右シフト、1 ≤ n ≤ 32。LSL #n n ビット論理左シフト、1 ≤ n ≤ 31。LSR #n n ビット論理右シフト、1 ≤ n ≤ 32。ROR #n n ビット右ロテート、1 ≤ n ≤ 31。

RRX 拡張付き 1 ビット右ロテート。

type Rs レジスタ制御シフトは、ARM コードのみで使用可能です。各

パラメータには以下の意味があります。

type ASR、LSL、LSR、または ROR のいずれかを指定します。

Rs シフト量を渡すレジスタを指定します。 下位バイ

トのみが使用されます。

- 省略した場合、シフトは行われず、LSL #0 を指定した場合と同

等になります。

シフトを省略するか、LSL #0 を指定した場合、Rm の値が命令で使用されます。

シフトを指定した場合、シフトは Rm の値に適用され、結果の 32 ビット値が命令で使

用されます。ただし、レジスタ Rm の値は変更されません。また、シフトと共にレジ

スタを指定した場合は、特定の命令での使用時にキャリーフラグが更新されます。

3.4.4 シフト演算

レジスタのシフト演算では、レジスタ内のビットが指定のビット数(シフト長)だけ左または右に移動します。レジスタのシフトは以下の方法で実行できます。

• ASR、LSR、LSL、ROR、および RRX 命令によって、直接実行できます。結果はデス

ティネーションレジスタに書き込まれます。

• シフトを実行するレジスタとして第 2 オペランドを指定する命令によって、

Operand2 の計算中に実行できます。結果は命令によって使用されます。

指定可能なシフト長はシフトの種類と命令によって異なります。個々の命令やフレキシブル第 2 オペランドの説明を参照して下さい。シフト長が 0 の場合、シフトは行

われません。レジスタのシフト演算では、指定したシフト長が 0 の場合を除き、

キャリーフラグが更新されます。以下のサブセクションでは、さまざまなシフト操作と、それらの操作がキャリーフラグに与える影響について説明します。ここでは、Rm はシフトされる値を保持するレジスタを、n はシフト長を表します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-52ID 011811 Non-Confidential

Page 87: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

ASR

n ビットの算術右シフトです。レジスタ Rm の左 32-n ビットを右に n 桁、結果の右 32-n ビットに移動します。レジスタの元のビット [31] は結果の左 n ビットにコピーされ

ます。詳細については、図 3-1 を参照して下さい。

ASR #n 操作を使用すると、レジスタ Rm の値を 2n で除算し、その結果を負の無限大に

丸めることができます。

命令が ASRS の場合、あるいは MOVS、MVNS、ANDS、ORRS、ORNS、EORS、BICS、TEQ、または TST 命令と共に ASR #n を Operand2 で使用した場合、キャリーフラグは、レジスタ Rm からシフトアウトされた 後のビット(ビット [n-1])に更新されます。

注 • n が 32 以上の場合、結果のすべてのビットが Rm のビット [31] の値に設定されま

す。

• n が 32 以上でキャリーフラグが更新される場合、Rm のビット [31] の値に更新さ

れます。

図 3-1 ASR #3

LSR

n ビットの論理右シフトです。レジスタ Rm の左 32-n ビットを右に n 桁、結果の右 32-n ビットに移動します。さらに、結果の左 n ビットを 0 に設定します。図 3-2 を参照し

て下さい。

LSR #n 操作を使用すると、レジスタ Rm の値を 2n で除算できます(値が符号なし整数

と見なされる場合)。

命令が LSRS の場合、あるいは MOVS、MVNS、ANDS、ORRS、ORNS、EORS、BICS、TEQ、または TST 命令と共に LSR #n を Operand2 で使用した場合、キャリーフラグは、レジスタ Rm からシフトアウトされた 後のビット(ビット [n-1])に更新されます。

注 • n が 32 以上の場合、結果のすべてのビットが 0 にクリアされます。

• n が 33 以上でキャリーフラグが更新される場合、0 に更新されます。

図 3-2 LSR #3

31 1 0

CarryFlag

...2345

31 1 0

CarryFlag

...

000

2345

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-53ID 011811 Non-Confidential

Page 88: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

LSL

n ビットの論理左シフトです。レジスタ Rm の右 32-n ビットを左に n 桁、結果の左 32-n ビットに移動します。さらに、結果の右 n ビットを 0 に設定します。図 3-3 を参照し

て下さい。

LSL #n 操作を使用すると、レジスタ Rm の値を 2n で乗算できます(値が符号なし整数

または 2 の補数の符号付き整数と見なされる場合)。このとき警告なしでオーバーフ

ローが発生する場合があります。

命令が LSLS の場合、あるいは MOVS、MVNS、ANDS、ORRS、ORNS、EORS、BICS、TEQ、または TST 命令と共に LSL #n(n はゼロ以外)を Operand2 で使用した場合、キャリーフラグ

は、レジスタ Rm からシフトアウトされた 後のビット(ビット [32-n])に更新されま

す。これらの命令を LSL #0 と共に使用した場合、キャリーフラグへの影響はありま

せん。

注 • n が 32 以上の場合、結果のすべてのビットが 0 にクリアされます。

• n が 33 以上でキャリーフラグが更新される場合、0 に更新されます。

図 3-3 LSL #3

ROR

n ビットの右ロテートです。レジスタ Rm の左 32-n ビットを右に n 桁、結果の右 32-n ビットに移動します。さらに、レジスタの右 n ビットを結果の左 n ビットに移動しま

す。詳細については、図 3-4 (ページ 3-55)を参照して下さい。

命令が RORS の場合、あるいは MOVS、MVNS、ANDS、ORRS、ORNS、EORS、BICS、TEQ、または TST 命令と共に ROR #n を Operand2 で使用した場合、キャリーフラグは、レジスタ Rm の

後のビットローテーション(ビット [n-1])に更新されます。

注 • n が 32 の場合、結果の値は Rm の値と同じになります。また、キャリーフラグが

更新される場合は、Rm のビット [31] に更新されます。

• 32 を超えるシフト長 n と ROR を指定した場合、シフト長 n-32 と ROR を指定した

場合と動作は同じになります。

31 1 0CarryFlag ...

000

2345

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-54ID 011811 Non-Confidential

Page 89: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

図 3-4 ROR #3

RRX

拡張付き右ロテートです。レジスタ Rm のビットを 1 ビット分右に移動します。さら

に、キャリーフラグを結果のビット [31] にコピーします。詳細については、図 3-5を参照して下さい。

命令が RRXS の場合、あるいは MOVS、MVNS、ANDS、ORRS、ORNS、EORS、BICS、TEQ、または TST 命令と共に RRX を Operand2 で使用した場合、キャリーフラグは、レジスタ Rm のビット [0] に更新されます。

図 3-5 RRX

関連項目

概念

• 「フレキシブル第 2 オペランド(Operand2)」 (ページ 3-51)

31 1 0

CarryFlag

...2345

31 1 0

CarryFlag

... ...

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-55ID 011811 Non-Confidential

Page 90: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.5 ADD、SUB、RSB、ADC、SBC、RSC

キャリー付きまたはキャリーなしの加算、減算、および逆減算です。

構文

op{S}{cond} {Rd}, Rn, Operand2

op{cond} {Rd}, Rn, #imm12 ; Thumb-2 ADD および SUB のみ

各パラメータには以下の意味があります。

op 次のいずれかを指定します。

ADD 加算

ADC キャリー付き加算

SUB 減算

RSB 逆減算

SBC キャリー付き減算

RSC キャリー付き逆減算(ARM のみ)

S 任意に指定できる接尾文字です。S が指定されている場合は、演算結果

に基づいて条件コードフラグが更新されます。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Rn 第 1 オペランドを保持するレジスタを指定します。

Operand2 フレキシブル第 2 オペランドを指定します。

imm12 0 ~ 4095 の範囲の値を指定します。

使用法

ADD 命令は、Rn と Operand2 または imm12 の値を加算します。

SUB 命令は、Operand2 または imm12 の値を Rn の値から減算します。

RSB(逆減算)命令は、Operand2 の値から Rn の値を減算します。Operand2 にはさまざま

なオプションがあるので、この命令は便利です。

ADC、SBC、および RSC を使用して、マルチワード算術演算を構成できます。

ADC(キャリー付き加算)命令は、Rn の値と Operand2 の値、そしてキャリーフラグも

含めて加算します。

SBC(キャリー付き減算)命令は、Rn の値から Operand2 の値を減算します。キャリー

フラグがクリアされている場合は、結果から 1 が引かれます。

RSC(キャリー付き逆減算)命令は、Operand2 の値から Rn の値を減算します。キャ

リーフラグがクリアされている場合は、結果から 1 が引かれます。

状況によっては、ある命令をアセンブラによって別の命令に置換できる場合があります。逆アセンブルリストを参照するときは、この点に注意して下さい。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-56ID 011811 Non-Confidential

Page 91: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

32 ビット Thumb 命令での PC の使用

これらの命令のほとんどでは、Rd、またはオペランドに PC(R15)は使用できませ

ん。

ただし、ADD 命令および SUB 命令で、定数 Operand2 の値が 0 ~ 4095 の範囲にあり、接

尾文字 S が指定されていない場合は、Rn に PC を使用できます。これらの命令は PC 相対アドレスを生成するのに役立ちます。このとき、PC のビット [1] の値が 0 として

読み出されるので、計算に使用するベースアドレスが常にワード境界で整列されます。

16 ビット Thumb での PC および SP の使用

以下の 16 ビット Thumb 命令の使用は非推奨です。

• ADD{cond} PC, SP, PC

• ADD{cond} SP, SP, PC

• ADD{cond} SP, SP, SP

ARM 命令での PC の使用

レジスタ制御シフトを行うデータ処理命令の場合は、Rd やオペランドに PC は使用で

きません。

ADD および SUB を除き、レジスタ制御シフトを行わない命令のオペランドでの PC の使

用は非推奨です。

レジスタ制御シフトを行わない SUB 命令では、PC の使用は以下の場合を除き、非推

奨です。

• Rd での PC の使用

• 命令 SUB Rd, Rn, #Constant の Rn での PC の使用

レジスタ制御シフトを行わない ADD 命令では、PC の使用は以下の場合を除き、非推

奨です。

• SP をレジスタに追加しない命令の Rd での PC の使用

• SP 以外の 2 つのレジスタを追加する命令の Rn での PC の使用と、Rm での PC の使用

• 命令 ADD{cond} Rd, Rn, #Constant の Rn での PC の使用

Rn または Rm に PC(R15)を指定している場合、使用される値は「命令のアドレス + 8」となります。

Rd に PC を指定した場合、以下のようになります。

• 演算結果に対応するアドレスへの分岐が実行されます。

• S 接尾文字を使用する場合は、SUBS pc,lr 命令を参照して下さい。

条件フラグ

S が指定されている場合、これらの命令は演算結果に基づいて N、Z、C、および V の各フラグを更新します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-57ID 011811 Non-Confidential

Page 92: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

16 ビット命令

これらの命令は、Thumb コード内では次の形式で使用できます。これらは 16 ビット

命令です。

ADDS Rd, Rn, #imm imm の範囲は 0 ~ 7 です。Rd と Rn は共に Lo レジスタである必要が

あります。

ADDS Rd, Rn, Rm Rd、Rn、および Rm はいずれも Lo レジスタである必要があります。

ADD Rd, Rd, Rm ARMv6 以前:Rd または Rm の少なくとも一方が Hi レジスタである

必要があります。ARMv6T2 以降:この制約は適用されません。

ADDS Rd, Rd, #imm imm の範囲は 0 ~ 255 です。Rd は Lo レジスタである必要がありま

す。

ADCS Rd, Rd, Rm Rd、Rn、および Rm はいずれも Lo レジスタである必要があります。

ADD SP, SP, #imm imm の範囲は 0 ~ 508 です(ワード境界で整列します)。

ADD Rd, SP, #imm imm の範囲は 0 ~ 1020 です(ワード境界で整列します)。Rd は Lo レジスタである必要があります。

ADD Rd, pc, #imm imm の範囲は 0 ~ 1020 です(ワード境界で整列します)。Rd は Lo レジスタである必要があります。この命令では、PC のビット [1:0] を 0 として読み出します。

SUBS Rd, Rn, Rm Rd、Rn、および Rm はいずれも Lo レジスタである必要があります。

SUBS Rd, Rn, #imm imm の範囲は 0 ~ 7 です。Rd と Rn は共に Lo レジスタである必要が

あります。

SUBS Rd, Rd, #imm imm の範囲は 0 ~ 255 です。Rd は Lo レジスタである必要がありま

す。

SBCS Rd, Rd, Rm Rd、Rn、および Rm はいずれも Lo レジスタである必要があります。

SUB SP, SP, #imm imm の範囲は 0 ~ 508 です(ワード境界で整列します)。

RSBS Rd, Rn, #0 Rd と Rn は共に Lo レジスタである必要があります。

ADD r2, r1, r3 SUBS r8, r6, #240 ; 結果に フ ラ グ を設定する

RSB r4, r4, #1280 ; 1280 か ら R4 の内容を減算する

ADCHI r11, r0, r3 ; C フ ラ グが設定され、 Z ; フ ラ グが ク リ ア された場合にのみ実行される

RSCSLE r0,r5,r0,LSL r4 ; 条件付き、 フ ラ グ設定

誤用例

RSCSLE r0,pc,r0,LSL r4 ; PC と レジス タ制御シ フ トは

; 一緒に指定できない

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-58ID 011811 Non-Confidential

Page 93: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

マルチワード演算の例

以下の 2 つの命令は、R2 と R3 に保持される 1 つの 64 ビット整数を、R0 と R1 に保持さ

れる別の 64 ビット整数に加算し、その結果を R4 と R5 に返します。

ADDS r4, r0, r2 ; 下位ワー ド を加算する

ADC r5, r1, r3 ; 上位ワー ド を加算する

以下の命令は、一方の 96 ビット整数を他方の値から減算します。

SUBS r3, r6, r9 SBCS r4, r7, r10 SBC r5, r8, r11

上記の例では分かりやすくするために、マルチワードの値に使用するレジスタを連続させていますが、必ずしもそうする必要はありません。例えば、以下のようにすることもできます。

SUBS r6, r6, r9 SBCS r9, r2, r1 SBC r2, r8, r11

関連項目

概念:

• 「フレキシブル第 2 オペランド(Operand2)」 (ページ 3-51)

• 「命令置換」 (ページ 3-51)

『ARM プロセッサをターゲットとしたソフトウェア開発』:

• 第 6 章 プロセッサ例外処理

リファレンス:

• 「並列加算と並列減算」 (ページ 3-109)

• 「SUBS PC、lr」 (ページ 3-60)

• 「ADR(PC 相対)」 (ページ 3-29)

• 「ADR(レジスタ相対)」 (ページ 3-31)

• 「ADRL 疑似命令」 (ページ 3-164)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-59ID 011811 Non-Confidential

Page 94: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.6 SUBS PC、lr

スタックから何もポップしない例外からの復帰です。

構文

SUBS{cond} pc, lr, #imm ; ARM および Thumb コ ー ド

MOVS{cond} pc, lr ; ARM および Thumb コ ー ド

op1S{cond} pc, Rn, #imm ; ARM コ ー ドのみで、 非推奨

op1S{cond} pc, Rn, Rm {, shift} ; ARM コ ー ドのみで、 非推奨

op2S{cond} pc, #imm ; ARM コ ー ドのみで、 非推奨

op2S{cond} pc, Rm {, shift} ; ARM コ ー ドのみで非推奨

各パラメータには以下の意味があります。

op1 ADC、ADD、AND、BIC、EOR、ORN、ORR、RSB、RSC、SBC、および SUB のいずれか

を指定します。

op2 MOV および MVN のいずれかを指定します。

cond 任意の条件コードを指定します。

imm イミディエート値を指定します。Thumb コードでの範囲は 0 ~ 255 に制

限されています。ARM コードではフレキシブル第 2 オペランドを指定

します。

Rn 第 1 オペランドレジスタを指定します。LR 以外のレジスタの使用は非推

奨です。

Rm オプションでシフトされた第 2 または唯一のオペランドレジスタを指定

します。

shift 任意の条件コードを指定します。

使用法

SUBS pc, lr, #imm では、リンクレジスタから値を減算し、結果を PC にロードして、

SPSR を CPSR にコピーします。

スタックに復帰状態がない場合、SUBS pc, lr, #imm を使用して例外から復帰できます。

#imm の値は、復帰する例外の種類によって異なります。

注釈

SUBS pc, lr, #imm では、アドレスを PC に書き込みます。例外復帰後に使用される命

令セットに合わせて、このアドレスの境界整列を調整する必要があります。

• ARM 命令セットに復帰するには、PC に書き込むアドレスをワード境界で整列

する必要があります。

• Thumb 命令セットに復帰するには、PC に書き込むアドレスをハーフワード境

界で整列する必要があります。

• Jazelle 命令セットに復帰する場合、PC に書き込むアドレスの境界整列につい

て、制限はありません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-60ID 011811 Non-Confidential

Page 95: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

上記の規則に従わなかった場合、予測不可能な結果が生じます。ただし、適切な例外開始メカニズムの後で復帰するために命令を使用する場合、ソフトウェア側に特別な予防策は必要ありません。

Thumb では、SUBS{cond} pc, lr, #imm のみが有効な命令です。MOVS pc, lr は SUBS pc, lr, #0 と同じ意味です。他の命令は定義されていません。

ARM では、SUBS{cond} pc, lr, #imm および MOVS{cond} pc, lr のみが有効な命令です。そ

の他の命令は非推奨です。

注意 これらの命令は、ユーザモードやシステムモードでは使用しないで下さい。このよ

うな命令による影響は予測不可能なうえ、アセンブル時にアセンブラによる警告が生成されません。

アーキテクチャ

この ARM 命令は、ARM アーキテクチャのすべてのバージョンで使用できます。

この 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ただし、ARMv7-M アーキテクチャでは使用できません。

この命令の 16 ビット Thumb バージョンはありません。

関連項目

概念:

• 「フレキシブル第 2 オペランド(Operand2)」 (ページ 3-51)

リファレンス:

• 「ADD、SUB、RSB、ADC、SBC、RSC」 (ページ 3-56)

• 「AND、ORR、EOR、BIC、ORN」 (ページ 3-62)

• 「MOV、MVN」 (ページ 3-68)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-61ID 011811 Non-Confidential

Page 96: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.7 AND、ORR、EOR、BIC、ORN

論理積、論理和、排他的論理和(XOR)、ビットクリア、および論理和否定です。

構文

op{S}{cond} Rd, Rn, Operand2

各パラメータには以下の意味があります。

op 次のいずれかを指定します。

AND 論理積

ORR 論理和

EOR 排他的論理和(XOR)BIC 論理積否定

ORN 論理和否定(Thumb のみ)

S 任意に指定できる接尾文字です。S が指定されている場合は、演算結果

に基づいて条件コードフラグが更新されます。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Rn 第 1 オペランドを保持するレジスタを指定します。

Operand2 フレキシブル第 2 オペランドを指定します。

使用法

AND、EOR、および ORR の各命令は、Rn と Operand2 の値に対し、それぞれビットごとの

論理積、排他的論理和(XOR)、および論理和を取ります。

BIC(ビットクリア)命令は、Rn 内のビットと、Operand2 の値に含まれる、対応する各

ビットの補数との論理積を取ります。

ORN Thumb 命令は、Rn 内のビットと、Operand2 の値に含まれる、対応する各ビットの

補数との論理和を取ります。

状況によっては、アセンブラが BIC を AND に、AND を BIC に、ORN を ORR に、ORR を ORN に置き換える場合があります。逆アセンブルリストを参照するときは、この点に注意して下さい。

Thumb-2 命令での PC の使用

すべての命令で、Rd、または任意のオペランドに PC(R15)は使用できません。

ARM 命令での PC の使用

注 ARM 命令では PC の使用は非推奨です。

Rn に PC を指定している場合、使用される値は「命令のアドレス + 8」となります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-62ID 011811 Non-Confidential

Page 97: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

Rd に PC を指定した場合、以下のようになります。

• 演算結果に対応するアドレスへの分岐が実行されます。

• S 接尾文字を使用する場合は、SUBS pc,lr 命令を参照して下さい。

レジスタ制御シフトを行うデータ処理命令の場合は、オペランドに PC は使用できま

せん。

条件フラグ

S が指定されている場合、これらの命令では、以下のようになります。

• 結果に応じて N フラグおよび Z フラグを更新します。

• Operand2 の計算中に C フラグを更新することが可能です。

• V フラグは更新しません。

16 ビット命令

これらの命令は、Thumb コード内では次の形式で使用できます。これらは 16 ビット

命令です。

ANDS Rd, Rd, Rm Rd と Rm は共に Lo レジスタである必要があります。

EORS Rd, Rd, Rm Rd と Rm は共に Lo レジスタである必要があります。

ORRS Rd, Rd, Rm Rd と Rm は共に Lo レジスタである必要があります。

BICS Rd, Rd, Rm Rd と Rm は共に Lo レジスタである必要があります。

初の 3 つの例は、OPS Rd, Rm, Rd を指定しても問題はありません。命令は変わりませ

ん。

AND r9,r2,#0xFF00 ORREQ r2,r0,r5 EORS r0,r0,r3,ROR r6 ANDS r9, r8, #0x19 EORS r7, r11, #0x18181818 BIC r0, r1, #0xab ORN r7, r11, lr, ROR #4 ORNS r7, r11, lr, ASR #32

誤用例

EORS r0,pc,r3,ROR r6 ; PC と レジス タ制御シ フ トは

; 一緒に指定できない

関連項目

概念:

• 「フレキシブル第 2 オペランド(Operand2)」 (ページ 3-51)

• 「命令置換」 (ページ 3-51)

『ARM プロセッサをターゲットとしたソフトウェア開発』:

• 第 6 章 プロセッサ例外処理

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-63ID 011811 Non-Confidential

Page 98: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

リファレンス:

• 「SUBS PC、lr」 (ページ 3-60)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-64ID 011811 Non-Confidential

Page 99: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.8 CLZ

先行ゼロカウント命令です。

構文

CLZ{cond} Rd, Rm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。Rd に PC は指定できません。

Rm オペランドレジスタを指定します。Rm に PC は指定できません。

使用法

CLZ 命令は Rm の値に含まれる先行ゼロの数をカウントし、結果を Rd に返します。

ソースレジスタに設定されているビットがない場合の結果は 32 となり、ビット 31 が設定されている場合の結果はゼロになります。

条件フラグ

この命令によるフラグへの影響はありません。

アーキテクチャ

この ARM 命令は、ARMv5T 以降で使用できます。

この 32 ビット Thumb 命令は ARMv6T2 以降で使用できます。

この命令の 16 ビット Thumb バージョンはありません。

CLZ r4,r9 CLZNE r2,r3

レジスタ Rm の値を正規化するには、CLZ Thumb 命令を使用し、結果として返された Rd 値の分、Rm を左シフトします。Rm が 0 の場合にフラグを設定するには、MOV ではなく MOVS を使用します。

CLZ r5, r9MOVS r9, r9, LSL r5

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-65ID 011811 Non-Confidential

Page 100: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.9 CMP、CMN

比較命令と比較否定命令です。

構文

CMP{cond} Rn, Operand2

CMN{cond} Rn, Operand2

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Rn 第 1 オペランドを保持する ARM レジスタを指定します。

Operand2 フレキシブル第 2 オペランドを指定します。

使用法

これらの命令は、レジスタ内の値と Operand2 を比較します。結果に基づいて条件フラ

グを更新しますが、結果はどのレジスタにも入れません。

CMP 命令は、Rn の値から Operand2 の値を減算します。結果が破棄されることを除けば、

SUBS 命令と同じです。

CMN 命令は Operand2 の値を Rn の値に加算します。結果が破棄されることを除けば、

ADDS 命令と同じです。

状況によっては、アセンブラによって CMN を CMP に、CMP を CMN に置換できる場合があ

ります。逆アセンブルリストを参照するときは、この点に注意して下さい。

ARM 命令での PC の使用

注 これらの ARM 命令では PC(R15)の使用は非推奨です。

Rn に PC を指定している場合、使用される値は「命令のアドレス + 8」となります。

レジスタ制御シフトを行うデータ処理命令の場合は、オペランドに PC は使用できま

せん。

Thumb-2 命令での PC の使用

これらの命令では、オペランドに PC(R15)は使用できません。

16 ビット Thumb 命令での SP の使用

16 ビット Thumb CMP Rn, Rm 命令での Rm としての SP の使用は非推奨です。

条件フラグ

これらの命令は、演算結果に基づいて N、Z、C、および V の各フラグを更新します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-66ID 011811 Non-Confidential

Page 101: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

16 ビット命令

これらの命令は、Thumb コード内では次の形式で使用できます。これらは 16 ビット

命令です。

CMP Rn, Rm Lo レジスタの制約は適用されません。

CMN Rn, Rm Rn と Rm は共に Lo レジスタである必要があります。

CMP Rn, #imm Rn は Lo レジスタである必要があります。imm の範囲は 0 ~ 255 です。

CMP r2, r9 CMN r0, #6400 CMPGT sp, r7, LSL #2

誤用例

CMP r2, pc, ASR r0 ; PC と レジス タ制御シ フ トは一緒に使用できない

関連項目

概念:

• 「フレキシブル第 2 オペランド(Operand2)」 (ページ 3-51)

• 「命令置換」 (ページ 3-51)

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-67ID 011811 Non-Confidential

Page 102: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.10 MOV、MVN

データ代入命令とデータを代入してビット反転させる命令です。

構文

MOV{S}{cond} Rd, Operand2

MOV{cond} Rd, #imm16

MVN{S}{cond} Rd, Operand2

各パラメータには以下の意味があります。

S 任意に指定できる接尾文字です。S が指定されている場合は、演算結果

に基づいて条件コードフラグが更新されます。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Operand2 フレキシブル第 2 オペランドを指定します。

imm16 0 ~ 65535 の範囲の値を指定します。

使用法

MOV 命令は Operand2 の値を Rd にコピーします。

MVN 命令は Operand2 の値を取得し、その値にビットごとの論理 NOT 演算を実行して、

結果を Rd に返します。

状況によっては、アセンブラによって MVN を MOV に、MOV を MVN に置換できる場合があ

ります。逆アセンブルリストを参照するときは、この点に注意して下さい。

32 ビット Thumb MOV および MVN での PC および SP の使用

PC(R15)は、32 ビット Thumb MOV または MVN 命令では Rd または Operand2 に使用でき

ません。次の例外を除き、SP(R13)は Rd または Operand2 に使用できません。

• MOV{cond}.W Rd, SP、Rd に SP は使用不可

• MOV{cond}.W SP, Rm、Rm に SP は使用不可

16 ビット Thumb MOV での PC および SP の使用

Rd と Rm の両方に SP または PC を指定した 16 ビット Thumb MOV(レジスタ)命令の使

用は、非推奨です。

ARM MOV と MVN での PC および SP の使用

レジスタ制御シフトを行うデータ処理命令の場合は、Rd やオペランドに PC は使用で

きません。

レジスタ制御シフトを行わない命令では、PC の使用は以下の場合を除き、非推奨で

す。

• MOVS PC, LR

• MOV PC, Rm、Rm に PC または SP は使用不可

• MOV Rd, PC、Rd に PC または SP は使用不可

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-68ID 011811 Non-Confidential

Page 103: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

SP は Rd または Rm で使用できます。ただし、以下の制限があります。

• MOVS Rd, Rm は、Rd または Rm が SP の場合、非推奨です。

• MOV Rd, Rm は、Rd が SP または PC で、Rm が SP または PC である場合、非推奨で

す。

注 MOV Rd, #imm16 の Rd での PC の使用は、結果が予測不可能ですが、PC をレジスタ制御

シフトなしの Operand2 を使う形式で使用できます。

Rm に PC を指定している場合、使用される値は「命令のアドレス + 8」となります。

Rd に PC を指定した場合、以下のようになります。

• 演算結果に対応するアドレスへの分岐が実行されます。

• S 接尾文字を使用する場合は、SUBS pc,lr 命令を参照して下さい。

条件フラグ

S が指定されている場合、これらの命令では、以下のようになります。

• 結果に応じて N フラグおよび Z フラグを更新します。

• Operand2 の計算中に C フラグを更新することが可能です。

• V フラグは更新しません。

16 ビット命令

これらの命令は、Thumb コード内では次の形式で使用できます。これらは 16 ビット

命令です。

MOVS Rd, #imm Rd は Lo レジスタである必要があります。imm の範囲は 0 ~ 255 です。

MOVS Rd, Rm Rd と Rm は共に Lo レジスタである必要があります。

MOV Rd, Rm ARMv6 以前のアーキテクチャでは、Rd と Rm のいずれか一方また

は両方が Hi レジスタである必要があります。ARMv6 以降のバー

ジョンに、この制限は適用されません。

アーキテクチャ

#imm16 形式の ARM 命令は、ARMv6T2 以降で使用できます。その他の形式の ARM 命令は ARM アーキテクチャのすべてのバージョンで使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの 16 ビット Thumb 命令は、ARM アーキテクチャのすべての T バリアントで

使用できます。

MVNNE r11, #0xF000000B ; ARM のみ。 こ の イ ミ デ ィ エー ト値は

; T2 では使用不可

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-69ID 011811 Non-Confidential

Page 104: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

誤用例

MVN pc,r3,ASR r0 ; PC と レジス タ制御シ フ トは一緒に使用できない

関連項目

概念:

• 「フレキシブル第 2 オペランド(Operand2)」 (ページ 3-51)

• 「命令置換」 (ページ 3-51)

『ARM プロセッサをターゲットとしたソフトウェア開発』:

• 第 6 章 プロセッサ例外処理

リファレンス:

• 「条件コード」 (ページ 3-173)

• 「SUBS PC、lr」 (ページ 3-60)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-70ID 011811 Non-Confidential

Page 105: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.11 MOVT

上位にデータを代入する命令です。レジスタの下位ハーフワードに影響を及ぼさずに、上位ハーフワードに 16 ビットのイミディエート値を書き込みます。

構文

MOVT{cond} Rd, #imm16

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。Rd を PC にすることはでき

ません。

imm16 16 ビットのイミディエート値を指定します。

使用法

MOVT は、imm16 を Rd [31:16] に書き込みます。この書き込みが Rd [15:0] に影響すること

はありません。

MOV と MOVT の命令対で、任意の 32 ビットイミディエート値を生成できます。この命

令対を効率的に生成するために、アセンブラは MOV32 疑似命令を実装します。

条件フラグ

この命令によるフラグへの影響はありません。

アーキテクチャ

この ARM 命令は、ARMv6T2 以降で使用できます。

この 32 ビット Thumb 命令は ARMv6T2 以降で使用できます。

この命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス:

• 「MOV32 疑似命令」 (ページ 3-167)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-71ID 011811 Non-Confidential

Page 106: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.12 TST、TEQ

ビットテストと等価テストです。

構文

TST{cond} Rn, Operand2

TEQ{cond} Rn, Operand2

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Rn 第 1 オペランドを保持する ARM レジスタを指定します。

Operand2 フレキシブル第 2 オペランドを指定します。

使用法

これらの命令は、レジスタ内の値を Operand2 に対してテストします。結果に基づいて

条件フラグを更新しますが、結果はどのレジスタにも入れません。

TST 命令は Rn の値と Operand2 の値を使用してビットごとの論理積を取ります。結果が

破棄されることを除けば、ANDS 命令と同じです。

TEQ 命令は Rn の値と Operand2 の値を使用してビットごとの排他的論理和(XOR)を取

ります。結果が破棄されることを除けば、EORS 命令と同じです。

2 つの値が等しいかどうかをテストするには TEQ 命令を使用します。その際、CMP とは

異なり、V フラグまたは C フラグに影響することはありません。

TEQ は値の符号をテストするのにも役立ちます。比較後の N フラグは、2 つのオペラ

ンドの符号ビットの排他的論理和(XOR)になります。

レジスタの制約条件

これらの Thumb 命令では、Rn および Operand2 に SP または PC は使用できません。

これらの ARM 命令では、SP または PC の使用は非推奨です。

ARM 命令には、以下の制約条件が適用されます。

• Rn に PC(R15)を指定している場合、使用される値は「命令のアドレス + 8」となります。

• レジスタ制御シフトを行うデータ処理命令の場合は、オペランドに PC は使用

できません。

条件フラグ

これらの命令では、以下のようになります。

• 結果に応じて N フラグおよび Z フラグを更新します。

• Operand2 の計算中に C フラグを更新することが可能です。

• V フラグは更新しません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-72ID 011811 Non-Confidential

Page 107: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

16 ビット命令

TST 命令は、Thumb コード内では次の形式で使用できます。これは 16 ビット命令で

す。

TST Rn, Rm Rn と Rm は共に Lo レジスタである必要があります。

アーキテクチャ

これらの ARM 命令は、ARM のすべてのアーキテクチャで使用できます。

TST Thumb 命令は、Thumb のすべてのアーキテクチャで使用できます。

TEQ Thumb 命令は、ARMv6T2 以降で使用できます。

TST r0, #0x3F8 TEQEQ r10, r9 TSTNE r1, r5, ASR r1

誤用例

TEQ pc, r1, ROR r0 ; PC と レジス タ制御シ フ トは

; 一緒に指定できない

関連項目

概念:

• 「フレキシブル第 2 オペランド(Operand2)」 (ページ 3-51)

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-73ID 011811 Non-Confidential

Page 108: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.13 SEL

APSR の GE フラグの状態に基づいて、各オペランドからバイトを選択する命令で

す。

構文

SEL{cond} {Rd}, Rn, Rm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Rn 第 1 オペランドを保持するレジスタを指定します。

Rm 第 2 オペランドを保持するレジスタを指定します。

演算

SEL 命令は、APSR の GE フラグに基づいて、Rn または Rm からバイトを選択します。

• GE[0] が設定されている場合は、Rd[7:0] が Rn[7:0] から取得され、それ以外の場

合は Rm[7:0] から取得されます。

• GE[1] が設定されている場合は、Rd[15:8] が Rn[15:8] から取得され、それ以外の

場合は Rm[15:8] から取得されます。

• GE[2] が設定されている場合は、Rd[23:16] が Rn[23:16] から取得され、それ以外

の場合は Rm[23:16] から取得されます。

• GE[3] が設定されている場合は、Rd[31:24] が Rn[31:24] から取得され、それ以外

の場合は Rm[31:24] から取得されます。

使用法

Rd、Rn、および Rm に PC は指定できません。

SEL 命令は、符号付き並列命令の後に使用します。この命令を使用して、複数バイト

データまたはハーフワードデータの 大値や 小値を選択できます。

条件フラグ

この命令によるフラグへの影響はありません。

アーキテクチャ

この ARM 命令は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

この命令の 16 ビット Thumb バージョンはありません。

SEL r0, r4, r5 SELLT r4, r0, r4

以下の命令シーケンスは、R1 と R2 の各バイトの符号なし 小値と等しくなるように R4 の対応するバイトを設定します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-74ID 011811 Non-Confidential

Page 109: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

USUB8 r4, r1, r2 SEL r4, r2, r1

関連項目

リファレンス: • 「並列加算と並列減算」 (ページ 3-109)• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-75ID 011811 Non-Confidential

Page 110: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.14 REV、REV16、REVSH、RBIT

ワード内またはハーフワード内で、バイトまたはビットを反転する命令です。

構文

op{cond} Rd, Rn

各パラメータには以下の意味があります。

op 以下のいずれかを指定します。

REV ワード内のバイト順序を反転させます。

REV16 各ハーフワード内のバイト順序を独自に反転させます。

REVSH 下位ハーフワード内のバイト順序を反転させ、それを 32 ビッ

トに符号拡張します。

RBIT 32 ビットワード内のビット順序を反転させます。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。Rd に PC は指定できません。

Rn オペランドを保持するレジスタを指定します。Rn に PC は指定できませ

ん。

使用法

以下の命令を使用して、エンディアン方式を変更できます。

REV 32 ビットのビッグエンディアンデータをリトルエンディアンデータに

変換するか、32 ビットのリトルエンディアンデータをビッグエンディ

アンデータに変換します。

REV16 16 ビットのビッグエンディアンデータをリトルエンディアンデータに

変換するか、16 ビットのリトルエンディアンデータをビッグエンディ

アンデータに変換します。

REVSH 次のいずれかの変換を行います。

• 16 ビットの符号付きビッグエンディアンデータを 32 ビットの符号

付きリトルエンディアンデータに変換します。

• 16 ビットの符号付きリトルエンディアンデータを 32 ビットの符号

付きビッグエンディアンデータに変換します。

条件フラグ

これらの命令によるフラグへの影響はありません。

16 ビット命令

これらの命令は、Thumb コード内では次の形式で使用できます。これらは 16 ビット

命令です。

REV Rd, Rm Rd と Rm は共に Lo レジスタである必要があります。

REV16 Rd, Rm Rd と Rm は共に Lo レジスタである必要があります。

REVSH Rd, Rm Rd と Rm は共に Lo レジスタである必要があります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-76ID 011811 Non-Confidential

Page 111: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

アーキテクチャ

RBIT を除く上記の ARM 命令は、ARMv6 以降で使用できます。

ARM 命令 RBIT は、ARMv6T2 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの 16 ビット Thumb 命令は、ARMv6 以降で使用できます。

REV r3, r7 REV16 r0, r0 REVSH r0, r5 ; 符号付きハー フ ワー ド を反転させる

REVHS r3, r7 ; " よ り大きい " ま たは "同じ " 条件を適用し て反転させる RBIT r7, r8

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-77ID 011811 Non-Confidential

Page 112: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.15 ASR、LSL、LSR、ROR、RRX

算術右シフト、論理左シフト、論理右シフト、右ロテート、および拡張付き右ロテートです。

これらの命令は、レジスタオペランドがシフトされる MOV 命令と同じ意味です。

構文

op{S}{cond} Rd, Rm, Rs

op{S}{cond} Rd, Rm, #sh

RRX{S}{cond} Rd, Rm

各パラメータには以下の意味があります。

op ASR、LSL、LSR、または ROR のいずれかを指定します。

S 任意に指定できる接尾文字です。S が指定されている場合は、演算結果

に基づいて条件コードフラグが更新されます。

Rd デスティネーションレジスタを指定します。

Rm 第 1 オペランドを保持するレジスタを指定します。このオペランドは右

にシフトされます。

Rs Rm の値に適用するシフト値を保持するレジスタを指定します。 下位バ

イトのみが使用されます。

sh 定数シフトを指定します。指定可能な値の範囲は、命令によって異なり

ます。

ASR 1 ~ 32 のシフトが可能です。

LSL 0 ~ 31 のシフトが可能です。

LSR 1 ~ 32 のシフトが可能です。

ROR 1 ~ 31 のシフトが可能です。

使用法

ASR は、レジスタの内容を 2 のべき乗で除算した、符号付きの値を求めます。空の左

のビット位置には、符号ビットがコピーされます。

LSL は、レジスタを 2 のべき乗で乗算した値を求めます。LSR は、レジスタを 2 の可変

乗で除算した、符号なしの値を求めます。いずれの命令でも、空のビット位置には 0 が挿入されます。

ROR は、レジスタの内容を任意の値でロテートした値を求めます。ロテートの結果右

端から溢れたビットは、空の左のビット位置に挿入されます。

RRX は、レジスタの内容を右に 1 ビットシフトした値を求めます。古いキャリーフラ

グはビット [31] にシフトされます。接尾文字 S を指定した場合、古いビット [0] がキャリーフラグに配置されます。

Thumb コードにおける制限事項

Thumb 命令では、PC も SP も使用できません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-78ID 011811 Non-Confidential

Page 113: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

ARM ASR、LSL、LSR、ROR、および RRX 命令での PC の使用

op Rd,Rm,#sh および RRX Rd,Rm 構文は Rd または Rm が PC の場合に使用できますが、両方

を PC にすることはできません。その他のケースでは非推奨です。

Rm に PC を指定している場合、使用される値は「命令のアドレス + 8」となります。

Rd に PC を指定した場合、以下のようになります。

• 演算結果に対応するアドレスへの分岐が実行されます。

• 接尾文字 S を指定している場合は、現在のモードの SPSR が CPSR にコピーされ

ます。この動作を利用して、例外から復帰することができます。

注 ARM 命令 opS{cond} pc,Rm,#sh および RRXS{cond} pc,Rm は、常に MOVS{cond}

pc,Rm{,shift} という適切な形式に逆アセンブルされます。

注意 ユーザモードまたはシステムモードで Rd に PC を使用する場合は、接尾文字 S を使用

しないで下さい。このような命令による影響は予測不可能なうえ、アセンブリ時にアセンブラによる警告が生成されません。

これらの命令でレジスタ制御シフトを行う場合は、Rd やオペランドに PC は使用でき

ません。

条件フラグ

S が指定されている場合、これらの命令は演算結果に基づいて N と Z の各フラグを更

新します。

シフト値が 0 の場合、C フラグは影響を受けません。0 以外の場合、シフトアウトさ

れた 後のビットで更新されます。

16 ビット命令

これらの命令は、Thumb コード内では次の形式で使用できます。これらは 16 ビット

命令です。

ASRS Rd, Rm, #sh Rd と Rm は共に Lo レジスタである必要があります。

ASRS Rd, Rd, Rs Rd と Rs は共に Lo レジスタである必要があります。

LSLS Rd, Rm, #sh Rd と Rm は共に Lo レジスタである必要があります。

LSLS Rd, Rd, Rs Rd と Rs は共に Lo レジスタである必要があります。

LSRS Rd, Rm, #sh Rd と Rm は共に Lo レジスタである必要があります。

LSRS Rd, Rd, Rs Rd と Rs は共に Lo レジスタである必要があります。

RORS Rd, Rd, Rs Rd と Rs は共に Lo レジスタである必要があります。

アーキテクチャ

これらの ARM 命令は、すべてのアーキテクチャで使用できます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-79ID 011811 Non-Confidential

Page 114: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの 16 ビット Thumb 命令は、ARMv4T 以降で使用できます。

16 ビットの Thumb RRX 命令はありません。

ASR r7, r8, r9LSLS r1, r2, r3

LSR r4, r5, r6 ROR r4, r5, r6

関連項目

リファレンス:

• 「MOV、MVN」 (ページ 3-68)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-80ID 011811 Non-Confidential

Page 115: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.4.16 SDIV、UDIV

符号付き除算と符号なし除算です。

構文

SDIV{cond} {Rd}, Rn, Rm

UDIV{cond} {Rd}, Rn, Rm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Rn 被除数を保持するレジスタを指定します。

Rm 除数を保持するレジスタを指定します。

レジスタの制約条件

PC と SP は Rd、Rn、または Rm に使用できません。

アーキテクチャ

これらの 32 ビット Thumb 命令は ARMv7-R と ARMv7-M のみで使用できます。

SDIV と UDIV 命令には ARM バージョンも 16 ビット Thumb バージョンもありません。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-81ID 011811 Non-Confidential

Page 116: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.5 乗算命令

このセクションは以下のサブセクションから構成されています。

• 「MUL、MLA、MLS」 (ページ 3-83)

乗算命令、積和命令、および積差命令です(32 ビット× 32 ビットを計算し、

結果の下位 32 ビットを返します)。

• 「UMULL、UMLAL、SMULL、SMLAL」 (ページ 3-85)

符号なし / 符号付き long 乗算命令と long 積和命令です(32 ビット× 32 ビット

を実行し、64 ビットの結果または 64 ビットの累積値を返します)。

• 「SMULxy、SMLAxy」 (ページ 3-87)

符号付き乗算命令と符号付き積和命令です(16 ビット× 16 ビットを実行し、

32 ビットの結果を返します)。

• 「SMULWy、SMLAWy」 (ページ 3-89)

符号付き乗算命令と符号付き積和命令です(32 ビット× 16 ビットを実行し、

結果の上位 32 ビットを返します。

• 「SMLALxy」 (ページ 3-90)

符号付き積和命令です(16 ビット× 16 ビットを実行し、64 ビットの累算値を

返します)。

• 「SMUAD{X}、SMUSD{X}」 (ページ 3-92)

積の加算または減算を伴うデュアル 16 ビット符号付き乗算命令です。

• 「SMMUL、SMMLA、SMMLS」 (ページ 3-94)

乗算命令、積和命令、および積差命令です(32 ビット× 32 ビットを実行し、

結果の上位 32 ビットを返します)。

• 「SMLAD、SMLSD」 (ページ 3-96)

デュアル 16 ビット符号付き乗算を実行し、積の加算または減算と、32 ビット

の累算を行う命令です。

• 「SMLALD、SMLSLD」 (ページ 3-98)

デュアル 16 ビット符号付き乗算を実行し、32 ビットの積の加算または減算と、

64 ビットの累算を行う命令です。

• 「UMAAL」 (ページ 3-100)

符号なし積和累算 long 命令です。

• 「MIA、MIAPH、MIAxy」 (ページ 3-101)

内部積算を伴う乗算(XScale コプロセッサ 0 命令)です。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-82ID 011811 Non-Confidential

Page 117: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.5.1 MUL、MLA、MLS

符号付きまたは符号なしの 32 ビットオペランドを使用して乗算、積和、および積差

を実行し、結果の下位 32 ビットを返します。

構文

MUL{S}{cond} {Rd}, Rn, Rm

MLA{S}{cond} Rd, Rn, Rm, Ra

MLS{cond} Rd, Rn, Rm, Ra

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

S 任意に指定できる接尾文字です。S が指定されている場合は、演算結果

に基づいて条件コードフラグが更新されます。

Rd デスティネーションレジスタを指定します。

Rn?Rm 乗算する値を保持するレジスタを指定します。

Ra 加算する値または引かれる値を保持するレジスタを指定します。

使用法

MUL 命令は Rn と Rm の値を乗算し、演算結果の下位 32 ビットを Rd に返します。

MLA 命令は Rn と Rm の値を乗算し、Ra の値を加算して、演算結果の下位 32 ビットを Rd に返します。

MLS 命令は Rn と Rm の値を乗算し、その結果を Ra の値から減算して、 終的な演算結

果の下位 32 ビットを Rd に返します。

Rd、Rn、Rm、および Ra に PC は指定できません。

条件フラグ

S が指定されている場合、MUL と MLA では、以下のようになります。

• 結果に応じて N フラグおよび Z フラグを更新します。

• ARMv4 では、C フラグおよび V フラグを破棄します。

• ARMv5T 以降のプロセッサでは、C フラグまたは V フラグへの影響はありませ

ん。

制限

ARMv6 より前のアーキテクチャの MUL および MLA 命令では、Rn は Rd とは異なる必要

があります。

Thumb 命令

MUL 命令は、Thumb コード内では次の形式で使用できます。これは 16 ビット命令で

す。

MULS Rd, Rn, Rd Rd と Rn は共に Lo レジスタである必要があります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-83ID 011811 Non-Confidential

Page 118: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

条件コードのフラグを更新できる Thumb 乗算命令は他にはありません。

アーキテクチャ

ARM 命令 MUL および MLA は、ARM アーキテクチャのすべてのバージョンで使用でき

ます。

ARM 命令 MLS は、ARMv6T2 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

16 ビット Thumb の MULS 命令は、ARM アーキテクチャのすべての T バリアントで使

用できます。

MUL r10, r2, r5 MLA r10, r2, r1, r5 MULS r0, r2, r2 MULLT r2, r3, r2 MLS r4, r5, r6, r7

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-84ID 011811 Non-Confidential

Page 119: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.5.2 UMULL、UMLAL、SMULL、SMLAL

符号付き / 符号なし long 乗算命令と任意に指定できる積算命令です(32 ビット× 32 ビットを実行し、64 ビットの積算値と結果を返します)。

構文

Op{S}{cond} RdLo, RdHi, Rn, Rm

各パラメータには以下の意味があります。

Op UMULL、UMLAL、SMULL、または SMLAL のいずれかを指定します。

S 任意に指定できる接尾文字です。ARM 状態でのみ使用できます。S が指

定されている場合は、演算結果に基づいて条件コードフラグが更新されます。

cond 任意の条件コードを指定します。

RdLo?RdHi デスティネーションレジスタを指定します。UMLAL および SMLAL では、こ

れらのレジスタに累算値も保存されます。RdLo と RdHi には、それぞれ異

なるレジスタを指定する必要があります。

Rn?Rm オペランドを保持する ARM レジスタを指定します。

RdLo、RdHi、Rn、および Rm に PC は指定できません。

使用法

UMULL 命令は Rn と Rm の値を符号なし整数と解釈します。これらの整数を乗算して、演

算結果の下位 32 ビットを RdLo に返し、上位 32 ビットを RdHi に返します。

UMLAL 命令は Rn と Rm の値を符号なし整数と解釈します。これらの整数を乗算して得ら

れた 64 ビットの演算結果を、RdHi と RdLo が保持している 64 ビットの符号なし整数に

加算します。

SMULL 命令は、Rn と Rm の値を、2 の補数となる符号付き整数と解釈します。これらの

整数を乗算して、演算結果の下位 32 ビットを RdLo に返し、上位 32 ビットを RdHi に返します。

SMLAL 命令は、Rn と Rm の値を、2 の補数となる符号付き整数と解釈します。これらの

整数を乗算して得られた 64 ビットの演算結果を、RdHi と RdLo が保持している 64 ビッ

トの符号付き整数に加算します。

条件フラグ

S が指定されている場合、これらの命令では、以下のようになります。

• 結果に応じて N フラグおよび Z フラグを更新します。

• C フラグまたは V フラグは更新しません。

制限

ARMv6 より前のアーキテクチャでは、Rn は RdLo および RdHi とは異なる必要がありま

す。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-85ID 011811 Non-Confidential

Page 120: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

アーキテクチャ

これらの ARM 命令は、ARM アーキテクチャのすべてのバージョンで使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

UMULL r0, r4, r5, r6 UMLALS r4, r5, r3, r8

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-86ID 011811 Non-Confidential

Page 121: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.5.3 SMULxy、SMLAxy

符号付き乗算命令と積和命令です(16 ビット× 16 ビットを実行し、32 ビットの積算

値と結果を返します)。

構文

SMUL<x><y>{cond} {Rd}, Rn, Rm

SMLA<x><y>{cond} Rd, Rn, Rm, Ra

各パラメータには以下の意味があります。

<x> B または T を指定します。Rn の下位ビット(ビット [15:0])を使用する場

合は B を、Rn の上位ビット(ビット [31:16])を使用する場合は T を指定

します。

<y> B または T を指定します。Rm の下位ビット(ビット [15:0])を使用する場

合は B を、Rm の上位ビット(ビット [31:16])を使用する場合は T を指定

します。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Rn?Rm 乗算する値を保持するレジスタを指定します。

Ra 加算する値を保持するレジスタを指定します。

使用法

Rd、Rn、Rm、および Ra に PC は指定できません。

SMULxy 命令は、Rn と Rm の指定された上位半分または下位半分の 16 ビット符号付き整

数を乗算し、32 ビットの演算結果を Rd に返します。

SMLAxy 命令は、Rn と Rm の指定された上位半分または下位半分の 16 ビット符号付き整

数を乗算し、32 ビットの演算結果を Ra の 32 ビット値に加算し、その結果を Rd に返

します。

条件フラグ

これらの命令による N、Z、C、または V フラグへの影響はありません。

累算中にオーバーフローが発生した場合、SMLAxy によって Q フラグが設定されます。

Q フラグの状態を読み出すには、MRS 命令を使用します。

注 SMLAxy によって Q フラグがクリアされることはありません。Q フラグをクリアするに

は、MSR 命令を使用します。

アーキテクチャ

これらの ARM 命令は、ARMv6 以降、および ARMv5T の E バリアントで使用できま

す。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-87ID 011811 Non-Confidential

Page 122: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

SMULTBEQ r8, r7, r9 SMLABBNE r0, r2, r1, r10 SMLABT r0, r0, r3, r5

関連項目

リファレンス:

• 「MRS」 (ページ 3-145)

• 「MSR」 (ページ 3-147)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-88ID 011811 Non-Confidential

Page 123: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.5.4 SMULWy、SMLAWy

符号付きワイド乗算と符号付きワイド積和を実行します(32 ビット× 16 ビットを実

行し、演算結果の上位 32 ビットを返します)。

構文

SMULW<y>{cond} {Rd}, Rn, Rm

SMLAW<y>{cond} Rd, Rn, Rm, Ra

各パラメータには以下の意味があります。

<y> B または T を指定します。Rm の下位ビット(ビット [15:0])を使用する場

合は B を、Rm の上位ビット(ビット [31:16])を使用する場合は T を指定

します。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Rn?Rm 乗算する値を保持するレジスタを指定します。

Ra 加算する値を保持するレジスタを指定します。

使用法

Rd、Rn、Rm、および Ra に PC は指定できません。

SMULWy 命令は、Rm の指定された上位半分または下位半分の符号付き整数と、Rn の符号

付き整数を乗算し、48 ビットの演算結果の上位 32 ビットを Rd に返します。

SMLAWy 命令は、Rm の選択された上位半分または下位半分の符号付き整数と Rn の符号

付き整数を乗算し、32 ビットの演算結果を Ra 32 ビット値に加算し、その結果を Rd に返します。

条件フラグ

これらの命令による N、Z、C、または V フラグへの影響はありません。

累算中にオーバーフローが発生した場合、SMLAWy によって Q フラグが設定されます。

アーキテクチャ

これらの ARM 命令は、ARMv6 以降、および ARMv5T の E バリアントで使用できま

す。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス:

• 「MRS」 (ページ 3-145)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-89ID 011811 Non-Confidential

Page 124: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.5.5 SMLALxy

16 ビットオペランドと 64 ビットのアキュムレータを使った符号付き積和命令です。

構文

SMLAL<x><y>{cond} RdLo, RdHi, Rn, Rm

各パラメータには以下の意味があります。

<x> B または T を指定します。Rn の下位ビット(ビット [15:0])を使用する場

合は B を、Rn の上位ビット(ビット [31:16])を使用する場合は T を指定

します。

<y> B または T を指定します。Rm の下位ビット(ビット [15:0])を使用する場

合は B を、Rm の上位ビット(ビット [31:16])を使用する場合は T を指定

します。

cond 任意の条件コードを指定します。

RdLo?RdHi デスティネーションレジスタを指定します。これらのレジスタは累算値

も保持します。RdHi と RdLo には、それぞれ異なるレジスタを指定する必

要があります。

Rn?Rm 乗算する値を保持するレジスタを指定します。

RdLo、RdHi、Rn、および Rm に PC は指定できません。

使用法

SMLALxy 命令は、Rm の指定された上位半分または下位半分の符号付き整数を、Rn の指

定された上位半分または下位半分の符号付き整数と乗算し、32 ビットの演算結果を RdHi と RdLo が保持する 64 ビット値に加算します。

条件フラグ

この命令によるフラグへの影響はありません。

注 SMLALxy 命令によって例外が発生することはありません。この命令でオーバーフロー

が発生すると、警告がないまま演算結果の一部が溢れた桁によって上書きされます。

アーキテクチャ

この ARM 命令は、ARMv6 以降、および ARMv5T の E バリアントで使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

この命令の 16 ビット Thumb バージョンはありません。

SMLALTB r2, r3, r7, r1 SMLALBTVS r0, r1, r9, r2

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-90ID 011811 Non-Confidential

Page 125: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-91ID 011811 Non-Confidential

Page 126: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.5.6 SMUAD{X}、SMUSD{X}

任意でオペランドの半分を交換できる、デュアル 16 ビット符号付き積和命令と積差

命令です。

構文

op{X}{cond} {Rd}, Rn, Rm

各パラメータには以下の意味があります。

op 次のいずれかを指定します。

SMUAD デュアル乗算後に積を加算します。

SMUSD デュアル乗算後に積を減算します。

X 任意に指定できるパラメータです。X が指定されている場合は、乗算が

行われる前に、第 2 オペランドの上位ハーフワードと下位ハーフワード

が入れ替わります。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Rn?Rm オペランドを保持するレジスタを指定します。

Rd、Rn、および Rm に PC は指定できません。

使用法

SMUAD は Rn の下位ハーフワードと Rm の下位ハーフワードを乗算し、Rn の上位ハーフ

ワードと Rm の上位ハーフワードを乗算します。次に、得られた 2 つの積を加算し、

その合計を Rd にストアします。

SMUSD は Rn の下位ハーフワードと Rm の下位ハーフワードを乗算し、Rn の上位ハーフ

ワードと Rm の上位ハーフワードを乗算します。次に、 初の積から 2 番目の積を減

算し、その差を Rd にストアします。

条件フラグ

加算がオーバーフローした場合、SMUAD 命令によって Q フラグが設定されます。

アーキテクチャ

これらの ARM 命令は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

SMUAD r2, r3, r2 SMUSDXNE r0, r1, r2

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-92ID 011811 Non-Confidential

Page 127: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-93ID 011811 Non-Confidential

Page 128: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.5.7 SMMUL、SMMLA、SMMLS

符号付き上位ワード乗算命令、符号付き上位ワード乗算命令の累算、符号付き上位ワード乗算命令の減算です。これらの命令は 32 ビットオペランド間での演算結果か

ら上位 32 ビットのみを使用します。

構文

SMMUL{R}{cond} {Rd}, Rn, Rm

SMMLA{R}{cond} Rd, Rn, Rm, Ra

SMMLS{R}{cond} Rd, Rn, Rm, Ra

各パラメータには以下の意味があります。

R 任意に指定できるパラメータです。R が指定されている場合は演算結果

の丸めが行われ、指定されていない場合は切り捨てられます。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Rn?Rm オペランドを保持するレジスタを指定します。

Ra 加算する値または引かれる値を保持するレジスタを指定します。

Rd、Rn、Rm、および Ra に PC は指定できません。

演算

SMMUL は Rn と Rm の値を乗算し、64 ビットの結果の上位 32 ビットを Rd にストアしま

す。

SMMLA は、Rn と Rm の値を乗算し、その積の上位 32 ビットに Ra の値を加算して、その

結果を Rd にストアします。

SMMLS は、Rn と Rm の値を乗算して得られた積を、32 ビット左シフトした Ra の値から

減算し、結果の上位 32 ビットを Rd にストアします。

オプションの R パラメータが指定されている場合は、上位 32 ビットを取り出す前に 0x80000000 が加算されます。この処理によって結果の丸めが行われます。

条件フラグ

これらの命令によるフラグへの影響はありません。

アーキテクチャ

これらの ARM 命令は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-94ID 011811 Non-Confidential

Page 129: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

SMMULGE r6, r4, r3 SMMULR r2, r2, r2

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-95ID 011811 Non-Confidential

Page 130: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.5.8 SMLAD、SMLSD

デュアル 16 ビット符号付き乗算を実行し、積の加算または減算と、32 ビットの積算

を行う命令です。

構文

op{X}{cond} Rd, Rn, Rm, Ra

各パラメータには以下の意味があります。

op 次のいずれかを指定します。

SMLAD デュアル乗算を行い、積の和を累算します。

SMLSD デュアル乗算を行い、積の差を累算します。

cond 任意の条件コードを指定します。

X 任意に指定できるパラメータです。X が指定されている場合は、乗算が

行われる前に、第 2 オペランドの上位ハーフワードと下位ハーフワード

が入れ替わります。

Rd デスティネーションレジスタを指定します。

Rn?Rm オペランドを保持するレジスタを指定します。

Ra 累算オペランドを保持するレジスタを指定します。

Rd、Rn、Rm、および Ra に PC は指定できません。

演算

SMLAD は Rn の下位ハーフワードと Rm の下位ハーフワードを乗算し、Rn の上位ハーフ

ワードと Rm の上位ハーフワードを乗算します。次に、得られた 2 つの積を Ra の値に

加算し、その結果を Rd にストアします。

SMLSD は Rn の下位ハーフワードと Rm の下位ハーフワードを乗算し、Rn の上位ハーフ

ワードと Rm の上位ハーフワードを乗算します。次に、 初の積から 2 番目の積を減

算し、その差を Ra の値に加算して、結果を Rd にストアします。

条件フラグ

これらの命令によるフラグへの影響はありません。

アーキテクチャ

これらの ARM 命令は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

SMLSD r1, r2, r0, r7 SMLSDX r11, r10, r2, r3 SMLADLT r1, r2, r4, r1

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-96ID 011811 Non-Confidential

Page 131: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-97ID 011811 Non-Confidential

Page 132: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.5.9 SMLALD、SMLSLD

デュアル 16 ビット符号付き乗算を実行し、積の加算または減算と、64 ビットの積算

を行う命令です。

構文

op{X}{cond} RdLo, RdHi, Rn, Rm

各パラメータには以下の意味があります。

op 次のいずれかを指定します。

SMLALD デュアル乗算を行い、積の和を累算します。

SMLSLD デュアル乗算を行い、積の差を累算します。

X 任意に指定できるパラメータです。X が指定されている場合は、乗算が

行われる前に、第 2 オペランドの上位ハーフワードと下位ハーフワード

が入れ替わります。

cond 任意の条件コードを指定します。

RdLo?RdHi 64 ビットの結果を保持するデスティネーションレジスタを指定します。

これらのレジスタには、64 ビットの累算オペランドも保持されます。

RdHi と RdLo には、それぞれ異なるレジスタを指定する必要があります。

Rn?Rm オペランドを保持するレジスタを指定します。

RdLo、RdHi、Rn、および Rm に PC は指定できません。

演算

SMLALD は Rn の下位ハーフワードと Rm の下位ハーフワードを乗算し、Rn の上位ハーフ

ワードと Rm の上位ハーフワードを乗算します。次に、得られた 2 つの積を RdLo、RdHi の値に加算し、その合計を RdLo?RdHi にストアします。

SMLSLD は Rn の下位ハーフワードと Rm の下位ハーフワードを乗算し、Rn の上位ハーフ

ワードと Rm の上位ハーフワードを乗算します。次に、 初の積から 2 番目の積を減

算し、その差を RdLo?RdHi の値に加算して、結果を RdLo?RdHi にストアします。

条件フラグ

これらの命令によるフラグへの影響はありません。

アーキテクチャ

これらの ARM 命令は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

SMLALD r10, r11, r5, r1 SMLSLD r3, r0, r5, r1

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-98ID 011811 Non-Confidential

Page 133: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-99ID 011811 Non-Confidential

Page 134: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.5.10 UMAAL

符号なし積和累算 long 命令です。

構文

UMAAL{cond} RdLo, RdHi, Rn, Rm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

RdLo?RdHi 64 ビットの結果を保持するデスティネーションレジスタを指定します。

これらのレジスタには、32 ビットの 2 つの累算オペランドも保持されま

す。RdLo と RdHi には、それぞれ異なるレジスタを指定する必要がありま

す。

Rn?Rm 乗算オペランドを保持するレジスタを指定します。

RdLo、RdHi、Rn、および Rm に PC は指定できません。

演算

UMAAL は Rn と Rm の 32 ビット値を乗算し、RdHi と RdLo の 2 つの 32 ビット値を加算し、

その 64 ビットの結果を RdLo?RdHi にストアします。

条件フラグ

この命令によるフラグへの影響はありません。

アーキテクチャ

この ARM 命令は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

この命令の 16 ビット Thumb バージョンはありません。

UMAAL r8, r9, r2, r3 UMAALGE r2, r0, r5, r3

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-100ID 011811 Non-Confidential

Page 135: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.5.11 MIA、MIAPH、MIAxy

内部積和命令です(32 ビット× 32 ビットを実行し、40 ビットの累算値を返します)。

パックハーフワードの内部積和命令です(16 ビット× 16 ビット× 2 を実行し、40 ビットの累算値を返します)。

内部積和命令です(16 ビット× 16 ビットを実行し、40 ビットの累算値を返します)。

構文

MIA{cond} Acc, Rn, Rm

MIAPH{cond} Acc, Rn, Rm

MIA<x><y>{cond} Acc, Rn, Rm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Acc 内部アキュムレータを指定します。標準名は accx で、x は 0 ~ n の整数

です。n の値はプロセッサによって異なります。現在のプロセッサでは 0 が使用されています。

Rn?Rm 乗算する値を保持する ARM レジスタを指定します。

Rn および Rm に PC は指定できません。

<x><y> 次のいずれかを指定します。BB、BT、TB、TT。

使用法

MIA は Rn と Rm の符号付き整数を乗算し、演算結果を Acc の 40 ビット値に加算します。

MIAPH は Rn と Rm の下位半分の符号付き整数の乗算、および Rn と Rm の上位半分の符号

付き整数の乗算を行い、32 ビットの 2 つの結果を Acc の 40 ビット値に加算します。

MIAxy 命令は Rs の指定された上位半分または下位半分の符号付き整数と Rm の指定され

た上位半分または下位半分の符号付き整数を乗算し、32 ビットの結果を Acc の 40 ビット値に加算します。Rn の下位ビット(ビット [15:0])を使用する場合は <x> == B を、Rn の上位ビット(ビット [31:16])を使用する場合は <x> == T を指定します。Rm の下位ビット(ビット [15:0])を使用する場合は <y> == B を、Rm の上位ビット(ビット [31:16])を使用する場合は <y> == T を指定します。

条件フラグ

これらの命令によるフラグへの影響はありません。

注 これらの命令によって例外が発生することはありません。これらの命令でオーバー

フローが発生すると、警告がないまま演算結果の一部が溢れた桁によって上書きされます。

アーキテクチャ

これらの ARM コプロセッサ 0 命令は、XScale プロセッサでのみ使用できます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-101ID 011811 Non-Confidential

Page 136: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

これらの命令の Thumb バージョンはありません。

MIA acc0,r5,r0 MIALE acc0,r1,r9 MIAPH acc0,r0,r7 MIAPHNE acc0,r11,r10 MIABB acc0,r8,r9 MIABT acc0,r8,r8 MIATB acc0,r5,r3 MIATT acc0,r0,r6 MIABTGT acc0,r2,r5

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-102ID 011811 Non-Confidential

Page 137: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.6 サチュレート命令

このセクションは以下のサブセクションから構成されています。

• 「サチュレート算術演算」

• 「QADD、QSUB、QDADD、QDSUB」 (ページ 3-104)• 「SSAT、USAT」 (ページ 3-106)

一部の並列命令もサチュレート命令です。

3.6.1 サチュレート算術演算

以下の演算がサチュレート(SAT)演算です。つまり、サチュレート命令に応じて、

2n の値は以下のようになります。

• 符号付きサチュレート演算では、結果が -2n 未満の場合には、返される結果は -2n になります。

• 符号なしサチュレート演算では、結果が負となる場合には、返される結果はゼロとなります。

• 結果が 2n - 1 よりも大きい場合には、返される結果は 2n - 1 となります。

上記のいずれかに当てはまる演算をサチュレーションと呼びます。一部の命令では、サチュレーションが発生すると Q フラグを設定します。

注 サチュレーションが発生しない場合に、サチュレート命令によって Q フラグがクリ

アされることはありません。Q フラグをクリアするには、MSR 命令を使用します。

Q フラグは、他の 2 つの命令によっても設定できますが、それらの命令はサチュレー

トしません。

関連項目

リファレンス:

• 「MSR」 (ページ 3-147)

• 「SMULxy、SMLAxy」 (ページ 3-87)

• 「SMULWy、SMLAWy」 (ページ 3-89)

• 「並列命令」 (ページ 3-108)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-103ID 011811 Non-Confidential

Page 138: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.6.2 QADD、QSUB、QDADD、QDSUB

–231 ≤ x ≤ 231–1 の符号付き範囲で演算結果をサチュレートさせる、符号付き加算、減

算、倍演算と加算、および倍演算と減算です。

構文

op{cond} {Rd}, Rm, Rn

各パラメータには以下の意味があります。

op QADD、QSUB、QDADD、QDSUB のいずれかを指定します。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Rm?Rn オペランドを保持するレジスタを指定します。

Rd、Rm、および Rn に PC は指定できません。

使用法

QADD 命令は Rm と Rn の値を加算します。

QSUB 命令は Rm の値から Rn の値を減算します。

QDADD 命令は SAT?Rm + SAT?Rn * 2?? を計算します。倍演算、加算、あるいはその両方

で、サチュレーションが発生する可能性があります。倍演算でサチュレーションが発生し、かつ加算では発生しない場合、Q フラグは設定されますが、 終結果はサ

チュレートしていません。

QDSUB 命令は SAT?Rm - SAT?Rn * 2?? を計算します。倍演算、減算、あるいはその両方

で、サチュレーションが発生する可能性があります。倍演算でサチュレーションが発生し、かつ減算では発生しない場合、Q フラグは設定されますが、 終結果はサ

チュレートしていません。

注 これらの命令では、すべての値が 2 の補数の符号付き整数として処理されます。

条件フラグ

サチュレーションが発生すると、これらの命令によって Q フラグが設定されます。Q フラグの状態を読み出すには、MRS 命令を使用します。

アーキテクチャ

これらの ARM 命令は、ARMv6 以降、および ARMv5T の E バリアントで使用できま

す。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-104ID 011811 Non-Confidential

Page 139: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

QADD r0, r1, r9 QDSUBLT r9, r0, r1

関連項目

リファレンス:

• 「並列加算と並列減算」 (ページ 3-109)

• 「MRS」 (ページ 3-145)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-105ID 011811 Non-Confidential

Page 140: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.6.3 SSAT、USAT

任意のビット位置に対する符号付きサチュレート命令と符号なしサチュレート命令です。オプションとして、サチュレート前にシフトを実行できます。

SSAT は、符号付きの値を符号付き範囲内でサチュレートします。

USAT は、符号付きの値を符号なし範囲内でサチュレートします。

構文

op{cond} Rd, #sat, Rm{, shift}

各パラメータには以下の意味があります。

op SSAT または USAT を指定します。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。Rd に PC は指定できません。

sat サチュレートさせるビット位置を指定します。SSAT の場合は 1 ~ 32、USAT の場合は 0 ~ 31 の値となります。

Rm オペランドを格納するレジスタを指定します。Rm に PC は指定できませ

ん。

shift 任意に指定できるシフトです。以下のいずれかを指定する必要がありま

す。

ASR #n n の範囲は 1 ~ 32(ARM)または 1 ~ 31(Thumb)です。

LSL #n n の範囲は 0 ~ 31 です。

演算

SSAT 命令は指定されたシフトを行い、その後に符号付き範囲 –2sat–1 ≤ x ≤ 2sat–1 –1 でサ

チュレートします。

USAT 命令は指定されたシフトを行い、その後に符号なし範囲 0 ≤ x ≤ 2sat – 1 でサチュ

レートします。

条件フラグ

サチュレーションが発生すると、これらの命令によって Q フラグが設定されます。Q フラグの状態を読み出すには、MRS 命令を使用します。

アーキテクチャ

これらの ARM 命令は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

SSAT r7, #16, r7, LSL #4 USATNE r0, #7, r5

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-106ID 011811 Non-Confidential

Page 141: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

関連項目

リファレンス:

• 「SSAT16、USAT16」 (ページ 3-114)

• 「MRS」 (ページ 3-145)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-107ID 011811 Non-Confidential

Page 142: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.7 並列命令

このセクションは以下のサブセクションから構成されています。

• 「並列加算と並列減算」 (ページ 3-109)

バイト単位およびハーフワード単位のさまざまな加算と減算です。

• 「USAD8、USADA8」 (ページ 3-112)

符号なし絶対差の和と符号なし絶対差の和の累算です。

• 「SSAT16、USAT16」 (ページ 3-114)

並列ハーフワードサチュレート命令です。

この他に、SXT、SXTA、UXT、UXTA などの並列展開命令もあります。

関連項目

リファレンス:

• 「SXT、SXTA、UXT、UXTA」 (ページ 3-119)

• 「パック命令と展開命令」 (ページ 3-116)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-108ID 011811 Non-Confidential

Page 143: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.7.1 並列加算と並列減算

バイト単位およびハーフワード単位のさまざまな加算と減算です。

構文

<prefix>op{cond} {Rd}, Rn, Rm

各パラメータには以下の意味があります。

<prefix> 次のいずれかを指定します。

S 符号付き余り算術演算 28 または 216 です。APSR の GE フラグ

が設定されます。

Q 符号付きサチュレート算術演算です。

SH 符号付き算術演算を行い、結果を半分にします。

U 符号なし余り算術演算 28 または 216 です。APSR の GE フラグ

が設定されます。

UQ 符号なしサチュレート算術演算です。

UH 符号なし算術演算を行い、結果を半分にします。

op 次のいずれかを指定します。

ADD8 バイト単位の加算。

ADD16 ハーフワード単位の加算。

SUB8 バイト単位の減算。

SUB16 ハーフワード単位の減算。

ASX Rm のハーフワードを交換し、上位ハーフワードの加算と下位

ハーフワードの減算を行います。

SAX Rm のハーフワードを交換し、上位ハーフワードの減算と下位

ハーフワードの加算を行います。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。Rd に PC は指定できません。

Rm?Rn オペランドを保持する ARM レジスタを指定します。Rm および Rn に PC は指定できません。

演算

これらの命令は、オペランドのバイトまたはハーフワードに対し、個別に算術演算を実行します。2 つか 4 つの加算または減算、あるいは 1 つの加算と 1 つの減算を実

行します。

以下のようなさまざまな種類の演算を選択できます。

• 28 または 216 の符号付き / 符号なし余りの算術演算。これにより APSR の GE フラグが設定されます。

• 符号付き範囲 –215 ≤ x ≤ 215 –1 または –27 ≤ x ≤ 27 –1 のいずれかに対する符号付き

サチュレート算術演算。これらの演算がサチュレートする場合でも Q フラグへ

の影響はありません。

• 符号なし範囲 0 ≤ x ≤ 216 –1 または 0 ≤ x ≤ 28 –1 のいずれかに対する符号なしサ

チュレート算術演算。これらの演算がサチュレートする場合でも Q フラグへの

影響はありません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-109ID 011811 Non-Confidential

Page 144: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

• 符号付き / 符号なし算術演算。結果は二分されます。これによってオーバーフ

ローが発生することはありません。

条件フラグ

これらの命令による N、Z、C、V、または Q フラグへの影響はありません。

これらの命令に接頭文字 Q、SH、UQ、および UH を使用した場合でも、フラグへの影響

はありません。

これらの命令に接頭文字 S と U を使用した場合は、APSR の GE フラグが以下のよう

に設定されます。

• バイト単位の演算では、GE フラグは 32 ビットの SUB および ADD 命令における C(キャリー)フラグと同様の方法で使用されます。

GE[0] 結果のビット [7:0] に対応します。

GE[1] 結果のビット [15:8] に対応します。

GE[2] 結果のビット [23:16] に対応します。

GE[3] 結果のビット [31:24] に対応します。

• ハーフワード単位の演算では、GE フラグは通常のワード単位の SUB 命令および ADD 命令における C(キャリー)フラグと同様の方法で使用されます。

GE[1:0] 結果のビット [15:0] に対応します。

GE[3:2] 結果のビット [31:16] に対応します。

これらのフラグを使用して、次に続く SEL 命令を制御できます。

注 ハーフワード単位の演算では、GE[1:0] が同時にセットまたはクリアされ、GE[3:2] が同時にセットまたはクリアされます。

アーキテクチャ

これらの ARM 命令は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

SHADD8 r4, r3, r9 USAXNE r0, r0, r2

誤用例

QHADD r2, r9, r3 ; こ のよ う な命令は存在しない。 QHADD8 または QHADD16 を使用する必

要がある。 SAX r10, r8, r5 ; 接頭文字が必要。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-110ID 011811 Non-Confidential

Page 145: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

関連項目

リファレンス:

• 「SEL」 (ページ 3-74)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-111ID 011811 Non-Confidential

Page 146: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.7.2 USAD8、USADA8

符号なし絶対差の和と符号なし絶対差の和の累算です。

構文

USAD8{cond} {Rd}, Rn, Rm

USADA8{cond} Rd, Rn, Rm, Ra

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Rn 第 1 オペランドを保持するレジスタを指定します。

Rm 第 2 オペランドを保持するレジスタを指定します。

Ra 累算オペランドを保持するレジスタを指定します。

Rd、Rn、Rm、および Ra に PC は指定できません。

演算

USAD8 命令は、Rn と Rm のそれぞれ対応するバイトの符号なし値に基づいて、4 つのバ

イトの差分を取ります。この命令は、4 つの差分の絶対値を加算し、その結果を Rd に保存します。

USADA8 命令は、4 つの差分の絶対値を Ra の値に加算し、その結果を Rd に保存します。

条件フラグ

これらの命令によるフラグへの影響はありません。

アーキテクチャ

これらの ARM 命令は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

USAD8 r2, r4, r6 USADA8 r0, r3, r5, r2 USADA8VS r0, r4, r0, r1

誤用例

USADA8 r2, r4, r6 ; USADA8 には 4 つのレジス タ が必要

USADA16 r0, r4, r0, r1 ; こ のよ う な命令は存在しない

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-112ID 011811 Non-Confidential

Page 147: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-113ID 011811 Non-Confidential

Page 148: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.7.3 SSAT16、USAT16

並列ハーフワードサチュレート命令です。

SSAT16 は、符号付きの値を符号付き範囲内でサチュレートします。

USAT16 は、符号付きの値を符号なし範囲内でサチュレートします。

構文

op{cond} Rd, #sat, Rn

各パラメータには以下の意味があります。

op 次のいずれかを指定します。

SSAT16 符号付きサチュレーションを実行します。

USAT16 符号なしサチュレーションを実行します。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

sat サチュレートさせるビット位置を指定します。SSAT16 の場合は 1 ~ 16、USAT16 の場合は 0 ~ 15 の値となります。

Rn オペランドを保持するレジスタを指定します。

Rd および Rn に PC は指定できません。

演算

任意のビット位置に対してハーフワード単位の符号付き / 符号なしサチュレーション

を実行します。

SSAT16 命令は、符号付き範囲 –2sat–1 ≤ x ≤ 2sat–1 –1 で、各符号付きハーフワードをサ

チュレートします。

USAT16 命令は、符号なし範囲 0 ≤ x ≤ 2sat –1 で、各符号付きハーフワードをサチュレー

トします。

条件フラグ

いずれかのハーフワードに対するサチュレーションが発生すると、これらの命令によって Q フラグが設定されます。Q フラグの状態を読み出すには、MRS 命令を使用し

ます。

アーキテクチャ

これらの ARM 命令は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-114ID 011811 Non-Confidential

Page 149: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

SSAT16 r7, #12, r7 USAT16 r0, #7, r5

誤用例

SSAT16 r1, #16, r2, LSL #4 ; シ フ ト と ハー フ ワー ドサチ ュ レーシ ョ ンは一緒に指定できない

関連項目

リファレンス:

• 「MRS」 (ページ 3-145)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-115ID 011811 Non-Confidential

Page 150: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.8 パック命令と展開命令

このセクションは以下のサブセクションから構成されています。

• 「BFC、BFI」 (ページ 3-117)

ビットフィールドのクリア命令と挿入命令です。

• 「SBFX、UBFX」 (ページ 3-118)

符号付き / 符号なしビットフィールドの抽出命令です。

• 「SXT、SXTA、UXT、UXTA」 (ページ 3-119)

必要に応じて加算命令を伴う、符号拡張命令またはゼロ拡張命令です。

• 「PKHBT、PKHTB」 (ページ 3-121)

ハーフワードパック命令です。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-116ID 011811 Non-Confidential

Page 151: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.8.1 BFC、BFI

ビットフィールドのクリア命令と挿入命令です。レジスタ内の隣接するビットをクリアするか、1 つのレジスタから別のレジスタに隣接するビットを挿入します。

構文

BFC{cond} Rd, #lsb, #width

BFI{cond} Rd, Rn, #lsb, #width

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。Rd に PC は指定できません。

Rn ソースレジスタを指定します。Rn に PC は指定できません。

lsb クリアまたはコピーする 下位ビットを指定します。

width クリアまたはコピーするビット数を指定します。width を 0 にはできませ

ん。また、(width+lsb)は 32 未満になる必要があります。

BFC

Rd の lsb から width ビット分のビットがクリアされます。Rd 内の他のビットは変更さ

れません。

BFI

width 分のビットが Rd の lsb からクリアされ、Rn のビット [0] から始まる width 分の

ビットによって置き換えられます。Rd 内の他のビットは変更されません。

条件フラグ

これらの命令によるフラグへの影響はありません。

アーキテクチャ

これらの ARM 命令は、ARMv6T2 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-117ID 011811 Non-Confidential

Page 152: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.8.2 SBFX、UBFX

符号付き / 符号なしビットフィールドの抽出命令です。隣接するビットをあるレジス

タから別のレジスタの 下位ビットにコピーし、32 ビットに符号拡張またはゼロ拡

張します。

構文

op{cond} Rd, Rn, #lsb, #width

各パラメータには以下の意味があります。

op SBFX または UBFX を指定します。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Rn ソースレジスタを指定します。

lsb ビットフィールドの 下位ビットのビット番号を 0 ~ 31 の範囲内で指

定します。

width ビットフィールドの幅を 1 ~(32–lsb)の範囲内で指定します。

Rd および Rn に PC は指定できません。

条件フラグ

これらの命令によるフラグへの影響はありません。

アーキテクチャ

これらの ARM 命令は、ARMv6T2 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-118ID 011811 Non-Confidential

Page 153: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.8.3 SXT、SXTA、UXT、UXTA

符号拡張、符号拡張と加算、ゼロ拡張、ゼロ拡張と加算。

構文

SXT<extend>{cond} {Rd}, Rm {,rotation}

SXTA<extend>{cond} {Rd}, Rn, Rm {,rotation}

UXT<extend>{cond} {Rd}, Rm {,rotation}

UXTA<extend>{cond} {Rd}, Rn, Rm {,rotation}

各パラメータには以下の意味があります。

<extend> 次のいずれかを指定します。

B16 2 つの 8 ビット値を 2 つの 16 ビット値に拡張します。

B 8 ビット値を 32 ビット値に拡張します。

H 16 ビット値を 32 ビット値に拡張します。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Rn 加算する数を保持するレジスタを指定します(SXTA と UXTA の場合のみ)。

Rm 拡張する値を保持するレジスタを指定します。

rotation 次のいずれかを指定します。

ROR #8 Rm の値が右に 8 ビットロテートされます。

ROR #16 Rm の値が右に 16 ビットロテートされます。

ROR #24 Rm の値が右に 24 ビットロテートされます。

rotation を省略した場合、ロテートは実行されません。

Rd、Rn、または Rm に PC を使用しないで下さい。

演算

これらの命令は以下の処理を行います。

1. Rm の値を右に 0 ビット、8 ビット、16 ビット、または 24 ビットロテートしま

す。

2. 取得した値に対して以下のいずれかの処理を行います。

• ビット [7:0] を抽出し、32 ビットに符号拡張またはゼロ拡張します。命令

で拡張と加算を行う場合は、Rn の値を加算します。

• ビット [15:0] を抽出し、32 ビットに符号拡張またはゼロ拡張します。命令

で拡張と加算を行う場合は、Rn の値を加算します。

• ビット [23:16] とビット [7:0] を抽出し、これらのビットを 16 ビットに符号

拡張またはゼロ拡張します。命令で拡張と加算を行う場合は、これらのビットをそれぞれ Rn のビット [31:16] とビット [15:0] に加算して、結果の

ビット [31:16] とビット [15:0] を作成します

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-119ID 011811 Non-Confidential

Page 154: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

条件フラグ

これらの命令によるフラグへの影響はありません。

16 ビット命令

これらの命令は、Thumb コード内では次の形式で使用できます。これらは 16 ビット

命令です。

SXTB Rd, Rm Rd と Rm は共に Lo レジスタである必要があります。

SXTH Rd, Rm Rd と Rm は共に Lo レジスタである必要があります。

UXTB Rd, Rm Rd と Rm は共に Lo レジスタである必要があります。

UXTH Rd, Rm Rd と Rm は共に Lo レジスタである必要があります。

アーキテクチャ

これらの ARM 命令は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

これらの 16 ビット Thumb 命令は、ARMv6 以降で使用できます。

SXTH r3, r9, r4 UXTAB16EQ r0, r0, r4, ROR #16

誤用例

SXTH r9, r3, r2, ROR #12 ; ロ テー ト の値は 0、 8、 16、 ま たは 24 である こ と。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-120ID 011811 Non-Confidential

Page 155: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.8.4 PKHBT、PKHTB

ハーフワードパック命令です。

あるレジスタに保持されているハーフワードと別のレジスタに保持されているハーフワードを結合します。オペランドの 1 つは、ハーフワードを抽出する前にシフト

できます。

構文

PKHBT{cond} {Rd}, Rn, Rm{, LSL #leftshift}

PKHTB{cond} {Rd}, Rn, Rm{, ASR #rightshift}

各パラメータには以下の意味があります。

PKHBT Rn のビット [15:0] とシフトされた Rm の値のビット [31:16] を結合します。

PKHTB Rn のビット [31:16] とシフトされた Rm の値のビット [15:0] を結合します。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。

Rn 第 1 オペランドを保持するレジスタを指定します。

Rm 第 1 オペランドを保持するレジスタを指定します。

leftshift 0 ~ 31 の範囲内にある値を指定します。

rightshift 1 ~ 32 の範囲内にある値を指定します。

Rd、Rn、および Rm に PC は指定できません。

条件フラグ

これらの命令によるフラグへの影響はありません。

アーキテクチャ

これらの ARM 命令は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。ARMv7-M アー

キテクチャでは、これらは ARMv7E-M 実装でだけ使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

PKHBT r0, r3, r5 ; R3 の下位ハー フ ワー ド と

; R5 の上位ハー フ ワー ド を結合する

PKHBT r0, r3, r5, LSL #16 ; R3 の下位ハー フ ワー ド と

; R5 の下位ハー フ ワー ド を結合する

PKHTB r0, r3, r5, ASR #16 ; R3 の上位ハー フ ワー ド と

; R5 の上位ハー フ ワー ド を結合する

また、異なるシフト値を使用して、第 2 オペランドを位取りすることもできます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-121ID 011811 Non-Confidential

Page 156: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

誤用例

PKHBTEQ r4, r5, r1, ASR #8 ; PKHBT では ASR を指定できない

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-122ID 011811 Non-Confidential

Page 157: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.9 分岐命令と制御命令

このセクションは以下のサブセクションから構成されています。

• 「B、BL、BX、BLX、BXJ」 (ページ 3-124)

分岐、リンク付き分岐、分岐と命令セットの切り替え、リンク付き分岐と命令セットの切り替え、および分岐と命令セットの Jazelle への変更を行う命令で

す。

• 「IT」 (ページ 3-127)

If-Then 命令です。IT 命令は、後続の 大 4 個の命令を条件付き命令にします。

その際に、条件はすべて同じにすることも、一部の命令に対しては条件を 1 つ設定し、残りの命令に対しては逆条件を設定することも可能です。IT は Thumb-2 でのみ使用できます。

• 「CBZ、CBNZ」 (ページ 3-130)

ゼロとの比較と分岐を行う命令です。これらの命令は、Thumb-2 でのみ使用で

きます。

• 「TBB、TBH」 (ページ 3-131)

テーブル分岐バイトとテーブル分岐ハーフワードです。これらの命令は、Thumb-2 でのみ使用できます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-123ID 011811 Non-Confidential

Page 158: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.9.1 B、BL、BX、BLX、BXJ

分岐、リンク付き分岐、分岐と命令セットの切り替え、リンク付き分岐と命令セットの切り替え、分岐と Jazelle 状態への変更を行う命令です。

構文

op1{cond}{.W} label

op2{cond} Rm

各パラメータには以下の意味があります。

op1 次のいずれかを指定します。

B 分岐命令です。

BL リンク付き分岐命令です。

BLX リンク付き分岐と命令セットの切り替えを行う命令です。

op2 次のいずれかを指定します。

BX 分岐と命令セットの切り替えを行う命令です。

BLX リンク付き分岐と命令セットの切り替えを行う命令です。

BXJ 分岐と Jazelle 実行状態への変更を行う命令です。

cond 任意の条件コードを指定します。cond は、これらの命令のすべての形式

で使用できるわけではありません。

.W Thumb-2 の 32 ビット B 命令を使用させるために命令の幅の指定子を指定

します(省略可)。

label PC 相対式を指定します。

Rm 分岐先アドレスを保持するレジスタを指定します。

演算

これらのすべての命令は、label への分岐または Rm に保持されているアドレスへの分

岐を発生させます。さらに、以下の処理を行います。

• BL と BLX 命令は、次の命令のアドレスを LR(R14:リンクレジスタ)にコピー

します。

• BX 命令と BLX 命令は、プロセッサ状態を ARM から Thumb に変更したり、

Thumb から ARM に変更したりできます。

BLX label を使用すると、状態が必ず変更されます。

BX Rm と BLX Rm を使用すると Rm のビット [0] からターゲットの状態を得ることが

できます。

— Rm のビット [0] が 0 の場合、プロセッサは ARM 状態に切り替わるか、

ARM 状態が維持されます。

— Rm のビット [0] が 1 の場合、プロセッサは Thumb 状態に切り替わるか、

Thumb 状態が維持されます。

• BXJ 命令はプロセッサの状態を Jazelle に変更します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-124ID 011811 Non-Confidential

Page 159: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

命令の使用可否と分岐の範囲

表 3-9 は、ARM 状態と Thumb 状態で使用できる命令を示しています。この表に記載

されていない命令は使用できません。括弧内は、命令を使用できるアーキテクチャの 初のバージョンを示しています。

分岐の範囲の拡張

マシンレベルの B 命令と BL 命令では、現在の命令のアドレスから分岐できる範囲が

制限されています。ただし、label が範囲外の場合でもこれらの命令を使用できます。

ほとんどの場合、リンカが label を配置する場所は分かりません。必要な場合には、

リンカはコードを追加してより長い分岐を可能にします。追加されたコードは veneer(ベニア)と呼ばれます。

Thumb の B

.W 幅指定子を指定して、B で Thumb-2 コードの 32 ビット命令を生成できます。

B.W は、16 ビット命令を使用してターゲットに到達できる場合でも、常に 32 ビット

命令を生成します。

表 3-9 分岐命令の使用可否と分岐の範囲

命令 ARM 16 ビットの Thumb 32 ビットの Thumb

B label ± 32MB (すべて) ± 2KB (すべての T)

± 16MBa (すべての T2)

B{cond} label ± 32MB (すべて) -252 ~ +258 (すべての T)

± 1MBa (すべての T2)

BL label ± 32MB (すべて) ± 4MB b (すべての T)

± 16MB (すべての T2)

BL{cond} label ± 32MB (すべて) - - -

BX Rm c 使用可能 (4T、5) 使用可能 (すべての T)

16 ビットを使用 (すべての T2)

BX{cond} Rm c 使用可能 (4T、5) - - -

BLX label ± 32MB (5) ± 4MB b (5T) ± 16MB (ARMv7-M を除くすべての T2)

BLX Rm 使用可能 (5) 使用可能 (5T) 16 ビットを使用 (すべての T2)

BLX{cond} Rm 使用可能 (5) - - -

BXJ Rm 使用可能 (5J、6) - 使用可能 (ARMv7-M を除くすべての T2)

BXJ{cond} Rm 使用可能 (5J、6) - - -

a. この 32 ビット命令を使用するようアセンブラに指定する場合は .W を使用します。

b. これは命令対です。

c. ARMv4 向けにアセンブルされたコードの場合、アセンブラは BX{cond} Rm を受け入れ、リンク時に MOV{cond} PC, Rm に変換します(ただし、ARMv4T をターゲットとするオブジェクトが存在しない場合)。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-125ID 011811 Non-Confidential

Page 160: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

参考として、32 ビット Thumb 命令を使用して到達できるターゲットで失敗が発生す

る場合でも、.W 指定なしの B は常に 16 ビット Thumb コードの命令を生成します。

Thumb-2EE での BX、BLX、および BXJ

これらの命令は、Thumb-2EE コード内で分岐として使用できますが、状態の変更に

は使用できません。この命令は op{cond} label 形式では Thumb-2EE. で使用できませ

ん。レジスタ形式では Rm のビット [0] が 1 になっている必要があり、ターゲットアド

レスでの実行は ThumbEE 状態で継続します。

注 BXJ は、Thumb-2EE では BX と同様に機能します。

条件フラグ

これらの命令によるフラグへの影響はありません。

アーキテクチャ

各アーキテクチャでのこれらの命令の使用可否の詳細については、表 3-9 (ページ 3-125)を参照して下さい。

B loopA BLE ng+8 BL subC BLLT rtX BEQ {PC}+4 ; #0x8004

関連項目

概念:

『アセンブラの使用』:

• 「レジスタ相対式と PC 相対式」 (ページ 8-7)

『リンカの使用』:

• 第 4 章 イメージの構造と生成

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-126ID 011811 Non-Confidential

Page 161: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.9.2 IT

IT(If-Then)命令は、後続の 大 4 個の命令(IT ブロック)を条件付き命令にしま

す。条件はすべて同じにすることも、論理的に逆の条件を混在させることも可能です。

構文

IT{x{y{z}}} {cond}

各パラメータには以下の意味があります。

x IT ブロックで 2 番目の命令の条件スイッチを指定します。

y IT ブロックで 3 番目の命令の条件スイッチを指定します。

z IT ブロックで 4 番目の命令の条件スイッチを指定します。

cond IT ブロックで 初の命令の条件を指定します。

IT ブロックで 2 ~ 4 番目の命令の条件スイッチは、以下のいずれかにすることがで

きます。

T Then。条件 cond を命令に適用します。

E Else。cond の逆条件を命令に適用します。

使用法

BKPT 命令を除き、IT ブロック内の命令(分岐も含む)では、構文の {cond} の部分の

条件を指定する必要があります。

コード内に IT 命令を記述する必要はありません。後続の命令に指定された条件に

従って、アセンブラにより自動的に生成されるからです。ただし、IT 命令を記述す

ると、アセンブラは IT 命令に指定された条件を、後続の命令に指定された条件と突

き合わせて検証します。

IT 命令を記述すると、コード設計における条件付き命令の配置および条件の選択を

確実に検討することができるようになります。

ARM コードにアセンブルするときにも、アセンブラは同じチェックを行いますが、

IT 命令は生成しません。

16 ビット命令は通常は条件コードフラグに影響を及ぼしますが、IT ブロック内で使

用されるときには影響を及ぼしません。ただし、CMP、CMN、および TST は例外です。

IT ブロック内の BKPT 命令は必ず実行されるため、構文の {cond} の部分で条件を指定

する必要はありません。IT ブロックは次の命令から継続されます。

注 AL 条件を使用することによって、無条件命令に対しても IT ブロックを使用すること

ができます。

条件分岐の分岐の範囲は、IT ブロック内の方が IT ブロック外より長くなります。

制約条件

IT ブロック内では、以下の命令を使用できません。

• IT

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-127ID 011811 Non-Confidential

Page 162: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

• CBZ および CBNZ• TBB および TBH• CPS、CPSID、および CPSIE• SETEND

IT ブロック使用時のその他の制約条件は、以下のとおりです。

• 分岐または PC を変更する命令が、ブロック内で 後の命令である場合、使用

できるのは IT ブロック内に限られます。

• 例外ハンドラから復帰する場合でない限り、IT ブロック内ではどの命令にも分

岐できません。

• IT ブロック内でアセンブラディレクティブを使用することはできません。

注 これらの命令のいずれかが IT ブロック内で使用されている場合、診断メッセージが

表示されます。

条件フラグ

この命令によるフラグへの影響はありません。

例外

IT 命令とそれに対応する IT ブロックの間、または IT ブロックの内部で例外が発生す

る場合があります。例外が発生すると、適切な例外ハンドラが開始され、適切な復帰情報が LR と SPSR に格納されます。

例外からの復帰に使用する目的で設計された命令は、例外から復帰するために通常どおり使用可能であり、IT ブロックの実行は正常に再開されます。これは、プログ

ラムカウンタを変更する命令が、IT ブロック内の命令に分岐する唯一の方法です。

アーキテクチャ

この 16 ビット Thumb 命令は ARMv6T2 以降で使用できます。

ARM コードにおける IT は、コードを生成しない疑似命令です。

この命令の 32 ビットバージョンはありません。

ITTE NE ; IT は省略可能

ANDNE r0,r0,r1 ; 16 ビ ッ ト AND (ANDS ではない)

ADDSNE r2,r2,#1 ; 32 ビ ッ ト ADDS (16 ビ ッ ト ADDS の場合は IT ブ ロ ッ ク に フ ラ グは設定されな

い) MOVEQ r2,r3 ; 16 ビ ッ ト MOV

ITT AL ; フ ラ グ を設定しない 16 ビ ッ ト命令を 2 つ生成する

ADDAL r0,r0,r1 ; 16 ビ ッ ト ADD (ADDS ではない)

SUBAL r2,r2,#1 ; 16 ビ ッ ト SUB (SUB ではない)

ADD r0,r0,r1 ; 32 ビ ッ ト ADD に展開する。 IT ブ ロ ッ ク では使用しない

ITT EQ

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-128ID 011811 Non-Confidential

Page 163: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

MOVEQ r0,r1BEQ dloop ; IT ブ ロ ッ ク末尾での分岐は可能

ITT EQMOVEQ r0,r1BKPT #1 ; BKPT 命令は必ず実行されるADDEQ r0,r0,#1

誤用例

IT NE ADD r0,r0,r1 ; 構文エ ラ ー : IT ブ ロ ッ ク内で条件コードが使用されていない

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-129ID 011811 Non-Confidential

Page 164: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.9.3 CBZ、CBNZ

ゼロとの比較と分岐を行う命令です(ゼロまたはゼロでない場合に分岐します)。

構文

CBZ Rn, label

CBNZ Rn, label

各パラメータには以下の意味があります。

Rn オペランドを保持するレジスタを指定します。

label 分岐先を指定します。

使用法

CBZ 命令または CBNZ 命令を使用して、条件コードフラグの変更を防止し、命令数を削

減することができます。

条件コードフラグが変更されない点を除き、CBZ Rn, label は以下のコマンドと同じ意

味です。

CMP Rn, #0 BEQ label

条件コードフラグが変更されない点を除き、CBNZ Rn, label は以下のコマンドと同じ

意味です。

CMP Rn, #0 BNE label

制限

分岐先は、命令の後の 4 ~ 130 バイト以内に指定する必要があります。また、同じ実

行状態であることが必要です。

これらの命令は IT ブロック内では使用できません。

条件フラグ

これらの命令によるフラグへの影響はありません。

アーキテクチャ

これらの 16 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの命令の ARM バージョンおよび 32 ビット Thumb バージョンはありません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-130ID 011811 Non-Confidential

Page 165: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.9.4 TBB、TBH

テーブル分岐(バイト)とテーブル分岐(ハーフワード)。

構文

TBB [Rn, Rm]

TBH [Rn, Rm, LSL #1]

各パラメータには以下の意味があります。

Rn ベースレジスタを指定します。このレジスタには、分岐の長さテーブル

のアドレスが保持されます。Rn に SP は指定できません。

Rn に PC を指定している場合、使用される値は「命令のアドレス + 4」と

なります。

Rm インデクスレジスタを指定します。テーブル内の場所を指定するインデ

クスを保持します。

Rm に PC と SP は指定できません。

演算

これらの命令により、シングルバイトオフセット(TBB)またはハーフワードオフ

セット(TBH)のテーブルを使用した PC 相対の順方向の分岐が発生します。Rn はテー

ブルへのポインタを提供し、Rm はテーブル内のインデクスを提供します。分岐の長

さは、テーブルから返されたバイト(TBB)またはハーフワード(TBH)の値の 2 倍に

なります。分岐テーブルのターゲットは同じ実行状態である必要があります。

注釈

Thumb-2EE では、ベースレジスタの値が 0 の場合、HandlerBase - 4 にある NullCheck ハンドラへの分岐が実行されます。

アーキテクチャ

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの命令の ARM バージョンおよび 16 ビット Thumb バージョンはありません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-131ID 011811 Non-Confidential

Page 166: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.10 コプロセッサ命令

このセクションは以下のサブセクションから構成されています。

• 「CDP、CDP2」 (ページ 3-133)

コプロセッサデータ演算です。

• 「MCR、MCR2、MCRR、MCRR2」 (ページ 3-134)

コプロセッサ命令を使用した ARM レジスタからコプロセッサへの移動命令で

す。

• 「MRC、MRC2、MRRC、MRRC2」 (ページ 3-135)

コプロセッサ命令を使用したコプロセッサから ARM レジスタへの移動命令で

す。

• 「MSR」 (ページ 3-137)

ARM レジスタからシステムコプロセッサへの移動命令です。

• 「MRS」 (ページ 3-138)

システムコプロセッサから ARM レジスタへの移動命令です。

• 「SYS」 (ページ 3-139)

システムコプロセッサ命令を実行します。

• 「LDC、LDC2、STC、STC2」 (ページ 3-140)

メモリとコプロセッサ間のデータ転送命令です。

注 コプロセッサ命令は、指定されたコプロセッサが存在しないときやイネーブルにさ

れていないときに実行されると、未定義命令という例外が発生します。

このセクションでは、ベクタ浮動小数点およびワイヤレス MMX テクノロジの命令

については説明しません。XScale 固有の命令については本書の後半で説明します。

関連項目

参照 • 第 4 章 NEON と VFP プログラミング

• 第 5 章 ワイヤレス MMX テクノロジの命令

• 「その他の命令」 (ページ 3-142)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-132ID 011811 Non-Confidential

Page 167: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.10.1 CDP、CDP2

コプロセッサデータ演算です。

構文

op{cond} coproc, #opcode1, CRd, CRn, CRm{, #opcode2}

各パラメータには以下の意味があります。

op CDP または CDP2 を指定します。

cond 任意の条件コードを指定します。ARM コードでは、cond を CDP2 では使用できません。

coproc 命令が実行されるコプロセッサの名前を指定します。標準名は pn で、n は 0 ~ 15 の整数です。

opcode1 4 ビットコプロセッサ固有のオペコードを指定します。

opcode2 オプションとしての 3 ビットコプロセッサ固有のオペコードを指

定します。

CRd、 CRn、 CRm コプロセッサレジスタを指定します。

使用法

これらの命令の使用方法はコプロセッサによって異なります。詳細については、コプロセッサのマニュアルを参照して下さい。

アーキテクチャ

ARM 命令 CDP は、ARM アーキテクチャのすべてのバージョンで使用できます。

ARM 命令 CDP2 は、ARMv5T 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-133ID 011811 Non-Confidential

Page 168: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.10.2 MCR、MCR2、MCRR、MCRR2

ARM レジスタからコプロセッサへの移動命令です。コプロセッサによっては、さま

ざまな演算を追加で指定できる場合があります。

構文

op1{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2}

op2{cond} coproc, #opcode3, Rt, Rt2, CRm

各パラメータには以下の意味があります。

op1 MCR または MCR2 を指定します。

op2 MCRR または MCRR2 を指定します。

cond 任意の条件コードを指定します。ARM コードでは、cond を MCR2 または MCRR2 では使用できません。

coproc 命令が実行されるコプロセッサの名前を指定します。標準名は pn で、n は 0 ~ 15 の整数です。

opcode1 3 ビットコプロセッサ固有のオペコードを指定します。

opcode2 オプションとしての 3 ビットコプロセッサ固有のオペコードを指定しま

す。

opcode3 4 ビットコプロセッサ固有のオペコードを指定します。

Rt、 Rt2 ARM ソースレジスタを指定します。Rt および Rt2 に PC は指定できませ

ん。

CRn、 CRm コプロセッサレジスタを指定します。

使用法

これらの命令の使用方法はコプロセッサによって異なります。詳細については、コプロセッサのマニュアルを参照して下さい。

アーキテクチャ

ARM 命令 MCR は、ARM アーキテクチャのすべてのバージョンで使用できます。

ARM 命令 MCR2 は、ARMv5T 以降で使用できます。

ARM 命令 MCRR は、ARMv6 以降、および ARMv5T の E バリアントで使用できます。

ARM 命令 MCRR2 は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-134ID 011811 Non-Confidential

Page 169: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.10.3 MRC、MRC2、MRRC、MRRC2

コプロセッサから ARM レジスタへの移動命令です。

コプロセッサによっては、さまざまな演算を追加で指定できる場合があります。

構文

op1{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2}

op2{cond} coproc, #opcode3, Rt, Rt2, CRm

各パラメータには以下の意味があります。

op1 MRC または MRC2 を指定します。

op2 MRRC または MRRC2 を指定します。

cond 任意の条件コードを指定します。ARM コードでは、cond を MRC2 または MRRC2 では使用できません。

coproc 命令が実行されるコプロセッサの名前を指定します。標準名は pn で、n は 0 ~ 15 の整数です。

opcode1 3 ビットコプロセッサ固有のオペコードを指定します。

opcode2 オプションとしての 3 ビットコプロセッサ固有のオペコードを指定しま

す。

opcode3 4 ビットコプロセッサ固有のオペコードを指定します。

Rt、 Rt2 ARM デスティネーションレジスタを指定します。Rt および Rt2 に PC は指定できません。

MRC と MRC2 では Rt に APSR_nzcv も使用できます。つまり、コプロセッサ

は、APSR の条件コードフラグの値を変更する命令を実行します。

CRn、 CRm コプロセッサレジスタを指定します。

使用法

これらの命令の使用方法はコプロセッサによって異なります。詳細については、コプロセッサのマニュアルを参照して下さい。

アーキテクチャ

ARM 命令 MRC は、ARM アーキテクチャのすべてのバージョンで使用できます。

ARM 命令 MRC2 は、ARMv5T 以降で使用できます。

ARM 命令 MRRC は、ARMv6 以降、および ARMv5T の E バリアントで使用できます。

ARM 命令 MRRC2 は、ARMv6 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-135ID 011811 Non-Confidential

Page 170: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-136ID 011811 Non-Confidential

Page 171: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.10.4 MSR

ARM レジスタからシステムコプロセッサレジスタへの移動命令です。

構文

MSR{cond} coproc_register, Rn

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

coproc_register

コプロセッサレジスタの名前を指定します。

Rn ARM ソースレジスタを指定します。Rn に PC は指定できません。

使用法

この命令を使用すると、CP14 または CP15 コプロセッサの書き込み可能レジスタに

書き込むことができます。該当するすべてのコプロセッサレジスタの名前は、『ARMv7-AR アーキテクチャリファレンスマニュアル』に記載されています。以下に

例を示します。

MSR SCTLR, R1 ; R1 の内容を CP15 コ プ ロセ ッ サレジス タ

; SCTLR に書き込む

アーキテクチャ

この ARM 命令 MSR は、ARMv7-A および ARMv7-R で使用できます。

この 32 ビット Thumb 命令 MSR は、ARMv7-A および ARMv7-R で使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス:

• 「SYS」 (ページ 3-139)

• 「条件コード」 (ページ 3-173)

• 『ARM アーキテクチャリファレンスマニュアル』, http://infocenter.arm.com/help/topic/com.arm.doc.subset.arch.reference/index.html

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-137ID 011811 Non-Confidential

Page 172: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.10.5 MRS

システムコプロセッサレジスタから ARM レジスタへの移動命令です。

構文

MRS{cond} Rn, coproc_register

MRS{cond} APSR_nzcv, special_register

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

coproc_register

コプロセッサレジスタの名前を指定します。

special_register

APSR_nzcv に書き込むことのできるコプロセッサレジスタの名前を指定

します。コプロセッサレジスタ DBGDSCRint の場合にのみ使用できま

す。

Rn ARM デスティネーションレジスタを指定します。Rn に PC は指定できま

せん。

使用法

この命令を使用すると、CP14 または CP15 コプロセッサレジスタを読み取ることが

できます。ただし、書き込み専用レジスタは除きます。該当するすべてのコプロセッサレジスタの名前は、『ARMv7-AR アーキテクチャリファレンスマニュアル』に

記載されています。以下に例を示します。

MRS R1, SCTLR ; CP15 コ プ ロセ ッ サレジス タ SCTLR の内容を

; R1 に書き込む

アーキテクチャ

この ARM 命令 MRS は、ARMv7-A および ARMv7-R で使用できます。

この 32 ビット Thumb 命令 MRS は、ARMv7-A および ARMv7-R で使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

• 『ARM アーキテクチャリファレンスマニュアル』, http://infocenter.arm.com/help/topic/com.arm.doc.subset.arch.reference/index.html

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-138ID 011811 Non-Confidential

Page 173: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.10.6 SYS

システムコプロセッサ命令を実行します。

構文

SYS{cond} instruction{, Rn}

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

instruction

実行するコプロセッサ命令を指定します。

Rn 命令のオペランドを指定します。引数を取る命令の場合、Rn は必須で

す。引数を取らない命令の場合、Rn は省略可能です。これを指定しない

場合は R0 が使用されます。Rn に PC は指定できません。

使用法

この命令を使用すると、キャッシュ、分岐予測子、TLB 処理など、特別なコプロ

セッサ命令を実行できます。これらの命令は、特別な書き込み専用コプロセッサレジスタに書き込みを行います。命令の名前は書き込み専用コプロセッサレジスタの名前と同じであり、『ARMv7-AR アーキテクチャリファレンスマニュアル』に記載さ

れています。以下に例を示します。

SYS ICIALLUIS ; すべての命令キ ャ ッ シ ュ の Inner Shareable を Point; of Unification に無効化し、 分岐タ ーゲ ッ ト のキ ャ ッ シ ュ を ク リ アする

アーキテクチャ

ARM 命令 SYS は、ARMv7-A および ARMv7-R で使用できます。

32 ビット Thumb 命令 SYS は、ARMv7-A および ARMv7-R で使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-139ID 011811 Non-Confidential

Page 174: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.10.7 LDC、LDC2、STC、STC2

メモリとコプロセッサ間のデータ転送命令です。

構文

op{L}{cond} coproc, CRd, [Rn]

op{L}{cond} coproc, CRd, [Rn, #{-}offset] ; オ フ セ ッ ト ア ド レシン グ

op{L}{cond} coproc, CRd, [Rn, #{-}offset]! ; プ レ イ ンデ ク ス ア ド レシン グ

op{L}{cond} coproc, CRd, [Rn], #{-}offset ; ポス ト イ ンデ ク ス ア ド レシン グ

op{L}{cond} coproc, CRd, label

各パラメータには以下の意味があります。

op LDC、LDC2、STC、STC2 のいずれかを指定します。

cond 任意の条件コードを指定します。

ARM コードでは、cond を LDC2 または STC2 では使用できません。

L 長い転送を指定するオプションの接尾文字を指定します。

coproc 命令が実行されるコプロセッサの名前を指定します。標準名は pn で、n は 0 ~ 15 の整数です。

CRd ロードまたはストアに使用するコプロセッサレジスタを指定します。

Rn メモリアドレスのベースとなるレジスタを指定します。PC が指定され

ている場合、使用される値は「現在の命令のアドレス + 8」となります。

- 任意に指定できるマイナス符号です。- が指定されている場合、オフセッ

トが Rn から減算されます。指定されていない場合は、オフセットが Rn に加算されます。

offset 0 ~ 1020 の範囲で 4 の倍数となる式を指定します。

! 任意に指定できる接尾文字です。! を指定すると、オフセットを含むア

ドレスが Rn にライトバックされます。

label ワード境界で整列する PC 相対式を指定します。

label は現在の命令から 1020 バイト以内に配置する必要があります。

使用法

これらの命令の使用方法はコプロセッサによって異なります。詳細については、コプロセッサのマニュアルを参照して下さい。

Thumb-2EE では、ベースレジスタの値が 0 の場合、HandlerBase - 4 にある NullCheck ハンドラへの分岐が実行されます。

アーキテクチャ

LDC と STC は、ARM アーキテクチャのすべてのバージョンで使用できます。

LDC2 と STC2 は ARMv5T 以降で使用できます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-140ID 011811 Non-Confidential

Page 175: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

レジスタの制約条件

プレインデクスおよびポストインデクス命令では、Rn に PC は使用できません。これ

らは、Rn にライトバックする形式です。

ラベル構文を使用するか、Rn が PC である STC および STC2 命令は、非推奨です。

関連項目

概念:

『アセンブラの使用』:

• 「レジスタ相対式と PC 相対式」 (ページ 8-7)

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-141ID 011811 Non-Confidential

Page 176: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.11 その他の命令

このセクションは以下のサブセクションから構成されています。

• 「BKPT」 (ページ 3-143)

ブレークポイント命令です。

• 「SVC」 (ページ 3-144)

スーパーバイザコール(以前の SWI)です。

• 「MRS」 (ページ 3-145)

CPSR または SPSR の内容の汎用レジスタへの移動命令です。

• 「MSR」 (ページ 3-147)

CPSR または SPSR の指定フィールドへの、イミディエート値または汎用レジス

タの内容のロード命令です。

• 「CPS」 (ページ 3-149)

プロセッサ状態を変更する命令です。

• 「SMC」 (ページ 3-150)

セキュアモニターコール(以前の SMI)です。

• 「SETEND」 (ページ 3-151)

CPSR 内のエンディアンビットを設定します。

• 「NOP」 (ページ 3-152)

演算なし。

• 「SEV、WFE、WFI、YIELD」 (ページ 3-153)

イベントの設定、イベント待機、割り込み待機、明け渡しを行うヒント命令です。

• 「DBG」 (ページ 3-155)

デバッグ命令です。

• 「DMB、DSB、ISB」 (ページ 3-156)

データメモリバリア、データ同期バリア、および命令同期バリアの各ヒント命令です。

• 「MAR、MRA」 (ページ 3-158)

2 本の汎用レジスタと 40 ビット内部アキュムレータの間で転送を実行します

(XScale コプロセッサ 0 の命令です)。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-142ID 011811 Non-Confidential

Page 177: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.11.1 BKPT

ブレークポイント命令です。

構文

BKPT #imm

各パラメータには以下の意味があります。

imm 以下の範囲の整数になる式を指定します。

• ARM 命令の場合は 0 ~ 65535(16 ビット値)

• 16 ビット Thumb 命令の場合は 0 ~ 255(8 ビット値)

使用法

BKPT 命令によって、プロセッサはデバッグ状態に入ります。デバッグツールは、こ

の動作を使用して、特定のアドレスにある命令に到達した時点でシステム状態を調査することができます。

ARM 状態と Thumb 状態のどちらの場合も、imm は ARM ハードウェアによって無視さ

れます。ただし、デバッガはこの値を使用して、ブレークポイントに関する情報をストアできます。

BKPT は無条件命令です。ARM コードでは条件コードが含まれないようにして下さ

い。Thumb コードでは、BKPT 命令には条件コードの接尾文字は不要です。BKPT 命令

は、条件コードの接尾文字に関係なく必ず実行されるためです。

アーキテクチャ

この ARM 命令は、ARMv5T 以降で使用できます。

この 16 ビット Thumb 命令は ARMv5T 以降で使用できます。

この命令の 32 ビット Thumb バージョンはありません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-143ID 011811 Non-Confidential

Page 178: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.11.2 SVC

スーパーバイザコールです。

構文

SVC{cond} #imm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

imm 以下の範囲の整数になる式を指定します。

• ARM 命令の場合は 0 ~ 224–1(24 ビット値)

• 16 ビット Thumb 命令の場合は 0 ~ 255(8 ビット値)

使用法

SVC 命令は、例外を発生させます。つまり、プロセッサモードがスーパーバイザモー

ドに変更され、CPSR がスーパーバイザモードの SPSR に保存され、実行は SVC ベク

タへ分岐されます。

imm はプロセッサによって無視されます。ただし、この値は、例外ハンドラで取得し

て、要求されているサービスを特定することができます。

注 SVC は、以前のバージョンの ARM アセンブリ言語では SWI と呼ばれていました。SWI 命令は、旧称が SWI であることを示すコメント付きで SVC に逆アセンブルされます。

条件フラグ

この命令によるフラグへの影響はありません。

アーキテクチャ

この ARM 命令は、ARM アーキテクチャのすべてのバージョンで使用できます。

16 ビット Thumb 命令は、ARM アーキテクチャのすべての T バリアントで使用でき

ます。

この命令の 32 ビット Thumb バージョンはありません。

関連項目

概念

『ARM プロセッサをターゲットとしたソフトウェア開発』:

• 第 6 章 プロセッサ例外処理

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-144ID 011811 Non-Confidential

Page 179: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.11.3 MRS

PSR の内容の汎用レジスタへの移動命令です。

構文

MRS{cond} Rd, psr

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Rd デスティネーションレジスタを指定します。Rd に PC は指定できません。

psr 次のいずれかを指定します。

APSR 任意のプロセッサ、任意のモードで使用します。

CPSR ARMv7-M と ARMv6-M 以外の任意のプロセッサで、代わりに

同義の APSR を使用し、デバッグ状態で使用します。

SPSR ARMv7-M と ARMv6-M 以外の任意のプロセッサ、特権モード

でのソフトウェア実行でのみ使用します。

Mpsr ARMv7-M と ARMv6-M プロセッサのみで使用します。

Mpsr 次のいずれかを指定できます。IPSR、EPSR、IEPSR、IAPSR、EAPSR、MSP、PSP、

XPSR、PRIMASK、BASEPRI、BASEPRI_MAX、FAULTMASK、または CONTROL。

使用法

MRS は MSR と組み合わせ、PSR を更新するための読み出し、修正、書き込みのシーケ

ンスで使用することにより、プロセッサモードの変更や Q フラグのクリアなどを行

うことができます。

プロセススワップコードでは、関連する PSR の内容を含め、スワップアウトされて

いるプロセスのプログラマのモデルの状態を保存する必要があります。同様に、スワップインされているプロセスの状態も復元する必要があります。これらの操作には、MRS/store および load/MSR 命令シーケンスを使用します。

SPSR

プロセッサがユーザモードやシステムモードの場合は、SPSR へアクセスしないで下

さい。これはユーザ自身が注意する必要があります。アセンブラは、コードがどのプロセッサモードで実行されるかについての情報を持たないため、警告メッセージを生成できません。

プロセッサがユーザモードまたはシステムモードの場合に SPSR にアクセスしようと

した場合の結果は予測不可能です。

CPSR

CPSR のエンディアンビット(E)は、特権モードでのソフトウェア実行で読み出す

ことができます。

プロセッサがデバッグ状態でデバッグモードを完全停止しているときにのみ、E ビッ

ト以外の CPSR 実行状態ビットを読み出すことができます。それ以外の場合、CPSR の実行状態ビットはゼロとして読み出されます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-145ID 011811 Non-Confidential

Page 180: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

条件フラグはどのプロセッサのどのモードでも読み取れます。ユーザモードで条件コードフラグにのみアクセスする場合は、APSR を使用して下さい。

条件フラグ

この命令によるフラグへの影響はありません。

アーキテクチャ

この ARM 命令は、ARM アーキテクチャのすべてのバージョンで使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

この命令の 16 ビット Thumb バージョンはありません。

関連項目

概念

『アセンブラの使用』:

• 「カレントプログラムステータスレジスタ」 (ページ 3-23)

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-146ID 011811 Non-Confidential

Page 181: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.11.4 MSR

イミディエート値または汎用レジスタの内容をプログラム状態レジスタ(PSR)の指

定されたフィールドにロードします。

構文

MSR{cond} APSR_flags, Rm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

flags 移動する APSR フラグ(複数可)を指定します。flags には以下の 1 つ以

上を指定できます。

nzcvq ALU フラグフィールドマスク、PSR[31:27](ユーザモード)

g SIMD GE フラグフィールドマスク、PSR[19:16](ユーザモー

ド)

Rm ソースレジスタを指定します。Rm に PC は指定できません。

構文(ARMv7-M と ARMv6-M を除く)

ARMv7 と ARMv6M 以外のアーキテクチャでは以下の構文も使用できます。

MSR{cond} APSR_flags, #constant

MSR{cond} psr_fields, #constant

MSR{cond} psr_fields, Rm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

flags 移動する APSR フラグ(複数可)を指定します。flags には以下の 1 つ以

上を指定できます。

nzcvq ALU フラグフィールドマスク、PSR[31:27] (ユーザモード)

g SIMD GE フラグフィールドマスク、PSR[19:16](ユーザモー

ド)

constant 数値を求める式を指定します。この値は、32 ビットのワード内でビッ

トを偶数ロテートして得られる 8 ビットパターンに対応している必要が

あります。Thumb では使用できません。

Rm ソースレジスタを指定します。Rm に PC は指定できません。

psr 次のいずれかを指定します。

CPSR デバッグ状態で使用、代わりに同義の APSR を使用します。

SPSR 任意のプロセッサ、特権モードでのソフトウェア実行でのみ

使用します。

fields 移動する SPSR または CPSR フィールド(複数可)を指定します。fields には次のものを指定できます。

c 制御フィールドマスクバイト、PSR[7:0](特権モードでのソフ

トウェア実行)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-147ID 011811 Non-Confidential

Page 182: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

x 拡張フィールドマスクバイト、PSR[15:8](特権モードでのソ

フトウェア実行)

s ステータスフィールドマスクバイト、PSR[23:16](特権モード

でのソフトウェア実行)

f フラグフィールドマスクバイト、PSR[31:24](特権モードでの

ソフトウェア実行)

構文(ARMv7-M と ARMv6-M のみ)

ARMv7 と ARMv6M では以下の構文も使用できます。

MSR{cond} psr, Rm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Rm ソースレジスタを指定します。Rm に PC は指定できません。

psr 次のいずれかを指定できます。APSR、IPSR、EPSR、IEPSR、IAPSR、EAPSR、

XPSR、MSP、PSP、PRIMASK、BASEPRI、BASEPRI_MAX、FAULTMASK、または CONTROL。

使用法

ユーザモードでは、以下のようになります。

• APSR は条件フラグ、Q、または GE ビットにアクセスするために使用します。

• CPSR の未割り当てビット、特権付きビット、または実行状態ビットへの書き

込みが無視されます。そのため、ユーザモードのプログラムが特権モードでのソフトウェア実行に変更されることはありません。

ユーザモードまたはシステムモードの場合に SPSR にアクセスした場合の結果は予測

不可能です。

条件フラグ

この命令は、APSR_nzcvq または CPSR_f フィールドが指定されている場合にフラグを明

示的に更新します。

アーキテクチャ

この ARM 命令は、ARM アーキテクチャのすべてのバージョンで使用できます。

この 32 ビット Thumb 命令は ARMv6T2 以降で使用できます。

この命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス:

• 「MRS」 (ページ 3-145)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-148ID 011811 Non-Confidential

Page 183: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.11.5 CPS

CPS(プロセッサ状態の変更命令)は、他の CPSR ビットを変更することなく、CPSR のモード、A、I、および F のビットの 1 つ以上を変更します。

CPS は、特権モードでのソフトウェア実行でのみ使用でき、ユーザモードでは作用し

ません。

CPS は、条件付きにすることはできないため、IT ブロックでは使用できません。

構文

CPSeffect iflags{, #mode}

CPS #mode

各パラメータには以下の意味があります。

effect 次のいずれかを指定します。

IE 割り込みまたはアボートをイネーブルにします。

ID 割り込みまたはアボートをディセーブルにします。

iflags 以下の項目のシーケンスを指定します。

a 不正確なアボートをイネーブルまたはディセーブルします。

i IRQ 割り込みをイネーブルまたはディセーブルします。

f FIQ 割り込みをイネーブルまたはディセーブルします。

mode 変更先のモードの番号を指定します。

条件フラグ

この命令による条件フラグへの影響はありません。

16 ビット命令

これらの命令は、Thumb コード内では次の形式で使用できます。これらは 16 ビット

命令です。

• CPSIE iflags• CPSID iflags

16 ビット Thumb 命令ではモードの変更を指定できません。

アーキテクチャ

この ARM 命令は、ARMv6 以降で使用できます。

この 32 ビット Thumb 命令は ARMv6T2 以降で使用できます。

この 16 ビット Thumb 命令は、ARMv6 以降の T バリアントで使用できます。

CPSIE if ; 割り込み と高速割り込みを イネーブルにする

CPSID A ; 不正確なアボー ト をデ ィ セーブルにする

CPSID ai, #17 ; 不正確なアボー ト と割り込みをデ ィ セーブルに し、 FIQ モー ド に移行する

CPS #16 ; ユーザモード に移行する

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-149ID 011811 Non-Confidential

Page 184: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.11.6 SMC

セキュアモニターコールです。

構文

SMC{cond} #imm4

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

imm4 4 ビットのイミディエート値を指定します。この値は、ARM プロセッサ

では無視されますが、SMC 例外ハンドラで使用して、要求されている

サービスを特定することができます。

SMC は、以前のバージョンの ARM アセンブリ言語では SMI と呼ばれていました。SMI 命令は、旧称が SMI であることを示すコメント付きで SMC に逆アセンブルされます。

アーキテクチャ

この ARM 命令は ARMv6 以降の実装で使用できます。ただし、Security Extensions が必要です。

この 32 ビット Thumb 命令は ARMv6T2 以降の実装で使用可能です。ただし、Security Extensions が必要です。

この命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

• 『ARM アーキテクチャリファレンスマニュアル』, http://infocenter.arm.com/help/topic/com.arm.doc.subset.arch.reference/index.html

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-150ID 011811 Non-Confidential

Page 185: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.11.7 SETEND

CPSR 内のエンディアンビットを、他のビットに影響を与えることなく設定します。

SETEND は、条件付きにすることはできないため、IT ブロックでは使用できません。

構文

SETEND specifier

各パラメータには以下の意味があります。

specifier 次のいずれかを指定します。

BE ビッグエンディアン形式

LE リトルエンディアン形式

使用法

SETEND を使用すると、異なるエンディアン形式のデータにアクセスできます。例え

ば、リトルエンディアン形式のアプリケーションから、ビッグエンディアン形式で DMA フォーマットされた複数のデータフィールドにアクセスできます。

アーキテクチャ

この ARM 命令は、ARMv6 以降で使用できます。

この 16 ビット Thumb 命令は、ARMv6-M および ARMv7-M アーキテクチャを除く ARMv6 以降の T バリアントで使用できます。

この命令の 32 ビット Thumb バージョンはありません。

SETEND BE ; ビ ッ グ エ ンデ ィ ア ン ア ク セス用に CPSR E ビ ッ ト を設定する LDR r0, [r2, #header] LDR r1, [r2, #CRC32] SETEND le ; ア プ リ ケーシ ョ ンの他の部分の リ ト ルエ ンデ ィ ア ン ア ク セス用に

; CPSR E ビ ッ ト を設定する

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-151ID 011811 Non-Confidential

Page 186: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.11.8 NOP

演算なし。

構文

NOP{cond}

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

使用法

NOP は何も行いません。NOP がターゲットアーキテクチャで特定の命令として実装され

ていない場合、アセンブラはこれを擬似命令として扱い、MOV r0, r0(ARM)や MOV r8, r8(Thumb)など、何も行わない別の命令を生成します。

NOP は、必ずしも時間のかかる NOP ではありません。プロセッサにより、この命令は、

実行ステージに到達する前にパイプラインから削除される場合があります。

例えば、NOP をパディングに使用することで、次に続く命令を ARM では 64 ビット境

界に、Thumb では 32 ビット境界に配置できます。

アーキテクチャ

この ARM 命令は、ARMv6K 以降で使用できます。

この 32 ビット Thumb 命令は ARMv6T2 以降で使用できます。

この 16 ビット Thumb 命令は ARMv6T2 以降で使用できます。

NOP は他のすべての ARM および Thumb アーキテクチャで疑似命令として使用できま

す。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-152ID 011811 Non-Confidential

Page 187: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.11.9 SEV、WFE、WFI、YIELD

イベントの設定、イベント待機、割り込み待機、および明け渡しを行うヒント命令です。

構文

SEV{cond}

WFE{cond}

WFI{cond}

YIELD{cond}

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

使用法

これらはヒント命令です。これらの命令は任意に実装することができます。いずれの命令も実装されていない場合は、NOP として実行されます。命令がターゲットで NOP として実行された場合、診断メッセージが生成されます。

SEV、WFE、WFI、および YIELD は、ARMv6T2 では NOP 命令として実行されます。

SEV

SEV により、マルチプロセッサシステム内のすべてのコアに対してイベントを発生さ

せます。SEV を実装する場合は、WFE も実装する必要があります。

WFE

イベントレジスタが設定されていない場合、WFE は、以下のいずれかのイベントが発

生するまで実行を保留します。

• IRQ 割り込み(CPSR の I ビットでマスクされている場合を除く)

• FIQ 割り込み(CPSR の F ビットでマスクされている場合を除く)

• 不正確なデータアボート(CPSR の A ビットでマスクされている場合を除く)

• デバッグエントリ要求(デバッグがイネーブルの場合)

• 別のプロセッサが SEV 命令を使用して発生させたイベント

イベントレジスタが設定されている場合、WFE は、そのレジスタをクリアしてすぐに

戻ります。

WFE を実装する場合は、SEV も実装する必要があります。

WFI

WFI は、以下のいずれかのイベントが発生するまで実行を保留します。

• IRQ 割り込み(CPSR の I ビットの設定とは無関係)

• FIQ 割り込み(CPSR の F ビットの設定とは無関係)

• 不正確なデータアボート(CPSR の A ビットでマスクされている場合を除く)

• デバッグエントリ要求(デバッグがイネーブルされているかどうかは無関係)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-153ID 011811 Non-Confidential

Page 188: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

YIELD

YIELD は、現在のスレッドが、スワップアウトできるタスク(スピンロックなど)を

実行していることをハードウェアに示します。ハードウェアは、このヒントを使用して、マルチスレッドシステムでスレッドを中断および再開できます。

アーキテクチャ

これらの ARM 命令は、ARMv6K 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

これらの 16 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

関連項目

リファレンス:

• 「NOP」 (ページ 3-152)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-154ID 011811 Non-Confidential

Page 189: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.11.10 DBG

[デバッグ]。

構文

DBG{cond} {option}

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

option ヒントの演算に任意に指定できる制限です。範囲は 0 ~ 15 です。

使用法

DBG はヒント命令です。これらの命令は任意に実装することができます。実装されて

いない場合は、NOP として動作します。命令がターゲットで NOP として実行された場

合、診断メッセージが生成されます。

DBG は、ARMv6K および ARMv6T2 では NOP 命令として実行されます。

デバッグヒントは、デバッグシステムおよび関連するシステムにヒントを提供します。この命令がどのように使用されているかについては、各システムのマニュアルを参照して下さい。

アーキテクチャ

これらの ARM 命令は、ARMv6K 以降で使用できます。

これらの 32 ビット Thumb 命令は、ARMv6T2 以降で使用できます。

この命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス: • 「NOP」 (ページ 3-152)• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-155ID 011811 Non-Confidential

Page 190: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.11.11 DMB、DSB、ISB

データメモリバリア、データ同期バリア、および命令同期バリアです。

構文

DMB{cond} {option}

DSB{cond} {option}

ISB{cond} {option}

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

option ヒントの演算に任意に指定できる制限です。

使用法

DMB

データメモリバリアはメモリバリアとして機能します。これにより、DMB 命令より前

にプログラム順で発生する明示的なすべてのメモリアクセスは、DMB 命令より後にプ

ログラム順で出てくる明示的なデータアクセスよりも先に検出されます。これは、プロセッサで実行されている他の命令の順序に影響することはありません。

option に使用できる値は以下のとおりです。

SY システム全体の DMB 演算。これはデフォルト値なので、省略できます。

ST ストアの完了のみを待機する DMB 演算。

ISH 内部共有可能ドメインのみを対象とした DMB 演算。

ISHST ストアの完了のみを待機し、内部共有可能ドメインを対象とした DMB 演算。

NSH 統合ポイントのみを対象とした DMB 演算。

NSHST ストアの完了のみを待機し、統合ポイントのみを対象とした DMB 演算。

OSH 外部共有可能ドメインのみを対象とした DMB 演算。

OSHST ストアの完了のみを待機し、外部共有可能ドメインを対象とした DMB 演算。

DSB

データ同期バリアは、特殊なメモリバリアとして機能します。この命令が完了するまで、この命令より後にあるプログラム順の命令は実行されません。この命令は以下の場合に完了します。

• この命令が完了する前のすべての明示的なメモリアクセス

• この命令が完了する前のキャッシュ、分岐予測子、および TLB メンテナンスの

すべての処理

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-156ID 011811 Non-Confidential

Page 191: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

option に使用できる値は以下のとおりです。

SY システム全体の DSB 演算。これはデフォルト値なので、省略できます。

ST ストアの完了のみを待機する DSB 演算。

ISH 内部共有可能ドメインのみを対象とした DSB 演算。

ISHST ストアの完了のみを待機し、内部共有可能ドメインを対象とした DSB 演算。

NSH 統合ポイントのみを対象とした DSB 演算。

NSHST ストアの完了のみを待機し、統合ポイントのみを対象とした DSB 演算。

OSH 外部共有可能ドメインのみを対象とした DSB 演算。

OSHST ストアの完了のみを待機し、外部共有可能ドメインを対象とした DSB 演算。

ISB

命令同期バリアはプロセッサのパイプラインをフラッシュするため、ISB に続くすべ

ての命令は、ISB 命令が完了した後、キャッシュまたはメモリからフェッチされま

す。これにより、ISB 命令より前に実行されたコンテキスト変更処理(ASID の変更

など)、完了した TLB メンテナンス処理、分岐予測子メンテナンス処理、および CP15 レジスタへのすべての変更は、ISB より後にフェッチされた命令で認識されま

す。

また、ISB 命令により、この命令より後にプログラム順で出てくるすべての分岐は、

必ず ISB 命令より後で認識されるコンテキストと共に分岐予測ロジックに書き込まれ

ます。これは、命令ストリームを正しく実行するために必要なことです。

option に使用できる値は以下のとおりです。

SY システム全体の ISB 演算。これはデフォルト値なので、省略できます。

エイリアス

DMB と DSB でサポートされている option の代替値は以下のとおりですが、使用は非推

奨です。

• SH は ISH のエイリアスです。

• SHST は ISHST のエイリアスです。

• UN は NSH のエイリアスです。

• UNST は NSHST のエイリアスです。

アーキテクチャ

これらの ARM および 32 ビット Thumb 命令は、ARMv7 で使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-157ID 011811 Non-Confidential

Page 192: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.11.12 MAR、MRA

2 本の汎用レジスタと 40 ビット内部アキュムレータの間で転送を実行します。

構文

MAR{cond} Acc, RdLo, RdHi

MRA{cond} RdLo, RdHi, Acc

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Acc 内部アキュムレータを指定します。標準名は accx で、x は 0 ~ n の整数

です。n の値はプロセッサによって異なります。現在のプロセッサでは 0 が使用されています。

RdLo?RdHi 汎用レジスタを指定します。RdLo と RdHi を PC にすることはできません。

また、MRA では異なるレジスタでなければなりません。

使用法

MAR 命令は、RdLo の内容を Acc のビット [31:0] にコピーし、RdHi の 下位バイトを Acc のビット [39:32] にコピーします。

MRA 命令は以下を実行します。

• Acc のビット [31:0] を RdLo にコピーします。

• Acc のビット [39:32] を RdHi のビット [7:0] にコピーします。

• Acc のビット [39] を RdHi のビット [31:8] にコピーして値を符号拡張します。

アーキテクチャ

これらの ARM コプロセッサ 0 命令は、XScale プロセッサでのみ使用できます。

これらの命令の Thumb バージョンはありません。

MAR acc0, r0, r1 MRA r4, r5, acc0 MARNE acc0, r9, r2 MRAGT r4, r8, acc0

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-158ID 011811 Non-Confidential

Page 193: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.12 ThumbEE 命令

ENTERX と LEAVEX を除き、これらの ThumbEE 命令はアセンブラが ThumbEE 状態に切り

替わったときにのみ受け入れられます。切り替えには --thumbx コマンドラインオプ

ションまたは THUMBX ディレクティブを使用します。

このセクションは以下のサブセクションから構成されています。

• 「ENTERX、LEAVEX」 (ページ 3-160)

Thumb 状態と ThumbEE 状態の間で切り替えを行う命令です。

• 「CHKA」 (ページ 3-161)

配列をチェックする命令です。

• 「HB、HBL、HBLP、HBP」 (ページ 3-162)

ハンドラの分岐命令です。指定されたハンドラに分岐します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-159ID 011811 Non-Confidential

Page 194: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.12.1 ENTERX、LEAVEX

Thumb 状態と ThumbEE 状態の間で切り替えを行う命令です。

構文

ENTERX

LEAVEX

使用法

ENTERX を使用すると、Thumb 状態から ThumbEE 状態に切り替わるか、または ThumbEE 状態が維持されます。

LEAVEX を使用すると、ThumbEE 状態から Thumb 状態に切り替わるか、または Thumb 状態が維持されます。

IT ブロック内では、ENTERX または LEAVEX を使用しないで下さい。

アーキテクチャ

これらの命令は、ARM 命令セットでは使用できません。

これらの 32 ビット Thumb 命令および Thumb-2EE 命令は、Thumb-2EE をサポートす

る ARMv7 で使用できます。

これらの命令の 16 ビット Thumb バージョンはありません。

関連項目

リファレンス:

• 『ARM アーキテクチャリファレンスマニュアル』, http://infocenter.arm.com/help/topic/com.arm.doc.subset.arch.reference/index.html

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-160ID 011811 Non-Confidential

Page 195: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.12.2 CHKA

CHKA(配列のチェック)は、2 つのレジスタにある符号なしの値を比較します。

初のレジスタの値が 2 番目のレジスタの値以下か等しい場合、この命令により、

PC が LR にコピーされ、IndexCheck ハンドラへの分岐が発生します。

構文

CHKA Rn, Rm

各パラメータには以下の意味があります。

Rn 配列のサイズを指定します。Rn に PC は指定できません。

Rm 配列のインデクスを指定します。Rn に PC と SP は指定できません。

アーキテクチャ

ARM 状態では使用できません。

この 16 ビット ThumbEE 命令は Thumb-2EE をサポートする ARMv7 のみで使用できま

す。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-161ID 011811 Non-Confidential

Page 196: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.12.3 HB、HBL、HBLP、HBP

ハンドラの分岐命令です。指定されたハンドラに分岐します。

この命令は、必要に応じて、復帰アドレスを LR にストアしたり、パラメータをハン

ドラに渡したりすることができます。また、その両方を行うこともできます。

構文

HB{L} #HandlerID

HB{L}P #imm, #HandlerID

各パラメータには以下の意味があります。

L 任意に指定できる接尾文字です。L を指定すると、復帰アドレスが LR に保存されます。

P 任意に指定できる接尾文字です。P を指定すると、imm の値が R8 のハン

ドラに渡されます。

imm イミディエート値を指定します。L を指定した場合、imm に 0 ~ 31 の範囲

の値を指定する必要があります。この接尾文字を指定しない場合、imm には 0 ~ 7 の範囲の値を指定する必要があります。

HandlerID 呼び出すハンドラのインデクス番号を指定します。P を指定した場合、

HandlerID に 0 ~ 31 の範囲の値を指定する必要があります。この接尾文

字を指定しない場合、HandlerID には 0 ~ 255 の範囲の値を指定する必要

があります。

アーキテクチャ

これらの命令は ARM 状態では使用できません。

これらの 16 ビット ThumbEE 命令は、Thumb-2EE をサポートする ARMv7 の ThumbEE 状態でのみ使用できます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-162ID 011811 Non-Confidential

Page 197: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.13 疑似命令

ARM アセンブラは、多くの疑似命令をサポートしています。これらの疑似命令は、

アセンブリ時に適切な ARM 命令や Thumb 命令の組み合わせに変換されます。

疑似命令については、以下のサブセクションを参照して下さい。

• 「ADRL 疑似命令」 (ページ 3-164)

PC 相対アドレスまたはレジスタ相対アドレス(中範囲、位置非依存)をレジス

タにロードします。

• 「MOV32 疑似命令」 (ページ 3-167)

32 ビットイミディエート値またはアドレス(範囲無制限、位置依存)をレジス

タにロードします。ARMv6T2 以降でのみ使用できます。

• 「LDR 疑似命令」 (ページ 3-169)

32 ビットイミディエート値またはアドレス(範囲無制限、位置依存)をレジス

タにロードします。すべての ARM アーキテクチャで使用できます。

• 「UND 疑似命令」 (ページ 3-172)

アーキテクチャ上で定義されていない命令を生成します。すべての ARM アー

キテクチャで使用できます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-163ID 011811 Non-Confidential

Page 198: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.13.1 ADRL 疑似命令

PC 相対アドレスまたはレジスタ相対アドレスをレジスタにロードします。ADR 命令と

似ていますが、ADRL では 2 つのデータ処理命令が生成されるため、ADR より広範囲の

アドレスをロードできます。

注 ADRL は、ARMv6T2 以降の Thumb 命令をアセンブルするときにのみ使用できます。

構文

ADRL{cond} Rd,label

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Rd ロードするレジスタを指定します。

label PC 相対式またはレジスタ相対式を指定します。

使用法

ADRL は常に 2 つの 32 ビット命令にアセンブルされます。1 つの命令でアドレスに到

達できる場合でも、2 番目の冗余命令が生成されます。

アセンブラが 2 つの命令でアドレスを作成できない場合は、エラーメッセージが生

成され、アセンブルに失敗します。より広範囲のアドレスをロードするには、LDR 疑似命令を使用します。

ADRL は、アドレスが PC 相対またはレジスタ相対であるため、位置非依存コードを生

成します。

label が PC 相対である場合は、ADRL 疑似命令と同じアセンブラ領域内のアドレスを指

定する必要があります。

BX または BLX 命令のターゲットを生成するために ADRL を使用するときは、ターゲット

に Thumb 命令が含まれている場合、そのアドレスの Thumb ビット(ビット 0)を設

定する必要があります。

アーキテクチャと範囲

利用できる範囲は、使用する命令セットによって異なります。

ARM バイト境界またはハーフワード境界で整列されているアドレスか

ら ± 64KB の範囲

ワード境界で整列されているアドレスから ± 256KB バイトの範

32 ビット Thumb バイト、ハーフワード、またはワード境界で整列されているアド

レスから ± 1MB バイトの範囲

16 ビット Thumb ADRL 命令は使用できません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-164ID 011811 Non-Confidential

Page 199: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

所定の範囲は、Thumb コードでは現在の命令のアドレスから 4 バイト、ARM コード

では現在の命令のアドレスから 2 ワードの位置からの範囲です。境界調整がこの位

置から 16 バイト以上の相対位置にある場合、より広範囲のアドレスを利用できま

す。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-165ID 011811 Non-Confidential

Page 200: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

関連項目

概念

『アセンブラの使用』:

• 「レジスタ相対式と PC 相対式」 (ページ 8-7)

• 「レジスタへのイミディエート値のロード」 (ページ 5-6)

リファレンス:

• 「LDR 疑似命令」 (ページ 3-169)

• 「AREA」 (ページ 6-71)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-166ID 011811 Non-Confidential

Page 201: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.13.2 MOV32 疑似命令

以下のいずれかの値をレジスタにロードします。

• 32 ビットイミディエート値

• 任意のアドレス

MOV32 は常に 2 つの 32 ビット命令、MOV と MOVT の対を生成します。この命令対を使用

して、32 ビットイミディエート値をロードしたり、32 ビットアドレス空間全体にア

クセスしたりすることができます。

構文

MOV32{cond} Rd, expr

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Rd ロード先のレジスタを指定します。Rd に SP と PC は指定できません。

expr 以下のいずれかを指定できます。

symbol このプログラム領域または別のプログラム領域内の

ラベルです。

#constant 任意の 32 ビットイミディエート値です。

symbol + constant ラベルと 32 ビットイミディエート値を組み合わせた

ものです。

使用法

MOV32 疑似命令の主な目的は以下のとおりです。

• 1 つの命令でイミディエート値を生成できない場合にリテラル定数を生成する

こと

• PC 相対アドレスまたは外部アドレスをレジスタにロードすること。このアドレ

スは、リンカが MOV32 を保持する ELF セクションをどこに配置しても有効です。

注 この方法でロードされたアドレスはリンク時に固定されるため、このコードは

位置依存コードになります。

参照されているラベルが Thumb コード内にある場合、MOV32 はアドレスの Thumb ビッ

ト(ビット 0)を設定します。

アーキテクチャ

この疑似命令は、ARM、Thumb 共に ARMv6T2 以降で使用できます。

MOV32 r3, #0xABCDEF12 ; 0xABCDEF12 を R3 に ロー ドする

MOV32 r1, Trigger+12 ; Trigger のア ド レ ス よ り 12 バイ ト上位のア ド レ ス を

; R1 に ロ ー ドする

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-167ID 011811 Non-Confidential

Page 202: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-168ID 011811 Non-Confidential

Page 203: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.13.3 LDR 疑似命令

以下のいずれかの値をレジスタにロードします。

• 32 ビットイミディエート値

• アドレス

注 このセクションでは、LDR 疑似命令のみを取り上げます。LDR 命令については説明しま

せん。

構文

LDR{cond}{.W} Rt, =expr

LDR{cond}{.W} Rt, =label_expr

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

.W 任意に指定できる幅指定子を指定します。

Rt ロード先のレジスタを指定します。

expr 数値を求める式を指定します。

label_expr アドレスの PC 相対式または外部式をラベルから数値を加減算する形式

で指定します。

使用法

LDR 疑似命令を使用する場合:

• expr の値を有効な MOV 命令または MVN 命令でロードできる場合は、アセンブラに

よってその命令が使用されます。

• 有効な MOV 命令または MVN 命令を使用できない場合や、label_expr 構文が使用さ

れている場合は、アセンブラは定数をリテラルプールに配置し、リテラルプールからその定数を読み出す PC 相対 LDR 命令を生成します。

注 — この方法でロードされたアドレスはリンク時に固定されるため、このコー

ドは位置依存コードになります。

— 定数を保持するアドレスは、リンカが LDR 命令を保持する ELF セクション

をどこに配置しても有効です。

アセンブラは、label_expr の値をリテラルプールに配置し、リテラルプールからこの

値をロードする PC 相対 LDR 命令を生成します。

label_expr が外部式であるか、現在のセクションに含まれていない場合、アセンブラ

はリンカ再配置ディレクティブをそのオブジェクトファイル内に入れます。リンカはリンク時にアドレスを生成します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-169ID 011811 Non-Confidential

Page 204: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

label_expr がローカルラベルの場合、アセンブラはリンカ再配置ディレクティブをオ

ブジェクトファイル内に入れ、そのローカルラベルのシンボルを生成します。アドレスはリンク時に生成されます。ローカルラベルが Thumb コードを参照する場合、

アドレスの Thumb ビット(ビット 0)が設定されます。

PC からリテラルプール内の値までのオフセットは ± 4KB(ARM、32 ビット Thumb-2)より小さいか、0 ~ +1KB(16 ビット Thumb-2、Thumb2 以前の Thumb)の

範囲内である必要があります。このとき範囲内にリテラルプールがあることを必ず確認して下さい。

参照されているラベルが Thumb コード内にある場合、LDR 疑似命令は label_expr の Thumb ビット(ビット 0)を設定します。

注 RealView® Compilation Tools(RVCT)v2.2 では、アドレスの Thumb ビットが設定され

ませんでした。この動作に依存するコードでは、コマンドラインオプション --untyped_local_labels を使用して、アセンブラが Thumb コード内のラベルを参照す

る際に Thumb ビットを設定しないようにします。

Thumb コード内の LDR

.W 幅指定子を指定すると、LDR を使用して ARMv6T2 以降のプロセッサで Thumb コー

ドの 32 ビット命令を生成できます。LDR.W を指定した場合は、16 ビット MOV でイミ

ディエート値をロードできる場合や、リテラルプールが 16 ビット PC 相対ロードの

範囲内にある場合でも、常に 32 ビット命令が生成されます。

ロードされる値がアセンブラの初回パスで未知の場合、.W なしの LDR は 16 ビット Thumb コード命令を生成します。その結果 32 ビットの MOV 命令または MVN 命令で生成

できる値でも 16 ビット PC 相対ロードになります。値が初回パスで既知で、32 ビッ

トの MOV 命令または MVN 命令を使って生成できる場合は、MOV 命令または MVN 命令が使

用されます。

LDR 疑似命令は 16 ビットフラグを設定する MOV 命令を生成することはありません。ア

センブラの --diag_warning 1727 コマンドラインオプションを使用して、16 ビット命令

の使用を確認できます。

MOV32 疑似命令を使用すると、イミディエート値やアドレスをリテラルプールから

ロードせずに生成できます。

LDR r3,=0xff0 ; 0xff0 を R3 に ロー ドする ; => MOV.W r3,#0xff0 LDR r1,=0xfff ; 0xfff を R1 に ロー ドする ; => LDR r1,[pc,offset_to_litpool] ; ... ; litpool DCD 0xfff LDR r2,=place ; place のア ド レ ス を

; R2 に ロ ー ドする ; => LDR r2,[pc,offset_to_litpool] ; ... ; litpool DCD place

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-170ID 011811 Non-Confidential

Page 205: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

関連項目

概念

『アセンブラの使用』:

• 「数値定数」 (ページ 8-5)

• 「レジスタ相対式と PC 相対式」 (ページ 8-7)

• 「ローカルラベル」 (ページ 8-12)

• 「レジスタへのイミディエート値のロード」 (ページ 5-6)

• 「LDR Rd, =const を使用したレジスタへの 32 ビットイミディエート値のロード」 (ページ 5-11)

リファレンス:

• 「メモリアクセス命令」 (ページ 3-13)

• 「LTORG」 (ページ 6-19)

• 「MOV32 疑似命令」 (ページ 3-167)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-171ID 011811 Non-Confidential

Page 206: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.13.4 UND 疑似命令

アーキテクチャ上で定義されていない命令を生成します。定義されていない命令を実行しようとすると未定義命令例外が発生します。アーキテクチャ上で定義されていない命令は未定義のままになります。

構文

UND{cond}{.W} {#expr}

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

.W 任意に指定できる幅指定子を指定します。

expr 数値を求める式を指定します。表 3-10 は命令における expr の範囲とエ

ンコーディングを示したものです。ここで、Y は expr をエンコードする

ビット位置を示し、V は条件コードをエンコードする 4 ビットを示しま

す。

expr が省略された場合、0 が使用されます。

Thumb コード内の UND

.W 幅指定子を指定すると、UND を使用して ARMv6T2 以降のプロセッサで Thumb コー

ドの 32 ビット命令を生成できます。UND.W を指定した場合は、expr が 0 ~ 255 の範囲

内にある場合でも、常に 32 ビット命令が生成されます。

逆アセンブリ

この疑似命令からのエンコーディングは DCI に逆アセンブルします。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

表 3-10 expr の範囲とエンコーディング

命令 エンコーディング expr のビット数 範囲

ARM 0xV7FYYYFY 16 0-65535

32 ビット Thumb 0xF7FYAYFY 12 0-4095

16 ビット Thumb 0xDEYY 8 0-255

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-172ID 011811 Non-Confidential

Page 207: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ARM 命令と Thumb 命令

3.14 条件コード

条件付きにできる命令には、任意で条件コードを指定できます。構文の説明では、条件コードを {cond} と表記しています。表 3-11 に、使用可能な条件コードを示しま

す。

注 条件コードの正確な意味は、条件コードフラグが VFP 命令によってセットされるか、

ARM データ処理命令によってセットされるかによって異なります。

関連項目 • 「IT」 (ページ 3-127)• 「VMRS および VMSR」 (ページ 4-14)

『アセンブラの使用』:

• 「条件コードの意味」 (ページ 6-8)• 「NEON 命令および VFP 命令の条件付き実行」 (ページ 9-11)

表 3-11 条件コードの接尾文字

接尾文字

意味

EQ 等しい

NE 等しくない

CS キャリー設定(HS と同じ)

HS 大きいか等しい(符号なし)(CS と同じ)

CC キャリークリア(LO と同じ)

LO 小さい(符号なし)(CC と同じ)

MI 負の結果

PL 正または 0 の結果

VS オーバーフロー

VC オーバーフローなし

HI 大きい(符号なし)

LS 小さいか等しい(符号なし)

GE 大きいか等しい(符号付き)

LT 小さい(符号付き)

GT 大きい(符号付き)

LE 小さいか等しい(符号付き)

AL 無条件(デフォルト)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 3-173ID 011811 Non-Confidential

Page 208: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

第 4 章 NEON と VFP プログラミング

以下の各トピックでは、NEON™ と VFP コプロセッサのアセンブリプログラミングにつ

いて説明します。

• 「命令の概要」 (ページ 4-2)• 「NEON と VFP に共通の命令」 (ページ 4-7)• 「NEON 論理演算と比較演算」 (ページ 4-15)• 「NEON 汎用データ処理命令」 (ページ 4-23)• 「NEON シフト命令」 (ページ 4-36)• 「NEON 汎用算術命令」 (ページ 4-44)• 「NEON 乗算命令」 (ページ 4-58)• 「NEON 要素と構造体のロード / ストア命令」 (ページ 4-64)• 「NEON 疑似命令および VFP 疑似命令」 (ページ 4-72)• 「VFP 命令」 (ページ 4-79)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-1ID 011811 Non-Confidential

Page 209: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.1 命令の概要

このセクションでは、NEON 命令と VFP 命令の概要を説明します。このセクション

を使用して、個々の命令および疑似命令の説明に移動できます。説明する内容は以下のとおりです。

• 「NEON 命令」

• 「共通の NEON 命令と VFP 命令」 (ページ 4-5)• 「VFP 命令」 (ページ 4-5)

4.1.1 NEON 命令

表 4-1 に NEON 命令の概要を示します。これらの命令は VFP では使用できません。

表 4-1 NEON 命令の参照ページ

ニーモニック 概要 ページ

VABA、VABD 絶対差、絶対差と累積 (ページ 4-45)

VABS 絶対値 (ページ 4-46)

VACGE、VACGT 以上(絶対値比較)、超 (ページ 4-20)

VACLE、VACLT 以下(絶対値比較)、未満(疑似命令) (ページ 4-77)

VADD 加算 (ページ 4-47)

VADDHN 加算、上位半分の選択 (ページ 4-49)

VAND ビット単位論理積 (ページ 4-16)

VAND ビット単位論理積(疑似命令) (ページ 4-76)

VBIC ビット単位ビットクリア(レジスタ) (ページ 4-16)

VBIC ビット単位ビットクリア(イミディエート) (ページ 4-17)

VBIF、VBIT、

VBSL

False の場合はビット単位挿入、True の場合はビット単位を挿入、および選択 (ページ 4-18)

VCEQ、VCLE、

VCLT

等しい(比較)、以下(比較)、未満(比較) (ページ 4-21)

VCGE、VCGT 以上(比較)、超(比較) (ページ 4-21)

VCLE、VCLT 以下(比較)、未満(比較、疑似命令) (ページ 4-78)

VCLS、VCLZ、

VCNT

先行符号ビットカウント、先行ゼロカウント、およびセットビットカウント (ページ 4-54)

VCVT 固定小数点または整数から浮動小数点への変換、浮動小数点から整数または固定小数点への変換

(ページ 4-24)

VCVT 半精度浮動小数点数と単精度浮動小数点数間の変換 (ページ 4-25)

VDUP ベクタの全レーンへのスカラの複製 (ページ 4-26)

VEOR ビット単位排他的論理和(XOR) (ページ 4-16)

VEXT 抽出 (ページ 4-27)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-2ID 011811 Non-Confidential

Page 210: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

VFMA、VFMS 結合積和、結合積差(ベクタ) (ページ 4-61)

VHADD、VHSUB 二分加算、二分減算 (ページ 4-50)

VLD ベクタロード (ページ 4-64)

VMAX、VMIN 大値、 小値 (ページ 4-53)

VMLA、VMLS 積和、積差(ベクタ) (ページ 4-59)

VMLA、VMLS 積和、積差(スカラによる) (ページ 4-60)

VMOV 移動(イミディエート) (ページ 4-28)

VMOV 移動(レジスタ) (ページ 4-19)

VMOVL、VMOV{U}N Long 移動、Narrow 移動(レジスタ) (ページ 4-29)

VMUL 乗算(ベクタ) (ページ 4-59)

VMUL 乗算(スカラによる) (ページ 4-60)

VMVN 負の移動(イミディエート) (ページ 4-28)

VNEG 否定 (ページ 4-46)

VORN ビット単位否定論理和 (ページ 4-16)

VORN ビット単位否定論理和(疑似命令) (ページ 4-76)

VORR ビット単位論理和(レジスタ) (ページ 4-16)

VORR ビット単位論理和(イミディエート) (ページ 4-17)

VPADD、VPADAL ペアワイズ加算、ペアワイズ加算累積 (ページ 4-51)

VPMAX、VPMIN ペアワイズ 大値、ペアワイズ 小値 (ページ 4-53)

VQABS 絶対値、サチュレート (ページ 4-46)

VQADD 加算、サチュレート (ページ 4-47)

VQDMLAL、VQDMLSL

サチュレートダブル積和、積差 (ページ 4-62)

VQDMUL サチュレートダブル乗算 (ページ 4-62)

VQDMULH 上位半分を返すサチュレートダブル乗算 (ページ 4-63)

VQMOV{U}N サチュレート移動(レジスタ) (ページ 4-29)

VQNEG 否定、サチュレート (ページ 4-46)

VQRDMULH 上位半分を返すサチュレートダブル乗算 (ページ 4-63)

VQRSHL 左シフト、丸め、サチュレート(符号付き変数による) (ページ 4-39)

VQRSHR 右シフト、丸め、サチュレート(イミディエートによる) (ページ 4-41)

VQSHL 左シフト、サチュレート(イミディエートによる) (ページ 4-37)

表 4-1 NEON 命令の参照ページ (続き)

ニーモニック 概要 ページ

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-3ID 011811 Non-Confidential

Page 211: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

VQSHL 左シフト、サチュレート(符号付き変数による) (ページ 4-39)

VQSHR 右シフト、サチュレート(イミディエートによる) (ページ 4-41)

VQSUB 減算、サチュレート (ページ 4-47)

VRADDH 加算、上位半分の選択、丸め (ページ 4-49)

VRECPE 逆数の推定 (ページ 4-55)

VRECPS 逆数のステップ (ページ 4-56)

VREV 要素の順番の反転 (ページ 4-30)

VRHADD 二分加算、丸め (ページ 4-50)

VRSHR、VRSRA 右シフトして丸め、右シフト、丸め、累積(イミディエートによる) (ページ 4-40)

VRSQRTE 逆平方根の推定 (ページ 4-55)

VRSQRTS 逆平方根のステップ (ページ 4-56)

VRSUBH 減算、上位半分の選択、丸め (ページ 4-49)

VSHL 左シフト(イミディエートによる) (ページ 4-37)

VSHR 右シフト(イミディエートによる) (ページ 4-40)

VSLI 左シフトして挿入 (ページ 4-42)

VSRA 右シフト、累積(イミディエートによる) (ページ 4-40)

VSRI 右シフトして挿入 (ページ 4-42)

VST ベクタストア (ページ 4-64)

VSUB 減算 (ページ 4-47)

VSUBH 減算、上位半分の選択 (ページ 4-49)

VSWP ベクタのスワップ (ページ 4-31)

VTBL、VTBX ベクタテーブルの検索 (ページ 4-32)

VTRN ベクタ置換 (ページ 4-33)

VTST テストビット (ページ 4-22)

VUZP、VZIP ベクタのインターリーブとインターリーブの解除 (ページ 4-34)

表 4-1 NEON 命令の参照ページ (続き)

ニーモニック 概要 ページ

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-4ID 011811 Non-Confidential

Page 212: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.1.2 共通の NEON 命令と VFP 命令

表 4-2 に NEON と VFP に共通する命令の概要を示します。

4.1.3 VFP 命令

表 4-3 (ページ 4-6) に NEON で使用できない VFP 命令の概要を示します。

表 4-2 NEON と VFP に共通の命令の参照ページ

ニーモニック 概要 ページ 演算アーキテクチャ

VLDM 多重ロード (ページ 4-9) - すべて

VLDR ロード(「VLDR 疑似命令」 (ページ 4-73)も参照) (ページ 4-8) スカラ すべて

ロード(ポストインクリメントとプレデクリメント) (ページ 4-74) スカラ すべて

VMOV 1 本の ARM レジスタから半本分のダブルワードレジスタ

への転送

(ページ 4-12) スカラ すべて

2 本の ARM レジスタから 1 本のダブルワードレジスタへ

の転送

(ページ 4-11) スカラ VFPv2

半本分のダブルワードレジスタから 1 本の ARM レジスタ

への転送

(ページ 4-12) スカラ すべて

1 本のダブルワードレジスタから 2 本の ARM レジスタへ

の転送

(ページ 4-11) スカラ VFPv2

単精度から ARM レジスタへの転送 (ページ 4-13) スカラ すべて

ARM レジスタから単精度への転送 (ページ 4-13) スカラ すべて

VMRS NEON/VFP システムレジスタから ARM レジスタへの転送 (ページ 4-14) - すべて

VMSR ARM レジスタから NEON/VFP システムレジスタへの転送 (ページ 4-14) - すべて

VPOP 完全降順スタックからの VFP または NEON レジスタの

ポップ

(ページ 4-9) - すべて

VPUSH 完全降順スタックへの VFP または NEON レジスタのプッ

シュ

(ページ 4-9) - すべて

VSTM 多重ストア (ページ 4-9) - すべて

VSTR ストア (ページ 4-8) スカラ すべて

ストア(ポストインクリメントとプレデクリメント) (ページ 4-74) スカラ すべて

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-5ID 011811 Non-Confidential

Page 213: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

表 4-3 VFP 命令の参照ページ

ニーモニック 概要 ページ 演算アーキテクチャ

VABS 絶対値 (ページ 4-80) ベクタ すべて

VADD 加算 (ページ 4-81) ベクタ すべて

VCMP 比較 (ページ 4-84) スカラ すべて

VCVT 単精度と倍精度間の変換 (ページ 4-85) スカラ すべて

浮動小数点と整数間の変換 (ページ 4-86) スカラ すべて

浮動小数点と固定小数点間の変換 (ページ 4-87) スカラ VFPv3

VCVTB、VCVTT 半精度浮動小数点数と単精度浮動小数点数間の変換 (ページ 4-88) スカラ 半精度

VDIV 除算 (ページ 4-81) ベクタ すべて

VFMA、VFMS 結合積和、結合積差 (ページ 4-83) スカラ VFPv4

VFNMA、VFNMS 否定を伴う結合積和、否定を伴う結合積差 (ページ 4-83) スカラ VFPv4

VMLA 積和 (ページ 4-82) ベクタ すべて

VMLS 積差 (ページ 4-82) ベクタ すべて

VMOV 単精度または倍精度レジスタへの浮動小数点イミディエート値の挿入(表 4-2 (ページ 4-5)も参照)

(ページ 4-89) スカラ VFPv3

VMUL 乗算 (ページ 4-82) ベクタ すべて

VNEG 否定 (ページ 4-80) ベクタ すべて

VNMLA 否定積和 (ページ 4-82) ベクタ すべて

VNMLS 否定積差 (ページ 4-82) ベクタ すべて

VNMUL 否定乗算 (ページ 4-82) ベクタ すべて

VSQRT 平方根 (ページ 4-80) ベクタ すべて

VSUB 減算 (ページ 4-81) ベクタ すべて

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-6ID 011811 Non-Confidential

Page 214: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.2 NEON と VFP に共通の命令

このセクションは以下のサブセクションから構成されています。

• 「VLDR、VSTR」 (ページ 4-8)

拡張レジスタロードとストア。

• 「VLDM、VSTM、VPOP、VPUSH」 (ページ 4-9)

拡張レジスタ多重ロードとストア。

• 「VMOV (2 本の ARM レジスタと拡張レジスタ間)」 (ページ 4-11)

2 本の ARM レジスタと 64 ビット拡張レジスタとの間で内容を転送します。

• 「VMOV(ARM レジスタと NEON スカラの間)」 (ページ 4-12)

ARM レジスタと半分の 64 ビット拡張レジスタとの間で内容を転送します。

• 「VMOV(1 本の ARM レジスタと単精度 VFP の間)」 (ページ 4-13)

32 ビット拡張レジスタと ARM レジスタとの間で内容を転送します。

• 「VMRS および VMSR」 (ページ 4-14)

ARM レジスタと NEON/VFP システムレジスタとの間で内容を転送します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-7ID 011811 Non-Confidential

Page 215: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.2.1 VLDR、VSTR

拡張レジスタロードとストア。

構文

VLDR{cond}{.size} Fd, [Rn{, #offset}]

VSTR{cond}{.size} Fd, [Rn{, #offset}]

VLDR{cond}{.size} Fd, label

VSTR{cond}{.size} Fd, label

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

size 任意に指定できるデータサイズ指定子です。Fd が S レジスタの場合は 32、それ以外の場合は 64 にします。

Fd ロードまたは保存する拡張レジスタを指定します。NEON 命令の場合

は、D レジスタである必要があります。VFP 命令の場合は、D または S レジスタを指定できます。

Rn 転送用のベースアドレスを保持する ARM レジスタを指定します。

offset 任意の数値式を指定します。アセンブリ時に数値が求められる必要があ

ります。値は 4 の倍数で、範囲は –1020 ~ +1020 です。値はベースアド

レスに加算され、転送に使用するアドレスを形成します。

label PC 相対式を指定します。

label は、現在の命令から ± 1KB 以内のワード境界で整列する必要があ

ります。

使用法

VLDR 命令は、メモリから拡張レジスタをロードします。VSTR 命令は、拡張レジスタの

内容をメモリに保存します。

Fd が S レジスタの場合は、1 ワードが転送されます(VFP のみ)。それ以外の場合は 2 ワードが転送されます。

VLDR 疑似命令もあります。

関連項目

概念

『アセンブラの使用』:

• 「レジスタ相対式と PC 相対式」 (ページ 8-7)

リファレンス:

• 「条件コード」 (ページ 3-173)

• 「VLDR 疑似命令」 (ページ 4-73)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-8ID 011811 Non-Confidential

Page 216: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.2.2 VLDM、VSTM、VPOP、VPUSH

拡張レジスタ多重ロード、多重ストア、スタックからのポップ、スタックへのプッシュ。

構文

VLDMmode{cond} Rn{!}, Registers

VSTMmode{cond} Rn{!}, Registers

VPOP{cond} Registers

VPUSH{cond} Registers

各パラメータには以下の意味があります。

mode 以下のいずれかを指定します。

IA 各転送後にアドレスをインクリメントします。IA はデフォルト

値なので、省略できます。

DB 各転送前にアドレスをデクリメントします。

EA 空上昇スタック演算を意味します。ロードの場合には DB、保

存の場合には IA と同じです。

FD 完全降順スタック演算を意味します。ロードの場合には IA、保存の場合には DB と同じです。

cond 任意の条件コードを指定します。

Rn 転送用のベースアドレスを保持する ARM レジスタを指定します。

! オプションです。! は、更新されたベースアドレスを Rn にライトバック

する必要があることを示します。! が指定されていない場合、mode は IA になります。

Registers 連続する拡張レジスタのリストを中括弧 { および } で囲んで指定します。

リストはコンマで区切って指定することも、範囲を指定することもできます。リストには少なくとも 1 本のレジスタを指定する必要がありま

す。

S、D、または Q レジスタを指定できますが、混在させないで下さい。レ

ジスタの数は D レジスタは 16 本、Q レジスタは 8 本を超えないようにし

て下さい。Q レジスタが指定されている場合は、逆アセンブリで D レジ

スタとして表示されます。

注 VPOP Registers は VLDM sp!, Registers に相当します。

VPUSH Registers は VSTMDB sp!, Registers に相当します。

どちらの形式も使用できます。VPOP および VPUSH に逆アセンブルされます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-9ID 011811 Non-Confidential

Page 217: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

関連項目

概念

『アセンブラの使用』:

• 「LDM および STM を使用したスタックの実装」 (ページ 5-25)

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-10ID 011811 Non-Confidential

Page 218: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.2.3 VMOV (2 本の ARM レジスタと拡張レジスタ間)

2 本の ARM レジスタと 64 ビット拡張レジスタ間、または 2 本の連続する 32 ビット VFP レジスタ間で内容を転送します。

構文

VMOV{cond} Dm, Rd, Rn

VMOV{cond} Rd, Rn, Dm

VMOV{cond} Sm, Sm1, Rd, Rn

VMOV{cond} Rd, Rn, Sm, Sm1

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Dm 64 ビット拡張レジスタを指定します。

Sm VFP 32 ビットレジスタを指定します。

Sm1 Sm の後続の VFP 32 ビットレジスタを指定します。

Rd, Rn ARM レジスタです。Rd および Rn に PC は指定できません。

使用法

VMOV Dm, Rd, Rn は Rd の内容を Dm の下位半分に転送し、Rn の内容を Dm の上位半分に転

送します。

VMOV Rd, Rn, Dm は Dm の下位半分の内容を Rd に転送し、Dm の上位半分の内容を Rn に転

送します。

VMOV Rd, Rn, Sm, Sm1 は Sm の内容を Rd に転送し、Sm1 の内容を Rn に転送します。

VMOV Sm, Sm1, Rd, Rn は Rd の内容を Sm に転送し、Rn の内容を Sm1 に転送します。

アーキテクチャ

64 ビット命令は以下のもので使用できます。

• NEON• VFPv2 以上

2 x 32 ビット命令は、VFPv2 以上で使用できます。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-11ID 011811 Non-Confidential

Page 219: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.2.4 VMOV(ARM レジスタと NEON スカラの間)

ARM レジスタと NEON スカラ間で内容を転送します。

構文

VMOV{cond}{.size} Dn[x], Rd

VMOV{cond}{.datatype} Rd, Dn[x]

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

size データサイズ。8、16、または 32 を指定できます。省略した場合、size は 32 になります。VFP 命令の場合は、size は 32 であるか省略する必要があ

ります。

datatype データ型。U8、S8、U16、S16、または 32 を指定できます。省略した場合、

datatype は 32 になります。VFP 命令の場合は、datatype は 32 であるか省

略する必要があります。

Dn[x] NEON スカラを指定します。

Rd ARM レジスタを指定します。Rd に PC は指定できません。

使用法

VMOV Rd, Dn[x] は Dn[x] の内容を Rd の 下位バイト、ハーフワード、またはワードに転

送します。Rd の残りのビットは、ゼロ拡張か符号拡張のいずれかです。

VMOV Dn[x], Rd は Rd の 下位バイト、ハーフワード、またはワードを Sn に転送しま

す。

関連項目

概念

『アセンブラの使用』:

• 「NEON スカラ」 (ページ 9-20)

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-12ID 011811 Non-Confidential

Page 220: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.2.5 VMOV(1 本の ARM レジスタと単精度 VFP の間)

単精度浮動小数点レジスタと ARM レジスタ間で内容を転送します。

構文

VMOV{cond} Rd, Sn

VMOV{cond} Sn, Rd

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Sn VFP 単精度レジスタを指定します。

Rd ARM レジスタを指定します。Rd に PC は指定できません。

使用法

VMOV Rd, Sn は Sn の内容を Rd に転送します。

VMOV Sn, Rd は Rd の内容を Sn に転送します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-13ID 011811 Non-Confidential

Page 221: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.2.6 VMRS および VMSR

ARM レジスタと NEON/VFP システムレジスタとの間で内容を転送します。

構文

VMRS{cond} Rd, extsysreg

VMSR{cond} extsysreg, Rd

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

extsysreg NEON/VFP システムレジスタを指定します。通常は FPSCR、FPSID、また

は FPEXC です。

Rd ARM レジスタを指定します。Rd に PC は指定できません。

extsysreg が FPSCR である場合は、APSR_nzcv を指定できます。この場合、

浮動小数点ステータスフラグが ARM APSR の対応するフラグに転送さ

れます。

使用法

VMRS 命令は extsysreg の内容を Rd に転送します。

VMSR 命令は Rd の内容を extsysreg に転送します。

注 これらの命令は、現在の NEON 演算または VFP 演算がすべて完了するまで ARM を停止させます。

VMRS r2,FPCID VMRS APSR_nzcv, FPSCR ; FP ス テー タ ス レジス タ を ARM APSR に転送する VMSR FPSCR, r4

関連項目

概念

『アセンブラの使用』:

• 「NEON/VFP システムレジスタ」 (ページ 9-23)

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-14ID 011811 Non-Confidential

Page 222: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.3 NEON 論理演算と比較演算

このセクションは以下のサブセクションから構成されています。

• 「VAND、VBIC、VEOR、VORN、VORR(レジスタ)」 (ページ 4-16)

ビット単位論理積、ビットクリア、排他的論理和(XOR)、否定論理和、およ

び論理和(レジスタ)

• 「VBIC および VORR (イミディエート)」 (ページ 4-17)

ビット単位ビットクリアと論理和(イミディエート)

• 「VBIF、VBIT、VBSL」 (ページ 4-18)

False の場合はビット単位挿入、True の場合はビット単位を挿入、および選択

• 「VMOV、VMVN (レジスタ)」 (ページ 4-19)

データ代入命令、およびデータの各ビットを反転させてから代入する命令

• 「VACGE および VACGT」 (ページ 4-20)

絶対値の比較

• 「VCEQ、VCGE、VCGT、VCLE、および VCLT」 (ページ 4-21)

比較

• 「VTST」 (ページ 4-22)

テストビット

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-15ID 011811 Non-Confidential

Page 223: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.3.1 VAND、VBIC、VEOR、VORN、VORR(レジスタ)

VAND(ビット単位論理積)、VBIC(ビットクリア)、VEOR(ビット単位排他的論理和)、

VORN(ビット単位否定論理和)、および VORR(ビット単位論理和)の各命令は、2 本の

レジスタ間でビット単位論理演算を実行して、デスティネーションレジスタに結果を返します。

構文

Vop{cond}{.datatype} {Qd}, Qn, Qm

Vop{cond}{.datatype} {Dd}, Dn, Dm

各パラメータには以下の意味があります。

op 以下のいずれかを指定します。

AND 論理積

ORR 論理和

EOR 排他的論理和(XOR)BIC 論理積補数

ORN 論理和補数

cond 任意の条件コードを指定します。

datatype 任意に指定できるデータ型です。アセンブラは datatype を無視します。

Qd, Qn, Qm クワッドワード演算で使用するデスティネーションレジスタ、第 1 オペ

ランドレジスタ、第 2 オペランドレジスタを指定します。

Dd, Dn, Dm ダブルワード演算で使用するデスティネーションレジスタ、第 1 オペラ

ンドレジスタ、第 2 オペランドレジスタを指定します。

注 両方のオペランドに同じレジスタを使用する VORR は VMOV 命令です。VORR はこのよう

に使用できますが、結果として生じたコードを逆アセンブルすると、VMOV 構文が生成

されます。

関連項目

リファレンス:

• 「VMOV、VMVN (レジスタ)」 (ページ 4-19)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-16ID 011811 Non-Confidential

Page 224: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.3.2 VBIC および VORR (イミディエート)

VBIC(ビットクリアイミディエート)はデスティネーションベクタの各要素を取得

し、イミディエート値を使用してビット単位論理積補数を求め、デスティネーションベクタに結果を返します。

VORR(ビット単位論理和イミディエート)は、デスティネーションベクタの各要素を

取得し、イミディエート値を使用してビット単位論理和を実行し、デスティネーションベクタに結果を返します。

構文

Vop{cond}.datatype Qd, #imm

Vop{cond}.datatype Dd, #imm

各パラメータには以下の意味があります。

op BIC または ORR を指定します。

cond 任意の条件コードを指定します。

datatype I8、I16、I32、または I64 のいずれかを指定します。

Qd ま たは Dd ソースと結果の NEON レジスタを指定します。

imm イミディエート値を指定します。

イミディエート値

imm をデスティネーションレジスタを充填するためにアセンブラが繰り返すパターン

として指定することも、(パターンに準拠する)イミディエート値を省略せずに直接指定することもできます。imm のパターンは datatype で決まります(表 4-4 を参照)。

I8 データ型または I64 データ型を使用する場合、アセンブラはそれを I16 命令か I32 命令に変換して、imm のパターンに一致させます。イミディエート値が表 4-4 に示し

たパターンのいずれにも一致しない場合、アセンブラはエラーを生成します。

関連項目

リファレンス:

• 「VAND および VORN (イミディエート)」 (ページ 4-76)

• 「条件コード」 (ページ 3-173)

表 4-4 イミディエート値のパターン

I16 I32

0x00XY 0x000000XY

0xXY00 0x0000XY00

0x00XY0000

0xXY000000

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-17ID 011811 Non-Confidential

Page 225: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.3.3 VBIF、VBIT、VBSL

VBIT(True の場合はビット単位の挿入)は、第 2 オペランドの対応するビットが 1 の場合は第 1 オペランドからデスティネーションに各ビットを挿入します。それ以外

の場合は、デスティネーションビットを変更しません。

VBIF(False の場合はビット単位の挿入)は、第 2 オペランドの対応するビットが 0 の場合は第 1 オペランドからデスティネーションに各ビットを挿入します。それ以外

の場合は、デスティネーションビットを変更しません。

VBSL(ビット単位の選択)は、デスティネーションの対応するビットが 1 の場合は第 1 オペランドから、0 の場合は第 2 オペランドからデスティネーションの各ビットを

選択します。

構文

Vop{cond}{.datatype} {Qd}, Qn, Qm

Vop{cond}{.datatype} {Dd}, Dn, Dm

各パラメータには以下の意味があります。

op BIT、BIF、または BSL のいずれかを指定します。

cond 任意の条件コードを指定します。

datatype 任意に指定できるデータ型です。アセンブラは datatype を無視します。

Qd, Qn, Qm クワッドワード演算で使用するデスティネーションレジスタ、第 1 オペ

ランドレジスタ、第 2 オペランドレジスタを指定します。

Dd, Dn, Dm ダブルワード演算で使用するデスティネーションレジスタ、第 1 オペラ

ンドレジスタ、第 2 オペランドレジスタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-18ID 011811 Non-Confidential

Page 226: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.3.4 VMOV、VMVN (レジスタ)

ベクタ移動(レジスタ)は、ソースレジスタからデスティネーションレジスタに値をコピーします。

ベクタのデータの各ビットを反転させてから代入する命令(レジスタ)はソースレジスタの各ビットの値を反転して、結果をデスティネーションレジスタに返します。

構文

VMOV{cond}{.datatype} Qd, Qm

VMOV{cond}{.datatype} Dd, Dm

VMVN{cond}{.datatype} Qd, Qm

VMVN{cond}{.datatype} Dd, Dm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

datatype 任意に指定できるデータ型です。アセンブラは datatype を無視します。

Qd, Qm クワッドワード演算で使用するデスティネーションベクタとソースベク

タを指定します。

Dd, Dm ダブルワード演算で使用するデスティネーションベクタとソースベクタ

を指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-19ID 011811 Non-Confidential

Page 227: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.3.5 VACGE および VACGT

ベクタ絶対値比較は、ベクタの各要素の絶対値を取得し、2 番目のベクタの対応する

要素の絶対値と比較します。条件が True の場合、デスティネーションベクタの対応

する要素はすべて 1 に設定されます。それ以外の場合は、すべて 0 に設定されます。

構文

VACop{cond}.F32 {Qd}, Qn, Qm

VACop{cond}.F32 {Dd}, Dn, Dm

各パラメータには以下の意味があります。

op 以下のいずれかを指定します。

GE 以上(絶対値)

GT 超(絶対値)

cond 任意の条件コードを指定します。

Qd, Qn, Qm クワッドワード演算で使用するデスティネーションレジスタ、第 1 オペ

ランドレジスタ、第 2 オペランドレジスタを指定します。

Dd, Dn, Dm ダブルワード演算で使用するデスティネーションレジスタ、第 1 オペラ

ンドレジスタ、第 2 オペランドレジスタを指定します。

結果のデータ型は I32 です。

関連項目

リファレンス:

• 「VACLE および VACLT」 (ページ 4-77)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-20ID 011811 Non-Confidential

Page 228: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.3.6 VCEQ、VCGE、VCGT、VCLE、および VCLT

ベクタ比較はベクタの各要素の値を取得し、2 番目のベクタの対応する要素の値また

は 0 と比較します。条件が True の場合、デスティネーションベクタの対応する要素

はすべて 1 に設定されます。それ以外の場合は、すべて 0 に設定されます。

構文

VCop{cond}.datatype {Qd}, Qn, Qm

VCop{cond}.datatype {Dd}, Dn, Dm

VCop{cond}.datatype {Qd}, Qn, #0

VCop{cond}.datatype {Dd}, Dn, #0

各パラメータには以下の意味があります。

op 以下のいずれかを指定します。

EQ 等しい

GE 以上

GT 超

LE 以下(第 2 オペランドが #0 の場合のみ)

LT 未満(第 2 オペランドが #0 の場合のみ)

cond 任意の条件コードを指定します。

datatype 以下のいずれかを指定します。

• EQ の場合は I8、I16、I32、または F32• GE、GT、LE、または LT には S8、S16、S32、U8、U16、U32、または F32

(#0 形式を除く)

• GE、GT、LE、または LT には S8、S16、S32、または F32(#0 形式)

結果のデータ型は次のようになります。

• オペランドのデータ型が I32、S32、U32、または F32 の場合は I32• オペランドのデータ型が I16、S16、または U16 の場合は I16• オペランドのデータ型が I8、S8、または U8 の場合は I8

Qd, Qn, Qm クワッドワード演算で使用するデスティネーションレジスタ、第 1 オペ

ランドレジスタ、第 2 オペランドレジスタを指定します。

Dd, Dn, Dm ダブルワード演算で使用するデスティネーションレジスタ、第 1 オペラ

ンドレジスタ、第 2 オペランドレジスタを指定します。

#0 比較のために Qm または Dm をゼロと置き換えます。

関連項目

リファレンス:

• 「VCLE および VCLT」 (ページ 4-78)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-21ID 011811 Non-Confidential

Page 229: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.3.7 VTST

VTST(ベクタテストビット)は、ベクタの各要素を取得し、2 番目のベクタの対応す

る要素を使用してビット単位論理積を求めます。結果がゼロでない場合は、デスティネーションベクタの対応する要素はすべて 1 に設定されます。それ以外の場合

は、すべて 0 に設定されます。

構文

VTST{cond}.size {Qd}, Qn, Qm

VTST{cond}.size {Dd}, Dn, Dm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

size 8、16、または 32 のいずれかを指定します。

Qd, Qn, Qm クワッドワード演算で使用するデスティネーションレジスタ、第 1 オペ

ランドレジスタ、第 2 オペランドレジスタを指定します。

Dd, Dn, Dm ダブルワード演算で使用するデスティネーションレジスタ、第 1 オペラ

ンドレジスタ、第 2 オペランドレジスタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-22ID 011811 Non-Confidential

Page 230: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.4 NEON 汎用データ処理命令

このセクションは以下のサブセクションから構成されています。

• 「VCVT(固定小数点または整数と浮動小数点間)」 (ページ 4-24)

固定小数点または整数と浮動小数点間のベクタ変換

• 「VCVT (半精度浮動小数点数と単精度浮動小数点数間の変換)」 (ページ 4-25)

半精度浮動小数点数と単精度浮動小数点数間のベクタ変換

• 「VDUP」 (ページ 4-26)

ベクタの全レーンへのスカラの複製

• 「VEXT」 (ページ 4-27)

抽出

• 「VMOV、VMVN (イミディエート)」 (ページ 4-28)

移動と負の移動(イミディエート)

• 「VMOVL, V{Q}MOVN, VQMOVUN」 (ページ 4-29)

移動(レジスタ)

• 「VREV」 (ページ 4-30)

ベクタ内の要素の反転

• 「VSWP」 (ページ 4-31)

ベクタのスワップ

• 「VTBL, VTBX」 (ページ 4-32)

ベクタテーブルの検索

• 「VTRN」 (ページ 4-33)

ベクタ置換

• 「VUZP、VZIP」 (ページ 4-34)

ベクタのインターリーブとインターリーブの解除

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-23ID 011811 Non-Confidential

Page 231: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.4.1 VCVT(固定小数点または整数と浮動小数点間)

VCVT(ベクタ変換)はベクタの各要素を以下のいずれかの方法で変換し、結果をデス

ティネーションベクタに返します。

• 浮動小数点から整数への変換

• 整数から浮動小数点への変換

• 浮動小数点から固定小数点への変換

• 固定小数点から浮動小数点への変換

構文

VCVT{cond}.type Qd, Qm {, #fbits}

VCVT{cond}.type Dd, Dm {, #fbits}

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

type ベクタの要素のデータ型を指定します。以下のいずれかになります。

S32.F32 浮動小数点から符号付き整数または固定小数点への変換

U32.F32 浮動小数点から符号なし整数または固定小数点への変換

F32.S32 符号付き整数または固定小数点から浮動小数点への変換

F32.U32 符号なし整数または固定小数点から浮動小数点への変換

Qd, Qm クワッドワード演算で使用するデスティネーションベクタとオペランド

ベクタを指定します。

Dd, Dm ダブルワード演算で使用するデスティネーションベクタとオペランドベ

クタを指定します。

fbits このパラメータが指定されている場合は、固定小数点数の小数部ビット

を指定します。それ以外の場合は、浮動小数点と整数間の変換になります。fbits は 0 ~ 32 の範囲で指定する必要があります。fbits を省略した

場合、小数部ビットは 0 になります。

丸め

整数または固定小数点から浮動小数点への変換では、近似値への丸めを使用します。

浮動小数点から整数または固定小数点への変換では、ゼロ方向への丸めを使用します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-24ID 011811 Non-Confidential

Page 232: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.4.2 VCVT (半精度浮動小数点数と単精度浮動小数点数間の変換)

VCVT(ベクタ変換)は、半精度拡張をサポートしており、ベクタの各要素を以下のい

ずれかの方法で変換して、結果をデスティネーションベクタに返します。

• 半精度浮動小数点から単精度浮動小数点への変換(F32.F16)• 単精度浮動小数点から半精度浮動小数点への変換(F16.F32)

構文

VCVT{cond}.F32.F16 Qd, Dm

VCVT{cond}.F16.F32 Dd, Qm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Qd, Dm 単精度の結果と半精度オペランドベクタのデスティネーションベクタを

指定します。

Dd, Qm 半精度の結果と単精度オペランドベクタのデスティネーションベクタを

指定します。

アーキテクチャ

この命令を使用できるのは、半精度拡張をサポートしている NEON システムだけで

す。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-25ID 011811 Non-Confidential

Page 233: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.4.3 VDUP

VDUP(ベクタ複製)は、デスティネーションベクタのすべての要素にスカラを複製し

ます。ソースは NEON スカラまたは ARM レジスタです。

構文

VDUP{cond}.size Qd, Dm[x]

VDUP{cond}.size Dd, Dm[x]

VDUP{cond}.size Qd, Rm

VDUP{cond}.size Dd, Rm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

size 8、16、または 32 を指定します。

Qd クワッドワード演算で使用するデスティネーションレジスタを指定しま

す。

Dd ダブルワード演算で使用するデスティネーションレジスタを指定しま

す。

Dm[x] NEON スカラを指定します。

Rm ARM レジスタを指定します。Rm に R15 は指定できません。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-26ID 011811 Non-Confidential

Page 234: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.4.4 VEXT

VEXT(ベクタ抽出)は、第 2 オペランドベクタの下位と第 1 オペランドベクタの上位

から 8 ビット要素を抽出し、連結して、デスティネーションベクタに結果を返しま

す。この例については、図 4-1 を参照して下さい。

図 4-1 imm = 3 の場合のダブルワード VEXT 演算

構文

VEXT{cond}.8 {Qd}, Qn, Qm, #imm

VEXT{cond}.8 {Dd}, Dn, Dm, #imm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Qd, Qn, Qm クワッドワード演算で使用するデスティネーションレジスタ、第 1 オペ

ランドレジスタ、第 2 オペランドレジスタを指定します。

Dd, Dn, Dm ダブルワード演算で使用するデスティネーションレジスタ、第 1 オペラ

ンドレジスタ、第 2 オペランドレジスタを指定します。

imm 第 2 オペランドベクタの下位から抽出する 8 ビット要素の数を指定しま

す。ダブルワード演算では 0 ~ 7 の範囲、クワッドワード演算では 0 ~ 15 の範囲です。

VEXT 疑似命令

8 の代わりに 16、32、または 64 のデータ型を指定できます。この場合、#imm にバイ

トの代わりにハーフワード、ワード、またはダブルワードを使用すると、それに応じて許容範囲が小さくなります。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

Vd

VnVm0123456701234567

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-27ID 011811 Non-Confidential

Page 235: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.4.5 VMOV、VMVN (イミディエート)

VMOV(ベクタの移動)と VMVN(ベクタの負の移動)イミディエートでは、イミディ

エート値がデスティネーションレジスタに生成されます。

構文

Vop{cond}.datatype Qd, #imm

Vop{cond}.datatype Dd, #imm

各パラメータには以下の意味があります。

op MOV または MVN を指定します。

cond 任意の条件コードを指定します。

datatype I8、I16、I32、I64、または F32 を指定します。

Qd ま たは Dd 結果を保持する NEON レジスタです。

imm datatype で指定された型のイミディエート値です。複製されてデスティ

ネーションレジスタに配置されます。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

表 4-5 使用可能なイミディエート値

datatype VMOV VMVN

I8 0xXY -

I16 0x00XY、0xXY00 0xFFXY、0xXYFF

I32 0x000000XY、0x0000XY00、0x00XY0000、

0xXY000000

0xFFFFFFXY、0xFFFFXYFF、0xFFXYFFFF、

0xXYFFFFFF

0x0000XYFF、0x00XYFFFF 0xFFFFXY00、0xFFXY0000

I64 バイトマスク、0xGGHHJJKKLLMMNNPP a -

F32 浮動小数点数 b -

a. 0xGG、0xHH、0xJJ、0xKK、0xLL、0xMM、0xNN、および 0xPP のそれぞれを 0x00 または 0xFF にします。

b. +/–n * 2–r と表すことができる任意の数値。ここで、n と r は整数、16 <= n <= 31、0 <= r <= 7 です。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-28ID 011811 Non-Confidential

Page 236: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.4.6 VMOVL, V{Q}MOVN, VQMOVUN

VMOVL(ベクタ Long 移動)はダブルワードベクタの各要素を取得し、符号拡張または

ゼロ拡張を行って元の長さの 2 倍にして、クワッドワードベクタに結果を返します。

VMOVN(ベクタ移動および Narrow)は、クワッドワードベクタの各要素の下位半分を

ダブルワードベクタの対応する要素にコピーします。

VQMOVN(ベクタサチュレート移動および Narrow)は、オペランドベクタの各要素をデ

スティネーションベクタの対応する要素にコピーします。結果の要素の幅はオペランド要素の半分で、値は結果の幅にサチュレートされます。

VQMOVUN(ベクタサチュレート移動および Narrow、符号付きオペランドと符号のない

結果)は、オペランドベクタの各要素をデスティネーションベクタの対応する要素にコピーします。結果の要素の幅はオペランド要素の半分で、値は結果の幅にサチュレートされます。

構文

VMOVL{cond}.datatype Qd, Dm

V{Q}MOVN{cond}.datatype Dd, Qm

VQMOVUN{cond}.datatype Dd, Qm

各パラメータには以下の意味があります。

Q このパラメータが指定されている場合は、結果がサチュレートされま

す。

cond 任意の条件コードを指定します。

datatype 以下のいずれかを指定します。

S8、S16、S32 VMOVL の場合

U8、U16、U62 VMOVL の場合

I16、I32、I64 VMOVN の場合

S16、S32、S64 VQMOVN または VQMOVUN の場合

U16、U32、U64 VQMOVN の場合

Qd, Dm VMOVL のデスティネーションベクタとオペランドベクタを指定します。

Dd, Qm V{Q}MOV{U}N のデスティネーションベクタとオペランドベクタを指定しま

す。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-29ID 011811 Non-Confidential

Page 237: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.4.7 VREV

VREV16(ハーフワード内のベクタ反転)は、ベクタの各ハーフワード内の 8 ビット要

素の順序を逆にして、対応するデスティネーションベクタに結果を返します。

VREV32(ワード内のベクタ反転)は、ベクタの各ワード内の 8 ビットまたは 16 ビット

要素の順序を逆にして、対応するデスティネーションベクタに結果を返します。

VREV64(ダブルワード内のベクタ反転)は、ベクタの各ダブルワード内の 8 ビット、

16 ビット、または 32 ビット要素の順序を逆にして、対応するデスティネーションベ

クタに結果を返します。

構文

VREVn{cond}.size Qd, Qm

VREVn{cond}.size Dd, Dm

各パラメータには以下の意味があります。

n 16、32、または 64 のいずれかを指定します。

cond 任意の条件コードを指定します。

size 8、16、32 のいずれかであり、n 未満である必要があります。

Qd, Qm クワッドワード演算で使用するデスティネーションベクタとオペランド

ベクタを指定します。

Dd, Dm ダブルワード演算で使用するデスティネーションベクタとオペランドベ

クタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-30ID 011811 Non-Confidential

Page 238: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.4.8 VSWP

VSWP(ベクタスワップ)は 2 つのベクタの内容を交換します。ベクタはダブルワード

またはクワッドワードのいずれかです。データ型は区別されません。

構文

VSWP{cond}{.datatype} Qd, Qm

VSWP{cond}{.datatype} Dd, Dm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

datatype 任意に指定できるデータ型です。アセンブラは datatype を無視します。

Qd, Qm クワッドワード演算で使用するベクタを指定します。

Dd, Dm ダブルワード演算で使用するベクタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-31ID 011811 Non-Confidential

Page 239: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.4.9 VTBL, VTBX

VTBL(ベクタテーブル検索)は、コントロールベクタのバイトインデクスを使用し、

テーブル内のバイト値を検索して新しいベクタを生成します。範囲外のインデクスは 0 を返します。

VTBX(ベクタテーブル拡張)は、同様に動作しますが、範囲外のインデクスがデス

ティネーション要素を変更することはありません。

構文

Vop{cond}.8 Dd, list, Dm

各パラメータには以下の意味があります。

op TBL または TBX を指定します。

cond 任意の条件コードを指定します。

Dd デスティネーションベクタを指定します。

list テーブルを含むベクタを指定します。以下のいずれかになります。

• {Dn}

• {Dn,D(n+1)}

• {Dn,D(n+1),D(n+2)}

• {Dn,D(n+1),D(n+2),D(n+3)}

• {Qn,Q(n+1)}

list 内のすべてのレジスタは、D0 ~ D31 または Q0 ~ Q15 の範囲内にある

ことが必要です。また、レジスタバンクの終端でラップアラウンドしないようにしてください。例えば、{D31,D0,D1} は使用できません。list に Q レジスタが含まれている場合、同等の D レジスタに逆アセンブルされま

す。

Dm インデクスベクタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-32ID 011811 Non-Confidential

Page 240: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.4.10 VTRN

VTRN(ベクタ置換)は、オペランドベクタの要素を 2 x 2 マトリクスの要素として処

理し、マトリクスを置換します。図 4-2 と図 4-3 は VTRN の演算の例を示します。

図 4-2 ダブルワード VTRN.8 演算

図 4-3 ダブルワード VTRN.32 演算

構文

VTRN{cond}.size Qd, Qm

VTRN{cond}.size Dd, Dm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

size 8、16、または 32 のいずれかを指定します。

Qd, Qm クワッドワード演算で使用するベクタを指定します。

Dd, Dm ダブルワード演算で使用するベクタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

Dd

Dm017 6 5 4 3 2

Dd

Dm01

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-33ID 011811 Non-Confidential

Page 241: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.4.11 VUZP、VZIP

VZIP(ベクタ圧縮)は 2 つのベクタの要素をインターリーブします。

VUZP(ベクタ解凍)は 2 つのベクタの要素のインターリーブを解除します。

インターリーブの解除は、インターリーブの逆のプロセスです。

構文

Vop{cond}.size Qd, Qm

Vop{cond}.size Dd, Dm

各パラメータには以下の意味があります。

op UZP または ZIP を指定します。

cond 任意の条件コードを指定します。

size 8、16、または 32 のいずれかを指定します。

Qd, Qm クワッドワード演算で使用するベクタを指定します。

Dd, Dm ダブルワード演算で使用するベクタを指定します。

表 4-6 ダブルワード VZIP.8 演算

演算前のレジスタ状態 演算後のレジスタ状態

Dd A7 A6 A5 A4 A3 A2 A1 A0 B3 A3 B2 A2 B1 A1 B0 A0

Dm B7 B6 B5 B4 B3 B2 B1 B0 B7 A7 B6 A6 B5 A5 B4 A4

表 4-7 クワッドワード VZIP.32 演算

演算前のレジスタ状態 演算後のレジスタ状態

Qd A3 A2 A1 A0 B1 A1 B0 A0

Qm B3 B2 B1 B0 B3 A3 B2 A2

表 4-8 ダブルワード VUZP.8 演算

演算前のレジスタ状態 演算後のレジスタ状態

Dd A7 A6 A5 A4 A3 A2 A1 A0 B6 B4 B2 B0 A6 A4 A2 A0

Dm B7 B6 B5 B4 B3 B2 B1 B0 B7 B5 B3 B1 A7 A5 A3 A1

表 4-9 クワッドワード VUZP.32 演算

演算前のレジスタ状態 演算後のレジスタ状態

Qd A3 A2 A1 A0 B2 B0 A2 A0

Qm B3 B2 B1 B0 B3 B1 A3 A1

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-34ID 011811 Non-Confidential

Page 242: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

注 以下はすべて同じ命令です。

• VZIP.32 Dd, Dm

• VUZP.32 Dd, Dm

• VTRN.32 Dd, Dm

命令は VTRN.32 Dd, Dm として逆アセンブルされます。

関連項目

リファレンス:

• 「3 要素構造体からなる配列のインターリーブの解除」 (ページ 4-64)

• 「VTRN」 (ページ 4-33)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-35ID 011811 Non-Confidential

Page 243: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.5 NEON シフト命令

このセクションは以下のサブセクションから構成されています。

• 「VSHL、VQSHL、VQSHLU、および VSHLL (イミディエートによる)」 (ページ 4-37)

イミディエート値による左シフト

• 「V{Q}{R}SHL(符号付き変数による)」 (ページ 4-39)

符号付き変数による左シフト

• 「V{R}SHR{N}, V{R}SRA(イミディエートによる)」 (ページ 4-40)

イミディエート値による右シフト

• 「VQ{R}SHR{U}N(イミディエートによる)」 (ページ 4-41)

イミディエート値による右シフトとサチュレート

• 「VSLI および VSRI」 (ページ 4-42)

左シフトと挿入および右シフトと挿入

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-36ID 011811 Non-Confidential

Page 244: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.5.1 VSHL、VQSHL、VQSHLU、および VSHLL (イミディエートによる)

ベクタ左シフト(イミディエートによる)命令は、整数ベクタの各要素を取得し、イミディエート値で左にシフトして、デスティネーションベクタに結果を返します。

VSHL(ベクタ左シフト)では、各要素の左の範囲外にシフトされたビットは失われま

す。

VQSHL(ベクタサチュレート左シフト)と VQSHLU(ベクタサチュレート左シフト符号

なし)では、サチュレーションが発生するとスティッキー QC フラグ(FPSCR ビッ

ト [27])が設定されます。

VSHLL(ベクタ左シフト Long)では、値は符号拡張またはゼロ拡張されます。

構文

V{Q}SHL{U}{cond}.datatype {Qd}, Qm, #imm

V{Q}SHL{U}{cond}.datatype {Dd}, Dm, #imm

VSHLL{cond}.datatype Qd, Dm, #imm

各パラメータには以下の意味があります。

Q このパラメータが指定されている場合、オーバーフローした結果はサ

チュレートされます。

U Q も指定されている場合にのみ使用できます。オペランドに符号が付い

ても結果には符合が付きません。

cond 任意の条件コードを指定します。

datatype 以下のいずれかを指定します。

I8、I16、I32、I64 VSHL の場合

S8、S16、S32 VSHLL、VQSHL、または VQSHLU の場合

U8、U16、U32 VSHLL または VQSHL の場合

S64 VQSHL または VQSHLU の場合

U64 VQSHL の場合

Qd, Qm クワッドワード演算で使用するデスティネーションベクタとオペランド

ベクタを指定します。

Dd, Dm ダブルワード演算で使用するデスティネーションベクタとオペランドベ

クタを指定します。

Qd, Dm long 演算で使用するデスティネーションベクタとオペランドベクタを指

定します。

imm 以下の範囲でシフトのサイズを指定するイミディエート値です。

• VSHLL の場合は 1 ~ size(datatype)• VSHL、VQSHL、または VQSHLU の場合は 1 ~ (size(datatype) – 1)

0 を使用できますが、生成されるコードは VMOV または VMOVL に逆アセン

ブルされます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-37ID 011811 Non-Confidential

Page 245: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-38ID 011811 Non-Confidential

Page 246: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.5.2 V{Q}{R}SHL(符号付き変数による)

VSHL(符号付き変数によるベクタ左シフト)は、ベクタの各要素を取得し、2 番目の

ベクタの対応する要素の 下位バイトの値でシフトし、デスティネーションベクタに結果を返します。シフト値が正の場合は、左シフトになります。それ以外の場合は、右シフトになります。

結果はオプションでサチュレート、丸め、またはその両方を実行できます。サチュレーションが発生した場合は、スティッキー QC フラグ(FPSCR ビット [27])が設定

されます。

構文

V{Q}{R}SHL{cond}.datatype {Qd}, Qm, Qn

V{Q}{R}SHL{cond}.datatype {Dd}, Dm, Dn

各パラメータには以下の意味があります。

Q このパラメータが指定されている場合、オーバーフローした結果はサ

チュレートされます。

R このパラメータが指定されている場合、結果は丸められます。指定され

ていない場合、結果は切り捨てられます。

cond 任意の条件コードを指定します。

datatype S8、S16、S32、S64、U8、U16、U32、U64 のいずれかを指定します。

Qd, Qm, Qn クワッドワード演算で使用するデスティネーションベクタ、第 1 オペラ

ンドベクタ、および第 2 オペランドベクタを指定します。

Dd, Dm, Dn ダブルワード演算で使用するデスティネーションベクタ、第 1 オペラン

ドベクタ、および第 2 オペランドベクタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-39ID 011811 Non-Confidential

Page 247: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.5.3 V{R}SHR{N}, V{R}SRA(イミディエートによる)

V{R}SHR{N}(イミディエート値によるベクタ右シフト)は、ベクタの各要素を取得し、

イミディエート値で右シフトして、デスティネーションベクタに結果を返します。結果はオプションで丸め、切り捨て、またはその両方を実行できます。

V{R}SRA(イミディエート値によるベクタ右シフトと累積)は、ベクタの各要素を取

得し、イミディエート値で右シフトして、デスティネーションベクタに結果を累積します。結果はオプションで丸めることができます。

構文

V{R}SHR{cond}.datatype {Qd}, Qm, #imm

V{R}SHR{cond}.datatype {Dd}, Dm, #imm

V{R}SRA{cond}.datatype {Qd}, Qm, #imm

V{R}SRA{cond}.datatype {Dd}, Dm, #imm

V{R}SHRN{cond}.datatype Dd, Qm, #imm

各パラメータには以下の意味があります。

R このパラメータが指定されている場合は、結果が丸められます。それ以

外の場合、結果は切り捨てられます。

cond 任意の条件コードを指定します。

datatype 以下のいずれかを指定します。

S8?S16?S32?S64 V{R}SHR または V{R}SRA の場合

U8?U16?U32?U64 V{R}SHR または V{R}SRA の場合

I16?I32?I64 V{R}SHRN の場合

Qd, Qm クワッドワード演算で使用するデスティネーションベクタとオペランド

ベクタを指定します。

Dd, Dm ダブルワード演算で使用するデスティネーションベクタとオペランドベ

クタを指定します。

Dd, Qm Narrow 演算で使用するデスティネーションベクタとオペランドベクタ

を指定します。

imm 0 ~ (size(datatype) – 1) の範囲でシフトのサイズを指定するイミディエー

ト値です。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-40ID 011811 Non-Confidential

Page 248: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.5.4 VQ{R}SHR{U}N(イミディエートによる)

VQ{R}SHR{U}N(ベクタサチュレート右シフト、Narrow、イミディエート値による、オ

プションの丸め)は、整数のクワッドワードベクタの各要素を取得し、イミディエート値で右シフトし、ダブルワードベクタに結果を返します。

サチュレーションが発生した場合は、スティッキー QC フラグ(FPSCR ビット [27])が設定されます。

構文

VQ{R}SHR{U}N{cond}.datatype Dd, Qm, #imm

各パラメータには以下の意味があります。

R このパラメータが指定されている場合は、結果が丸められます。それ以

外の場合、結果は切り捨てられます。

U このパラメータが指定されている場合は、オペランドに符号が付いてい

ても結果には符合が付きません。それ以外の場合は、結果はオペランドと同じ型になります。

cond 任意の条件コードを指定します。

datatype 以下のいずれかを指定します。

S16?S32?S64 VQ{R}SHRN または VQ{R}SHRUN の場合

U16?U32?U64 VQ{R}SHRN の場合のみ

Dd, Qm デスティネーションベクタとオペランドベクタを指定します。

imm 0 ~ (size(datatype) – 1) の範囲でシフトのサイズを指定するイミディエー

ト値です。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-41ID 011811 Non-Confidential

Page 249: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.5.5 VSLI および VSRI

VSLI(ベクタ左シフトと挿入)は、ベクタの各要素を取得し、イミディエート値で左

シフトして、デスティネーションベクタに結果を挿入します。各要素の左の範囲外にシフトされたビットは失われます。

VSRI(ベクタ右シフトと挿入)は、ベクタの各要素を取得し、イミディエート値で右

シフトして、デスティネーションベクタに結果を挿入します。各要素の右の範囲外にシフトされたビットは失われます。

図 4-4 クワッドワード VSLI.64 Qd, Qm, #1 の演算

図 4-5 ダブルワード VSRI.64 Dd, Dm, #2 の演算

構文

Vop{cond}.size {Qd}, Qm, #imm

Vop{cond}.size {Dd}, Dm, #imm

各パラメータには以下の意味があります。

op SLI または SRI を指定します。

cond 任意の条件コードを指定します。

size 8、16、32、64 のいずれかを指定します。

Qd, Qm クワッドワード演算で使用するデスティネーションベクタとオペランド

ベクタを指定します。

Dd, Dm ダブルワード演算で使用するデスティネーションベクタとオペランドベ

クタを指定します。

imm 以下の範囲でシフトのサイズを指定するイミディエート値です。

• VSLI では 0 ~ (size – 1)

• VSRI では 1 ~ size

Qd

QmElement 0

0

Element 1

0

... ...

Dd

DmElement 0

0

... ...

0

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-42ID 011811 Non-Confidential

Page 250: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-43ID 011811 Non-Confidential

Page 251: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.6 NEON 汎用算術命令

このセクションは以下のサブセクションから構成されています。

• 「VABA{L}、VABD{L}」 (ページ 4-45)

ベクタ絶対差と累積、絶対差

• 「V{Q}ABS および V{Q}NEG」 (ページ 4-46)

ベクタ絶対値および否定

• 「V{Q}ADD、VADDL、VADDW、V{Q}SUB、VSUBL、VSUBW」 (ページ 4-47)

ベクタ加算および減算

• 「V{R}ADDHN および V{R}SUBHN」 (ページ 4-49)

上位半分を選択するベクタ加算および減算

• 「V{R}HADD および VHSUB」 (ページ 4-50)

ベクタ二分加算および減算

• 「VPADD{L}、VPADAL」 (ページ 4-51)

ベクタペアワイズ加算および加算累積

• 「VMAX、VMIN、VPMAX、VPMIN」 (ページ 4-53)

ベクタ 大値、 小値、ペアワイズ 大値、およびペアワイズ 小値

• 「VCLS、VCLZ、VCNT」 (ページ 4-54)

ベクタ先行符号ビットカウント、先行ゼロカウント、およびセットビットカウント

• 「VRECPE および VRSQRTE」 (ページ 4-55)

ベクタ逆数の推定および逆平方根の推定

• 「VRECPS および VRSQRTS」 (ページ 4-56)

ベクタ逆数のステップおよび逆平方根のステップ

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-44ID 011811 Non-Confidential

Page 252: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.6.1 VABA{L}、VABD{L}

VABA(ベクタ絶対差と累積)は、あるベクタの要素を対応する別のベクタの要素から

減算し、その結果の絶対値をデスティネーションベクタの要素に累積します。

VABD(ベクタ絶対差)は、あるベクタの要素を対応する別のベクタの要素から減算

し、その結果の絶対値をデスティネーションベクタの要素に返します。

いずれの命令にも Long バージョンがあります。

構文

Vop{cond}.datatype {Qd}, Qn, Qm

Vop{cond}.datatype {Dd}, Dn, Dm

VopL{cond}.datatype Qd, Dn, Dm

各パラメータには以下の意味があります。

op ABA または ABD を指定します。

cond 任意の条件コードを指定します。

datatype 以下のいずれかを指定します。

• VABA、VABAL、または VABDL には S8、S16、S32、U8、U16、または U32• VABD には S8、S16、S32、U8、U16、U32、または F32

Qd, Qn, Qm クワッドワード演算で使用するデスティネーションベクタ、第 1 オペラ

ンドベクタ、および第 2 オペランドベクタを指定します。

Dd, Dn, Dm ダブルワード演算で使用するデスティネーションベクタ、第 1 オペラン

ドベクタ、および第 2 オペランドベクタを指定します。

Qd, Dn, Dm Long 演算で使用するデスティネーションベクタ、第 1 オペランドベク

タ、および第 2 オペランドベクタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-45ID 011811 Non-Confidential

Page 253: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.6.2 V{Q}ABS および V{Q}NEG

VABS(ベクタ絶対値)は、ベクタの各要素の絶対値を取得して、その結果を 2 番目の

ベクタに返します(浮動小数点バージョンは、符号ビットをクリアするだけです)。

VNEG(ベクタ否定)は、ベクタの各要素を否定して、その結果を 2 番目のベクタに返

します(浮動小数点バージョンは、符号ビットを反転するだけです)。

いずれの命令にもサチュレートバージョンがあります。サチュレーションが発生した場合は、スティッキー QC フラグ(FPSCR ビット [27])が設定されます。

構文

V{Q}op{cond}.datatype Qd, Qm

V{Q}op{cond}.datatype Dd, Dm

各パラメータには以下の意味があります。

Q このパラメータが指定されている場合、オーバーフローした結果はサ

チュレートされます。

op ABS または NEG を指定します。

cond 任意の条件コードを指定します。

datatype 以下のいずれかを指定します。

S8、S16、S32 VABS、VNEG、VQABS、または VQNEG の場合

F32 VABS および VNEG の場合のみ

Qd, Qm クワッドワード演算で使用するデスティネーションベクタとオペランド

ベクタを指定します。

Dd, Dm ダブルワード演算で使用するデスティネーションベクタとオペランドベ

クタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-46ID 011811 Non-Confidential

Page 254: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.6.3 V{Q}ADD、VADDL、VADDW、V{Q}SUB、VSUBL、VSUBW

VADD(ベクタ加算)は、2 つのベクタのそれぞれ対応する要素を加算し、その結果を

デスティネーションベクタに返します。

VSUB(ベクタ減算)は、あるベクタの要素を対応する別のベクタの要素から減算し、

その結果をデスティネーションベクタに返します。

VADD と VSUB には次のバージョンがあります。

• サチュレート。サチュレーションが発生した場合は、スティッキー QC フラグ

(FPSCR ビット [27])が設定されます。

• Long。• Wide。

構文

V{Q}op{cond}.datatype {Qd}, Qn, Qm ; サチ ュ レー ト命令

V{Q}op{cond}.datatype {Dd}, Dn, Dm ; サチ ュ レー ト命令

VopL{cond}.datatype Qd, Dn, Dm ; Long 命令

VopW{cond}.datatype {Qd}, Qn, Dm ; Wide 命令

各パラメータには以下の意味があります。

Q このパラメータが指定されている場合、オーバーフローした結果はサ

チュレートされます。

op ADD または SUB を指定します。

cond 任意の条件コードを指定します。

datatype 以下のいずれかを指定します。

I8、I16、I32、I64、F32 VADD または VSUB の場合

S8、S16、S32 VQADD、VQSUB、VADDL、VADDW、VSUBL、または VSUBW の場

U8、U16、U32 VQADD、VQSUB、VADDL、VADDW、VSUBL、または VSUBW の場

S64、U64 VQADD または VQSUB の場合

Qd, Qn, Qm クワッドワード演算で使用するデスティネーションベクタ、第 1 オペラ

ンドベクタ、および第 2 オペランドベクタを指定します。

Dd, Dn, Dm ダブルワード演算で使用するデスティネーションベクタ、第 1 オペラン

ドベクタ、および第 2 オペランドベクタを指定します。

Qd, Dn, Dm Long 演算で使用するデスティネーションベクタ、第 1 オペランドベク

タ、および第 2 オペランドベクタを指定します。

Qd, Qn, Dm Wide 演算で使用するデスティネーションベクタ、第 1 オペランドベク

タ、および第 2 オペランドベクタを指定します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-47ID 011811 Non-Confidential

Page 255: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-48ID 011811 Non-Confidential

Page 256: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.6.4 V{R}ADDHN および V{R}SUBHN

V{R}ADDH(上位半分を選択してベクタ加算し、幅を狭める)は、2 つのベクタのそれ

ぞれ対応する要素を加算し、その結果の上位半分を選択して、 終的な結果をデスティネーションベクタに返します。結果は丸めるか、切り捨てることができます。

V{R}SUBH(上位半分を選択してベクタ減算し、幅を狭める)は、あるベクタの要素を

対応する別のベクタの要素から減算し、その結果の上位半分を選択して、 終的な結果をデスティネーションベクタに返します。結果は丸めるか、切り捨てることができます。

構文

V{R}opHN{cond}.datatype Dd, Qn, Qm

各パラメータには以下の意味があります。

R このパラメータが指定されている場合、結果は丸められます。指定され

ていない場合、結果は切り捨てられます。

op ADD または SUB を指定します。

cond 任意の条件コードを指定します。

datatype I16、I32、または I64 のいずれかを指定します。

Dd, Qn, Qm デスティネーションベクタ、第 1 オペランドベクタ、および第 2 オペラ

ンドベクタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-49ID 011811 Non-Confidential

Page 257: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.6.5 V{R}HADD および VHSUB

VHADD(ベクタ二分加算)は、2 つのベクタのそれぞれ対応する要素を加算し、結果

を 1 ビット右にシフトして、その結果をデスティネーションベクタに返します。結

果は丸めるか、切り捨てることができます。

VHSUB(ベクタ二分減算)は、あるベクタの要素を対応する別のベクタの要素から減

算し、結果を 1 ビット右にシフトして、その結果をデスティネーションベクタに返

します。結果は常に切り捨てられます。

構文

V{R}HADD{cond}.datatype {Qd}, Qn, Qm

V{R}HADD{cond}.datatype {Dd}, Dn, Dm

VHSUB{cond}.datatype {Qd}, Qn, Qm

VHSUB{cond}.datatype {Dd}, Dn, Dm

各パラメータには以下の意味があります。

R このパラメータが指定されている場合、結果は丸められます。指定され

ていない場合、結果は切り捨てられます。

cond 任意の条件コードを指定します。

datatype S8、S16、S32、U8、U16、U32 のいずれかを指定します。

Qd, Qn, Qm クワッドワード演算で使用するデスティネーションベクタ、第 1 オペラ

ンドベクタ、および第 2 オペランドベクタを指定します。

Dd, Dn, Dm ダブルワード演算で使用するデスティネーションベクタ、第 1 オペラン

ドベクタ、および第 2 オペランドベクタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-50ID 011811 Non-Confidential

Page 258: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.6.6 VPADD{L}、VPADAL

VPADD(ベクタペアワイズ加算)は、2 つのベクタの隣接する要素のペアを加算し、

その結果をデスティネーションベクタに返します。

図 4-6 VPADD 演算の例(データ型 I16 の場合)

VPADDL(ベクタペアワイズ加算 Long)は、あるベクタの隣接する要素のペアを加算

し、結果を符号拡張またはゼロ拡張し元の幅の 2 倍にして、 終的な結果をデス

ティネーションベクタに返します。

図 4-7 ダブルワード VPADDL 演算の例(データ型 S16 の場合)

VPADAL(ベクタペアワイズ加算累積 Long)は、あるベクタの隣接する要素のペアを

加算し、その結果の絶対値をデスティネーションベクタの要素に累積します。

図 4-8 VPADAL 演算の例(データ型 S16 の場合)

構文

VPADD{cond}.datatype {Dd}, Dn, Dm

VPopL{cond}.datatype Qd, Qm

VPopL{cond}.datatype Dd, Dm

各パラメータには以下の意味があります。

op ADD または ADA を指定します。

cond 任意の条件コードを指定します。

Dd

DnDm

+ + ++

Dd

Dm

+ +

Dd

Dm

+ +

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-51ID 011811 Non-Confidential

Page 259: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

datatype 以下のいずれかを指定します。

I8、I16、I32、F32 VPADD の場合

S8、S16、S32 VPADDL または VPADAL の場合

U8、U16、U32 VPADDL または VPADAL の場合

Dd, Dn, Dm VPADD 命令で使用するデスティネーションベクタ、第 1 オペランドベク

タ、および第 2 オペランドベクタを指定します。

Qd, Qm クワッドワードの VPADDL または VPADAL で使用するデスティネーションベ

クタとオペランドベクタを指定します。

Dd, Dm ダブルワードの VPADDL または VPADAL で使用するデスティネーションベク

タとオペランドベクタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-52ID 011811 Non-Confidential

Page 260: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.6.7 VMAX、VMIN、VPMAX、VPMIN

VMAX(ベクタ 大値)は、2 つのベクタのそれぞれ対応する要素を比較し、各ペアの

大きい方の要素をデスティネーションベクタの対応する要素にコピーします。

VMIN(ベクタ 小値)は、2 つのベクタのそれぞれ対応する要素を比較し、各ペアの

小さい方の要素をデスティネーションベクタの対応する要素にコピーします。

VPMAX(ベクタペアワイズ 大値)は、2 つのベクタの隣接する要素のペアを比較し、

各ペアの大きい方の要素をデスティネーションベクタの対応する要素にコピーします。オペランドと結果はダブルワードベクタである必要があります。

VPMIN(ベクタペアワイズ 小値)は、2 つのベクタの隣接する要素のペアを比較し、

各ペアの小さい方の要素をデスティネーションベクタの対応する要素にコピーします。オペランドと結果はダブルワードベクタである必要があります。

構文

Vop{cond}.datatype Qd, Qn, Qm

Vop{cond}.datatype Dd, Dn, Dm

VPop{cond}.datatype Dd, Dn, Dm

各パラメータには以下の意味があります。

op MAX または MIN を指定します。

cond 任意の条件コードを指定します。

datatype S8、S16、S32、U8、U16、U32、F32 のいずれかを指定します。

Qd, Qn, Qm クワッドワード演算で使用するデスティネーションベクタ、第 1 オペラ

ンドベクタ、および第 2 オペランドベクタを指定します。

Dd, Dn, Dm ダブルワード演算で使用するデスティネーションベクタ、第 1 オペラン

ドベクタ、および第 2 オペランドベクタを指定します。

浮動小数点の 大値と 小値

max(+0.0, –0.0) = +0.0

min(+0.0, –0.0) = –0.0

いずれかの入力が NaN の場合、対応する結果要素はデフォルトの NaN になります。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

• 「VPADD{L}、VPADAL」 (ページ 4-51)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-53ID 011811 Non-Confidential

Page 261: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.6.8 VCLS、VCLZ、VCNT

VCLS(ベクタ先行符号ビットカウント)は、あるベクタの各要素に含まれる 上位

ビットに続く連続ビット( 上位ビットと同じ)の数をカウントし、その結果を 2 番目のベクタに返します。

VCLZ(ベクタ先行ゼロカウント)は、あるベクタの各要素に含まれる連続するゼロの

数をカウントし( 上位ビットから開始)、その結果を 2 番目のベクタに返します。

VCNT(ベクタセットビットカウント)は、あるベクタの各要素に含まれるビットの数

をカウントし、その結果を 2 番目のベクタに返します。

構文

Vop{cond}.datatype Qd, Qm

Vop{cond}.datatype Dd, Dm

各パラメータには以下の意味があります。

op CLS、CLZ、または CNT のいずれかを指定します。

cond 任意の条件コードを指定します。

datatype 以下のいずれかを指定します。

• CLS の場合は S8、S16、または S32• CLZ の場合は I8、I16、または I32• CNT の場合は I8

Qd, Qm クワッドワード演算で使用するデスティネーションベクタとオペランド

ベクタを指定します。

Dd, Dm ダブルワード演算で使用するデスティネーションベクタとオペランドベ

クタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-54ID 011811 Non-Confidential

Page 262: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.6.9 VRECPE および VRSQRTE

VRECPE(ベクタ逆数の推定)は、あるベクタに含まれる各要素の逆数の近似値を見つ

け、その結果を 2 番目のベクタに返します。

VRSQRTE(ベクタ逆平方根の推定)は、あるベクタに含まれる各要素の逆平方根の近

似値を見つけ、その結果を 2 番目のベクタに返します。

構文

Vop{cond}.datatype Qd, Qm

Vop{cond}.datatype Dd, Dm

各パラメータには以下の意味があります。

op RECPE または RSQRTE を指定します。

cond 任意の条件コードを指定します。

datatype U32 または F32 を指定します。

Qd, Qm クワッドワード演算で使用するデスティネーションベクタとオペランド

ベクタを指定します。

Dd, Dm ダブルワード演算で使用するデスティネーションベクタとオペランドベ

クタを指定します。

有効範囲外の入力を指定した場合の結果

表 4-10 に、有効範囲外の入力値を指定した場合の結果を示します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

表 4-10 有効範囲外の入力を指定した場合の結果

オペランド要素(VRECPE) オペランド要素(VRSQRTE) 結果要素

整数 <= 0x7FFFFFFF <= 0x3FFFFFFF 0xFFFFFFFF

浮動小数点 NaN NaN、負の正規、負の無限大 デフォルトの NaN

負の 0、負の非正規 負の 0、負の非正規 負の無限大a

正の 0、正の非正規 正の 0、正の非正規 正の無限大 a

正の無限大 正の無限大 正の 0

負の無限大 負の 0

a. FPSCR (FPSCR[1]) では、ゼロによる除算の例外ビットが設定されます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-55ID 011811 Non-Confidential

Page 263: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.6.10 VRECPS および VRSQRTS

VRECPS(ベクタ逆数のステップ)は、あるベクタの要素を対応する別のベクタの要素

で乗算し、その結果を 2 から減算して、 終的な結果をデスティネーションベクタ

の要素に返します。

VRSQRTS(ベクタ逆平方根のステップ)は、あるベクタの要素を対応する別のベクタ

の要素で乗算し、その結果を 3 から減算して 2 で除算し、 終的な結果をデスティ

ネーションベクタの要素に返します。

構文

Vop{cond}.F32 {Qd}, Qn, Qm

Vop{cond}.F32 {Dd}, Dn, Dm

各パラメータには以下の意味があります。

op RECPS または RSQRTS を指定します。

cond 任意の条件コードを指定します。

Qd, Qn, Qm クワッドワード演算で使用するデスティネーションベクタ、第 1 オペラ

ンドベクタ、および第 2 オペランドベクタを指定します。

Dd, Dn, Dm ダブルワード演算で使用するデスティネーションベクタ、第 1 オペラン

ドベクタ、および第 2 オペランドベクタを指定します。

有効範囲外の入力を指定した場合の結果

表 4-11 に、有効範囲外の入力値を指定した場合の結果を示します。

使用法

ニュートンラプソン法による反復計算:

xn+1 = xn(2-dxn)

VRECPE を d に適用した結果が x0 である場合に (1/d) に収束します。

ニュートンラプソン法による反復計算:

xn+1 = xn(3-dxn2)/2

VRSQRTE を d に適用した結果が x0 である場合に (1/ √ d) に収束します。

表 4-11 有効範囲外の入力を指定した場合の結果

第 1 オペランド要素 第 2 オペランド要素 結果要素(VRECPS) 結果要素(VRSQRTS)

NaN - デフォルトの NaN デフォルトの NaN

- NaN デフォルトの NaN デフォルトの NaN

+/– 0.0 または非正規 +/– 無限大 2.0 1.5

+/– 無限大 +/– 0.0 または非正規 2.0 1.5

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-56ID 011811 Non-Confidential

Page 264: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-57ID 011811 Non-Confidential

Page 265: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.7 NEON 乗算命令

このセクションは以下のサブセクションから構成されています。

• 「VMUL{L}、VMLA{L}、VMLS{L}」 (ページ 4-59)

ベクタ乗算、積和、および積差

• 「VMUL{L}、VMLA{L}、VMLS{L}(スカラによる)」 (ページ 4-60)

ベクタ乗算、積和、および積差(スカラによる)

• 「VFMA、VFMS」 (ページ 4-61)

ベクタ結合積和およびベクタ結合積差

• 「VQDMULL、VQDMLAL、VQDMLSL(ベクタまたはスカラによる)」 (ページ 4-62)

ベクタサチュレートダブル乗算、積和、および積差(ベクタまたはスカラによる)

• 「VQ{R}DMULH(ベクタまたはスカラによる)」 (ページ 4-63)

上位半分を返すベクタサチュレートダブル乗算(ベクタまたはスカラによる)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-58ID 011811 Non-Confidential

Page 266: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.7.1 VMUL{L}、VMLA{L}、VMLS{L}

VMUL(ベクタ乗算)は、2 つのベクタのそれぞれ対応する要素を乗算し、その結果を

デスティネーションベクタに返します。

VMLA(ベクタ積和)は、2 つのベクタのそれぞれ対応する要素を乗算し、その結果を

デスティネーションベクタの要素に累積します。

VMLS(ベクタ積差)は、2 つのベクタのそれぞれ対応する要素を乗算し、その結果を

デスティネーションベクタの対応する要素から減算して、 終的な結果をデスティネーションベクタに返します。

構文

Vop{cond}.datatype {Qd}, Qn, Qm

Vop{cond}.datatype {Dd}, Dn, Dm

VopL{cond}.datatype Qd, Dn, Dm

各パラメータには以下の意味があります。

op 以下のいずれかを指定します。

MUL 乗算

MLA 積和

MLS 積差

cond 任意の条件コードを指定します。

datatype 以下のいずれかを指定します。

I8、I16、I32、F32 VMUL、VMLA、または VMLS の場合

S8、S16、S32 VMULL、VMLAL、または VMLSL の場合

U8、U16、U32 VMULL、VMLAL、または VMLSL の場合

P8 VMUL または VMULL の場合

Qd, Qn, Qm クワッドワード演算で使用するデスティネーションベクタ、第 1 オペラ

ンドベクタ、および第 2 オペランドベクタを指定します。

Dd, Dn, Dm ダブルワード演算で使用するデスティネーションベクタ、第 1 オペラン

ドベクタ、および第 2 オペランドベクタを指定します。

Qd, Dn, Dm Long 演算で使用するデスティネーションベクタ、第 1 オペランドベク

タ、および第 2 オペランドベクタを指定します。

関連項目

概念

『アセンブラの使用』:

• 「{0,1} を超える多項式算術演算」 (ページ 9-22)

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-59ID 011811 Non-Confidential

Page 267: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.7.2 VMUL{L}、VMLA{L}、VMLS{L}(スカラによる)

VMUL(スカラによるベクタ乗算)は、あるベクタの各要素をスカラで乗算し、その結

果をデスティネーションベクタに返します。

VMLA(ベクタ積和)は、あるベクタの各要素をスカラで乗算し、その結果をデスティ

ネーションベクタの対応する要素に累積します。

VMLS(ベクタ積差)は、あるベクタの各要素をスカラで乗算し、その結果をデスティ

ネーションベクタの対応する要素から減算して、 終的な結果をデスティネーションベクタに返します。

構文

Vop{cond}.datatype {Qd}, Qn, Dm[x]

Vop{cond}.datatype {Dd}, Dn, Dm[x]

VopL{cond}.datatype Qd, Dn, Dm[x]

各パラメータには以下の意味があります。

op 以下のいずれかを指定します。

MUL 乗算

MLA 積和

MLS 積差

cond 任意の条件コードを指定します。

datatype 以下のいずれかを指定します。

I16、I32、F32 VMUL、VMLA、または VMLS の場合

S16、S32 VMULL、VMLAL、または VMLSL の場合

U16、U32 VMULL、VMLAL、または VMLSL の場合

Qd, Qn クワッドワード演算で使用するデスティネーションベクタと第 1 オペラ

ンドベクタを指定します。

Dd, Dn ダブルワード演算で使用するデスティネーションベクタと第 1 オペラン

ドベクタを指定します。

Qd, Dn Long 演算で使用するデスティネーションベクタと第 1 オペランドベクタ

を指定します。

Dm[x] 第 2 オペランドを保持するスカラです。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-60ID 011811 Non-Confidential

Page 268: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.7.3 VFMA、VFMS

VFMA(ベクタ結合積和)は、2 つのオペランドベクタのそれぞれ対応する要素を乗算

し、その結果をデスティネーションベクタの要素に累積します。累算の前に乗算の結果の丸めは行われません。

VFMS(ベクタ結合積差)は、2 つのオペランドベクタのそれぞれ対応する要素を乗算

し、その結果をデスティネーションベクタの対応する要素から減算して、 終的な結果をデスティネーションベクタに返します。減算の前に乗算の結果の丸めは行われません。

構文

Vop{cond}.F32 {Qd}, Qn, Qm

Vop{cond}.F32 {Dd}, Dn, Dm

Vop{cond}.F64 {Dd}, Dn, Dm

Vop{cond}.F32 {Sd}, Sn, Sm

各パラメータには以下の意味があります。

op FMA ま たは FMS を指定します。

cond 任意の条件コードを指定します。

Sd, Sn, Sm ワード演算で使用するデスティネーションベクタとオペランドベクタを

指定します。

Dd, Dn, Dm ダブルワード演算で使用するデスティネーションベクタとオペランドベ

クタを指定します。

Qd, Qn, Qm クワッドワード演算で使用するデスティネーションベクタとオペランド

ベクタを指定します。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

• 「VMUL{L}、VMLA{L}、VMLS{L}」 (ページ 4-59)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-61ID 011811 Non-Confidential

Page 269: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.7.4 VQDMULL、VQDMLAL、VQDMLSL(ベクタまたはスカラによる)

ベクタサチュレートダブル乗算命令は、オペランドを乗算し、その結果を 2 倍にし

ます。VQDMULL は、結果をデスティネーションレジスタに返します。VQDMLAL は、結果

をデスティネーションレジスタの値に加算します。VQDMLSL は、結果をデスティネー

ションレジスタの値から減算します。

オーバーフローした結果はサチュレートされます。サチュレーションが発生した場合は、スティッキー QC フラグ(FPSCR ビット [27])が設定されます。

構文

VQDopL{cond}.datatype Qd, Dn, Dm

VQDopL{cond}.datatype Qd, Dn, Dm[x]

各パラメータには以下の意味があります。

op 以下のいずれかを指定します。

MUL 乗算

MLA 積和

MLS 積差

cond 任意の条件コードを指定します。

datatype S16 または S32 を指定します。

Qd, Dn デスティネーションベクタと第 1 オペランドベクタを指定します。

Dm ベクタによる演算の第 2 オペランドを保持するベクタです。

Dm[x] スカラによる演算の第 2 オペランドを保持するスカラです。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-62ID 011811 Non-Confidential

Page 270: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.7.5 VQ{R}DMULH(ベクタまたはスカラによる)

ベクタサチュレートダブル乗算命令は、オペランドを乗算し、その結果を 2 倍にし

ます。結果の上位半分しか返されません。

オーバーフローした結果はサチュレートされます。サチュレーションが発生した場合は、スティッキー QC フラグ(FPSCR ビット [27])が設定されます。

構文

VQ{R}DMULH{cond}.datatype {Qd}, Qn, Qm

VQ{R}DMULH{cond}.datatype {Dd}, Dn, Dm

VQ{R}DMULH{cond}.datatype {Qd}, Qn, Dm[x]

VQ{R}DMULH{cond}.datatype {Dd}, Dn, Dm[x]

各パラメータには以下の意味があります。

R このパラメータが指定されている場合、結果は丸められます。指定され

ていない場合、結果は切り捨てられます。

cond 任意の条件コードを指定します。

datatype S16 または S32 を指定します。

Qd, Qn クワッドワード演算で使用するデスティネーションベクタと第 1 オペラ

ンドベクタを指定します。

Dd, Dn ダブルワード演算で使用するデスティネーションベクタと第 1 オペラン

ドベクタを指定します。

Qm ま たは Dm ベクタによる演算の第 2 オペランドを保持するベクタです。

Dm[x] スカラによる演算の第 2 オペランドを保持するスカラです。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-63ID 011811 Non-Confidential

Page 271: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.8 NEON 要素と構造体のロード / ストア命令

このセクションは以下のサブセクションから構成されています。

• 「インターリーブ」

• 「ロードとストア命令、要素と構造体の命令における境界調整の制約」 (ページ 4-65)

• 「VLDn、VSTn(1 レーンへの 1 つの n 要素構造体)」 (ページ 4-66)

これは、ほとんどすべてのデータアクセスで使用されます。正規ベクタをロードできます(n = 1)。

• 「VLDn(全レーンへの 1 つの n 要素構造体)」 (ページ 4-68)

• 「VLDn、VSTn(複数の n 要素構造体)」 (ページ 4-70)

4.8.1 インターリーブ

このグループの命令の多くは、構造体をメモリにストアするときにインターリーブを可能にし、構造体をメモリからロードするときにインターリーブの解除を可能にします。図 4-9 に、インターリーブの解除の例を示します。インターリーブはこの逆

のプロセスです。

図 4-9 3 要素構造体からなる配列のインターリーブの解除

Z3 D2

A[3].xA[3].yA[3].z

Z2 Z1 Z0

A[2].xA[2].yA[2].z

A[1].xA[1].yA[1].z

A[0].xA[0].yA[0].z

Y3 D1Y2 Y1 Y0

X3 D0X2 X1 X0

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-64ID 011811 Non-Confidential

Page 272: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.8.2 ロードとストア命令、要素と構造体の命令における境界調整の制約

通常、これらの命令を使用すると、メモリ整列の境界調整を指定できます。命令で境界調整が指定されていない場合、境界調整の制約は、次のように A ビット

(SCTLR ビット [1])によって制御されます。

• A ビットが 0 の場合、境界調整の制約はありません(ただし、厳密に順序を指

定されたメモリやデバイスメモリなど、アクセスが整列要素である場合を除きます。この場合は予測しない結果が返されます)。

• A ビットが 1 の場合、アクセスは整列要素である必要があります。

アドレスが正しく整列されていないと、境界調整エラーが発生します。

関連項目

リファレンス

• 『ARM アーキテクチャリファレンスマニュアル』, http://infocenter.arm.com/help/topic/com.arm.doc.subset.arch.reference/index.html

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-65ID 011811 Non-Confidential

Page 273: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.8.3 VLDn、VSTn(1 レーンへの 1 つの n 要素構造体)

1 レーンへの 1 つの n 要素構造体のベクタロード。1 つの n 要素構造体をメモリから 1 つまたは複数の NEON レジスタにロードします。ロードされなかったレジスタの要

素は変更されません。

1 レーンへの 1 つの n 要素構造体のベクタストア。1 つの n 要素構造体を 1 つまたは

複数の NEON レジスタからメモリにストアします。

構文

Vopn{cond}.datatype list, [Rn{@align}]{!}

Vopn{cond}.datatype list, [Rn{@align}], Rm

各パラメータには以下の意味があります。

op LD または ST を指定します。

n 1、2、3、または 4 のいずれかにします。

cond 任意の条件コードを指定します。

datatype 詳細については、表 4-12 を参照して下さい。

list NEON レジスタリストを指定します。オプションについては、表 4-12 を参照して下さい。

Rn ベースアドレスを保持する ARM レジスタです。Rn を PC にすることはで

きません。

align オプションの境界調整を指定します。オプションについては、表 4-12 を参照して下さい。

! ! が指定されている場合、Rn は (Rn + 命令によって転送されるバイト数 ) に更新されます。更新は、すべてのロードまたはストアが実行された後に行われます。

Rm ベースアドレスからのオフセットを保持する ARM レジスタです。Rm が指定されている場合、メモリにアクセスするためにアドレスが使用された後で、Rn は (Rn + Rm) に更新されます。SP と PC は Rm に使用できませ

ん。

表 4-12 パラメータの有効な組み合わせ

n datatype list a align b 境界調整

1 8 {Dd[x]} - 標準のみ

16 {Dd[x]} @16 2 バイト

32 {Dd[x]} @32 4 バイト

2 8 {Dd[x], D(d+1)[x]} @16 2 バイト

16 {Dd[x], D(d+1)[x]} @32 4 バイト

{Dd[x], D(d+2)[x]} @32 4 バイト

32 {Dd[x], D(d+1)[x]} @64 8 バイト

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-66ID 011811 Non-Confidential

Page 274: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

{Dd[x], D(d+2)[x]} @64 8 バイト

3 8 {Dd[x], D(d+1)[x], D(d+2)[x]} - 標準のみ

16 または 32

{Dd[x], D(d+1)[x], D(d+2)[x]} - 標準のみ

{Dd[x], D(d+2)[x], D(d+4)[x]} - 標準のみ

4 8 {Dd[x], D(d+1)[x], D(d+2)[x], D(d+3)[x]} @32 4 バイト

16 {Dd[x], D(d+1)[x], D(d+2)[x], D(d+3)[x]} @64 8 バイト

{Dd[x], D(d+2)[x], D(d+4)[x], D(d+6)[x]} @64 8 バイト

32 {Dd[x], D(d+1)[x], D(d+2)[x], D(d+3)[x]} @64 または @128

8 バイトまたは 16 バイト

{Dd[x], D(d+2)[x], D(d+4)[x], D(d+6)[x]} @64 または @128

8 バイトまたは 16 バイト

a. 表内のすべてのレジスタは D0 ~ D31 の範囲内にある必要があります。

b. align は省略できます。省略した場合は、標準の境界調整ルールが適用されます。「ロードと

ストア命令、要素と構造体の命令における境界調整の制約」 (ページ 4-65)を参照して下さ

い。

表 4-12 パラメータの有効な組み合わせ (続き)

n datatype list a align b 境界調整

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-67ID 011811 Non-Confidential

Page 275: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.8.4 VLDn(全レーンへの 1 つの n 要素構造体)

全レーンへの 1 つの n 要素構造体のベクタロード。1 つの n 要素構造体の複数のコ

ピーをメモリから 1 つまたは複数の NEON レジスタにロードします。

構文

VLDn{cond}.datatype list, [Rn{@align}]{!}

VLDn{cond}.datatype list, [Rn{@align}], Rm

各パラメータには以下の意味があります。

n 1、2、3、または 4 のいずれかにします。

cond 任意の条件コードを指定します。

datatype 詳細については、表 4-13 を参照して下さい。

list NEON レジスタリストを指定します。オプションについては、表 4-13 を参照して下さい。

Rn ベースアドレスを保持する ARM レジスタです。Rn を PC にすることはで

きません。

align オプションの境界調整を指定します。オプションについては、表 4-13 を参照して下さい。

! ! が指定されている場合、Rn は (Rn + 命令によって転送されるバイト数 ) に更新されます。更新は、すべてのロードまたはストアが実行された後に行われます。

Rm ベースアドレスからのオフセットを保持する ARM レジスタです。Rm が指定されている場合、メモリにアクセスするためにアドレスが使用された後で、Rn は (Rn + Rm) に更新されます。SP と PC は Rm に使用できませ

ん。

表 4-13 パラメータの有効な組み合わせ

n datatype list a align b 境界調整

1 8 {Dd[]} - 標準のみ

{Dd[],D(d+1)[]} - 標準のみ

16 {Dd[]} @16 2 バイト

{Dd[],D(d+1)[]} @16 2 バイト

32 {Dd[]} @32 4 バイト

{Dd[],D(d+1)[]} @32 4 バイト

2 8 {Dd[], D(d+1)[]} @8 バイト

{Dd[], D(d+2)[]} @8 バイト

16 {Dd[], D(d+1)[]} @16 2 バイト

{Dd[], D(d+2)[]} @16 2 バイト

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-68ID 011811 Non-Confidential

Page 276: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

32 {Dd[], D(d+1)[]} @32 4 バイト

{Dd[], D(d+2)[]} @32 4 バイト

3 8、16、ま

たは 32{Dd[], D(d+1)[], D(d+2)[]} - 標準のみ

{Dd[], D(d+2)[], D(d+4)[]} - 標準のみ

4 8 {Dd[], D(d+1)[], D(d+2)[], D(d+3)[]} @32 4 バイト

{Dd[], D(d+2)[], D(d+4)[], D(d+6)[]} @32 4 バイト

16 {Dd[], D(d+1)[], D(d+2)[], D(d+3)[]} @64 8 バイト

{Dd[], D(d+2)[], D(d+4)[], D(d+6)[]} @64 8 バイト

32 {Dd[], D(d+1)[], D(d+2)[], D(d+3)[]} @64 または @128

8 バイトまたは 16 バイト

{Dd[], D(d+2)[], D(d+4)[], D(d+6)[]} @64 または @128

8 バイトまたは 16 バイト

a. 表内のすべてのレジスタは D0 ~ D31 の範囲内にある必要があります。

b. align は省略できます。省略した場合は、標準の境界調整ルールが適用されます。「ロードと

ストア命令、要素と構造体の命令における境界調整の制約」 (ページ 4-65)を参照して下さ

い。

表 4-13 パラメータの有効な組み合わせ (続き)

n datatype list a align b 境界調整

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-69ID 011811 Non-Confidential

Page 277: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.8.5 VLDn、VSTn(複数の n 要素構造体)

複数の n 要素構造体のベクタロード。複数の n 要素構造体をメモリから 1 つまたは複

数の NEON レジスタにロードし、インターリーブを解除します(n == 1 の場合を除き

ます)。各レジスタのすべての要素がロードされます。

複数の n 要素構造体のベクタストア。複数の n 要素構造体を 1 つまたは複数の NEON レジスタからメモリにストアし、インターリーブします(n == 1 の場合を除きます)。

各レジスタのすべての要素がストアされます。

構文

Vopn{cond}.datatype list, [Rn{@align}]{!}

Vopn{cond}.datatype list, [Rn{@align}], Rm

各パラメータには以下の意味があります。

op LD または ST を指定します。

n 1、2、3、または 4 のいずれかにします。

cond 任意の条件コードを指定します。

datatype オプションについては、表 4-14 を参照して下さい。

list NEON レジスタリストを指定します。オプションについては、表 4-14を参照して下さい。

Rn ベースアドレスを保持する ARM レジスタです。Rn を PC にすることはで

きません。

align オプションの境界調整を指定します。オプションについては、表 4-14 を参照して下さい。

! ! が指定されている場合、Rn は (Rn + 命令によって転送されるバイト数 ) に更新されます。更新は、すべてのロードまたはストアが実行された後に行われます。

Rm ベースアドレスからのオフセットを保持する ARM レジスタです。Rm が指定されている場合、メモリにアクセスするためにアドレスが使用された後で、Rn は (Rn + Rm) に更新されます。SP と PC は Rm に使用できませ

ん。

表 4-14 パラメータの有効な組み合わせ

n datatype list a align b 境界調整

1 8、16、32、

または 64{Dd} @64 8 バイト

{Dd, D(d+1)} @64 または @128 8 バイトまたは 16 バイ

{Dd, D(d+1), D(d+2)} @64 8 バイト

{Dd, D(d+1), D(d+2), D(d+3)} @64、@128、また

は @2568 バイト、16 バイト、

または 32 バイト

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-70ID 011811 Non-Confidential

Page 278: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

2 8、16、また

は 32{Dd, D(d+1)} @64, @128 8 バイトまたは 16 バイ

{Dd, D(d+2)} @64, @128 8 バイトまたは 16 バイ

{Dd, D(d+1), D(d+2), D(d+3)} @64、@128、また

は @2568 バイト、16 バイト、

または 32 バイト

3 8、16、また

は 32{Dd, D(d+1), D(d+2)} @64 8 バイト

{Dd, D(d+2), D(d+4)} @64 8 バイト

4 8、16、また

は 32{Dd, D(d+1), D(d+2), D(d+3)} @64、@128、また

は @2568 バイト、16 バイト、

または 32 バイト

{Dd, D(d+2), D(d+4), D(d+6)} @64、@128、また

は @2568 バイト、16 バイト、

または 32 バイト

a. 表内のすべてのレジスタは D0 ~ D31 の範囲内にある必要があります。

b. align は省略できます。省略した場合は、標準の境界調整ルールが適用されます。「ロードとス

トア命令、要素と構造体の命令における境界調整の制約」 (ページ 4-65)を参照して下さい。

表 4-14 パラメータの有効な組み合わせ (続き)

n datatype list a align b 境界調整

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-71ID 011811 Non-Confidential

Page 279: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.9 NEON 疑似命令および VFP 疑似命令

このセクションは以下のサブセクションから構成されています。

• 「VLDR 疑似命令」 (ページ 4-73)(NEON および VFP)

• 「VLDR と VSTR (ポストインクリメントとプレデクリメント)」 (ページ 4-74)(NEON および VFP)

• 「VMOV2」 (ページ 4-75)(NEON のみ)

• 「VAND および VORN (イミディエート)」 (ページ 4-76)(NEON のみ)

• 「VACLE および VACLT」 (ページ 4-77)(NEON のみ)

• 「VCLE および VCLT」 (ページ 4-78)(NEON のみ)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-72ID 011811 Non-Confidential

Page 280: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.9.1 VLDR 疑似命令

VLDR 疑似命令は、定数値を 64 ビットの NEON ベクタのすべての要素、または VFP 単精度 / 倍精度レジスタにロードします。

注 このセクションでは、VLDR 疑似命令についてのみ説明します。

構文

VLDR{cond}.datatype Dd,=constant

VLDR{cond}.datatype Sd,=constant

各パラメータには以下の意味があります。

datatype 以下のいずれかを指定します。

In NEON のみ

Sn NEON のみ

Un NEON のみ

F32 NEON、VFPF64 VFP のみ

n 8、16、32、または 64 のいずれかにします。

cond 任意の条件コードを指定します。

Dd ま たは Sd ロード先の拡張レジスタを指定します。

constant datatype で指定された適切な型のイミディエート値です。

使用法

レジスタに定数を直接生成できる命令(例えば VMOV)が使用可能な場合は、アセン

ブラはそれを使用します。それ以外の場合は、定数を含むダブルワードのリテラルプールエントリを生成し、VLDR 命令を使用して定数をロードします。

関連項目

リファレンス:

• 「VLDR、VSTR」 (ページ 4-8)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-73ID 011811 Non-Confidential

Page 281: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.9.2 VLDR と VSTR (ポストインクリメントとプレデクリメント)

ポストインクリメントとプレデクリメントを行う拡張レジスタをロードまたはストアする擬似命令。

注 ポストインクリメントとプレデクリメントを行わない VLDR 命令と VSTR 命令もありま

す。

構文

op{cond}{.size} Fd, [Rn], #offset ; ポス ト イ ン ク リ メ ン ト

op{cond}{.size} Fd, [Rn, #-offset]! ; プ レデ ク リ メ ン ト

各パラメータには以下の意味があります。

op 以下を指定します。

• VLDR - メモリから拡張レジスタをロードします。

• VSTR - 拡張レジスタの内容をメモリにストアします。

cond 任意の条件コードを指定します。

size 任意に指定できるデータサイズ指定子です。Fd が S レジスタの場合は 32、Fd が D レジスタの場合は 64 にします。

Fd ロードまたは保存する拡張レジスタを指定します。NEON 命令の場合

は、ダブルワード(Dd)レジスタである必要があります。VFP 命令の場

合は、倍精度(Dd)レジスタか単精度(Sd)レジスタのいずれかである

必要があります。

Rn 転送用のベースアドレスを保持する ARM レジスタを指定します。

offset アセンブリ時に数値が求められる数値式である必要があります。値は、

Fd が S レジスタの場合は 4、Fd が D レジスタの場合は 8 にします。

使用法

ポストインクリメント命令は、転送後にレジスタ内のベースアドレスをオフセット値の分だけインクリメントします。プレデクリメント命令は、レジスタ内のベースアドレスをオフセット値の分だけデクリメントしてから、レジスタ内の新しいアドレスを使用して転送を実行します。これらの擬似命令は、VLDM 命令または VSTM 命令

にアセンブルされます。

関連項目

リファレンス:

• 「VLDR、VSTR」 (ページ 4-8)

• 「VLDM、VSTM、VPOP、VPUSH」 (ページ 4-9)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-74ID 011811 Non-Confidential

Page 282: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.9.3 VMOV2

VMOV2 疑似命令は、リテラルプールから値をロードせずに、イミディエート値を生成

し、NEON ベクタのすべての要素に配置します。この疑似命令は、常に 2 つの命令に

アセンブルされます。

VMOV2 は、16 ビットの任意のイミディエート値、および範囲が制限されている 32 ビットと 64 ビットのイミディエート値を生成できます。

構文

VMOV2{cond}.datatype Qd, #constant

VMOV2{cond}.datatype Dd, #constant

各パラメータには以下の意味があります。

datatype 以下のいずれかを指定します。

• I8、I16、I32、または I64• S8、S16、S32、または S64• U8、U16、U32、または U64• F32

cond 任意の条件コードを指定します。

Qd ま たは Dd ロード先の拡張レジスタを指定します。

constant datatype で指定された適切な型のイミディエート値です。

使用法

VMOV2 は通常、VMOV 命令、または VMVN 命令にアセンブルされてから、VBIC 命令、また

は VORR 命令が続きます。

関連項目

リファレンス:

• 「VMOV、VMVN (イミディエート)」 (ページ 4-28)

• 「VBIC および VORR (イミディエート)」 (ページ 4-17)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-75ID 011811 Non-Confidential

Page 283: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.9.4 VAND および VORN (イミディエート)

VAND(ビット単位論理積イミディエート)は、デスティネーションベクタの各要素を

取得し、イミディエート値を使用してビット単位論理積を実行し、デスティネーションベクタに結果を返します。

VORN(ビット単位否定論理和イミディエート)は、デスティネーションベクタの各要

素を取得し、イミディエート値を使用してビット単位論理和補数を求め、デスティネーションベクタに結果を返します。

注 逆アセンブル時に、これらの疑似命令は、相補イミディエート値を使用して対応す

る VBIC 命令と VORR 命令に逆アセンブルされます。

構文

Vop{cond}.datatype Qd, #imm

Vop{cond}.datatype Dd, #imm

各パラメータには以下の意味があります。

op VAND または VORN を指定します。

cond 任意の条件コードを指定します。

datatype I8、I16、I32、または I64 のいずれかを指定します。

Qd ま たは Dd 結果を保持する NEON レジスタです。

imm イミディエート値を指定します。

イミディエート値

datatype が I16 の場合、イミディエート値は以下のいずれかの形式を取る必要があり

ます。

• 0xFFXY

• 0xXYFF

datatype が I32 の場合、イミディエート値は以下のいずれかの形式を取る必要があり

ます。

• 0xFFFFFFXY

• 0xFFFFXYFF

• 0xFFXYFFFF

• 0xXYFFFFFF

関連項目

リファレンス:

• 「VBIC および VORR (イミディエート)」 (ページ 4-17)

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-76ID 011811 Non-Confidential

Page 284: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.9.5 VACLE および VACLT

ベクタ絶対値比較は、ベクタの各要素の絶対値を取得し、2 番目のベクタの対応する

要素の絶対値と比較します。条件が True の場合、デスティネーションベクタの対応

する要素はすべて 1 に設定されます。それ以外の場合は、すべて 0 に設定されます。

注 逆アセンブル時に、これらの疑似命令は、反転したオペランドを使用して対応する VACGE 命令と VACGT 命令に逆アセンブルされます。

構文

VACop{cond}.datatype {Qd}, Qn, Qm

VACop{cond}.datatype {Dd}, Dn, Dm

各パラメータには以下の意味があります。

op 以下のいずれかを指定します。

LE 以下(絶対値)

LT 未満(絶対値)

cond 任意の条件コードを指定します。

datatype F32 を指定します。

Qd ま たは Dd 結果を保持する NEON レジスタです。

結果のデータ型は I32 です。

Qn ま たは Dn 第 1 オペランドを保持する NEON レジスタです。

Qm ま たは Dm 第 2 オペランドを保持する NEON レジスタです。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

• 「VACGE および VACGT」 (ページ 4-20)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-77ID 011811 Non-Confidential

Page 285: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.9.6 VCLE および VCLT

ベクタ比較はベクタの各要素の値を取得し、2 番目のベクタの対応する要素の値また

は 0 と比較します。条件が True の場合、デスティネーションベクタの対応する要素

はすべて 1 に設定されます。それ以外の場合は、すべて 0 に設定されます。

注 逆アセンブル時に、これらの疑似命令は、反転したオペランドを使用して対応する VCGE 命令と VCGT 命令に逆アセンブルされます。

構文

VCop{cond}.datatype {Qd}, Qn, Qm

VCop{cond}.datatype {Dd}, Dn, Dm

各パラメータには以下の意味があります。

op 以下のいずれかを指定します。

LE 小さいか等しい

LT 未満

cond 任意の条件コードを指定します。

datatype S8、S16、S32、U8、U16、U32、または F32 のいずれかを指定します。

Qd ま たは Dd 結果を保持する NEON レジスタです。

結果のデータ型は次のようになります。

• オペランドのデータ型が I32、S32、U32、または F32 の場合は I32• オペランドのデータ型が I16、S16、または U16 の場合は I16• オペランドのデータ型が I8、S8、または U8 の場合は I8

Qn ま たは Dn 第 1 オペランドを保持する NEON レジスタです。

Qm ま たは Dm 第 2 オペランドを保持する NEON レジスタです。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

• 「VCLE および VCLT」

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-78ID 011811 Non-Confidential

Page 286: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.10 VFP 命令

このセクションは以下のサブセクションから構成されています。

• 「VABS、VNEG、VSQRT」 (ページ 4-80)

浮動小数点絶対値、否定、および平方根

• 「VADD、VSUB、VDIV」 (ページ 4-81)

浮動小数点加算、減算、および除算

• 「VMUL、VMLA、VMLS、VNMUL、VNMLA、VNMLS」 (ページ 4-82)

必要に応じて否定を伴う浮動小数点乗算および積和

• 「VFMA、VFMS、VFNMA、VFNMS」 (ページ 4-83)

必要に応じて否定を伴う結合浮動小数点積和および結合浮動小数点積差

• 「VCMP」 (ページ 4-84)

浮動小数点比較

• 「VCVT (単精度と倍精度の間)」 (ページ 4-85)

単精度と倍精度間の変換

• 「VCVT (浮動小数点と整数間の変換)」 (ページ 4-86)

浮動小数点と整数間の変換

• 「VCVT (浮動小数点と固定小数点間)」 (ページ 4-87)

浮動小数点と固定小数点間の変換

• 「VCVTB、VCVTT (半精度拡張)」 (ページ 4-88)

半精度浮動小数点数と単精度浮動小数点数間の変換

• 「VMOV」 (ページ 4-89)

単精度または倍精度レジスタへの浮動小数点イミディエート値の挿入

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-79ID 011811 Non-Confidential

Page 287: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.10.1 VABS、VNEG、VSQRT

浮動小数点絶対値、否定、および平方根

これらの命令では、スカラ、ベクタ、または混合演算を実行できます。

構文

Vop{cond}.F32 Sd, Sm

Vop{cond}.F64 Dd, Dm

各パラメータには以下の意味があります。

op ABS、NEG、または SQRT のいずれかを指定します。

cond 任意の条件コードを指定します。

Sd, Sm 結果とオペランドを保持する単精度レジスタです。

Dd, Dm 結果とオペランドを保持する倍精度レジスタです。

使用法

VABS 命令は、Sm または Dm の内容を取得し、符号ビットをクリアして、その結果を Sd または Dd に返します。これにより、絶対値が得られます。

VNEG 命令は、Sm または Dm の内容を取得し、符号ビットを変更して、その結果を Sd または Dd に返します。これにより、値の否定が得られます。

VSQRT 命令は、Sm または Dm の内容の値の平方根を計算し、その結果を Sd または Dd に返します。

VABS 命令と VNEG 命令では、オペランドが NaN の場合、符号ビットは上記の各ケース

で決定されますが、例外は生成されません。

浮動小数点の例外

VABS 命令と VNEG 命令によって、例外が生成されることはありません。

VSQRT 命令は、無効演算例外または不正確例外を生成する場合があります。

関連項目

概念

『アセンブラの使用』:

• 「スカラ演算、ベクタ演算、および混合演算の制御」 (ページ 9-39)

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-80ID 011811 Non-Confidential

Page 288: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.10.2 VADD、VSUB、VDIV

浮動小数点加算、減算、および除算

これらの命令では、スカラ、ベクタ、または混合演算を実行できます。

構文

Vop{cond}.F32 {Sd}, Sn, Sm

Vop{cond}.F64 {Dd}, Dn, Dm

各パラメータには以下の意味があります。

op ADD、SUB、または DIV のいずれかを指定します。

cond 任意の条件コードを指定します。

Sd, Sn, Sm 結果とオペランドを保持する単精度レジスタです。

Dd, Dn, Dm 結果とオペランドを保持する倍精度レジスタです。

使用法

VADD 命令は、オペランドレジスタの値を加算して、その結果をデスティネーション

レジスタに返します。

VSUB 命令は、第 2 オペランドレジスタの値を第 1 オペランドレジスタの値から減算

し、その結果をデスティネーションレジスタに返します。

VDIV 命令は、第 1 オペランドレジスタの値を第 2 オペランドレジスタの値で除算し、

その結果をデスティネーションレジスタに返します。

浮動小数点の例外

VADD 命令と VSUB 命令は、無効演算例外、オーバーフロー例外、または不正確例外を

生成する場合があります。

VDIV 演算は、ゼロ除算例外、無効演算例外、オーバーフロー例外、アンダーフロー

例外、または不正確例外を生成する場合があります。

関連項目

概念

『アセンブラの使用』:

• 「スカラ演算、ベクタ演算、および混合演算の制御」 (ページ 9-39)

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-81ID 011811 Non-Confidential

Page 289: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.10.3 VMUL、VMLA、VMLS、VNMUL、VNMLA、VNMLS

必要に応じて否定を伴う浮動小数点乗算および積和

これらの命令では、スカラ、ベクタ、または混合演算を実行できます。

構文

V{N}MUL{cond}.F32 {Sd,} Sn, Sm

V{N}MUL{cond}.F64 {Dd,} Dn, Dm

V{N}MLA{cond}.F32 Sd, Sn, Sm

V{N}MLA{cond}.F64 Dd, Dn, Dm

V{N}MLS{cond}.F32 Sd, Sn, Sm

V{N}MLS{cond}.F64 Dd, Dn, Dm

各パラメータには以下の意味があります。

N 終結果を否定します。

cond 任意の条件コードを指定します。

Sd, Sn, Sm 結果とオペランドを保持する単精度レジスタです。

Dd, Dn, Dm 結果とオペランドを保持する倍精度レジスタです。

使用法

VMUL 演算は、オペランドレジスタの値を乗算し、その結果をデスティネーションレ

ジスタに返します。

VMLA 演算は、オペランドレジスタの値を乗算し、デスティネーションレジスタの値

を加算して、その 終結果をデスティネーションレジスタに返します。

VMLS 演算は、オペランドレジスタの値を乗算し、その結果値をデスティネーション

レジスタの値から減算し、 終結果をデスティネーションレジスタに返します。

いずれの場合も、N オプションを使用すると 終結果は否定されます。

浮動小数点の例外

命令は、無効演算例外、オーバーフロー例外、アンダーフロー例外、不正確例外、入力非正規例外を生成する場合があります。

関連項目

概念

『アセンブラの使用』:

• 「スカラ演算、ベクタ演算、および混合演算の制御」 (ページ 9-39)

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-82ID 011811 Non-Confidential

Page 290: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.10.4 VFMA、VFMS、VFNMA、VFNMS

必要に応じて否定を伴う結合浮動小数点積和および結合浮動小数点積差

これらの命令では常にスカラ演算が実行されます。

構文

VF{N}op{cond}.F64 {Dd}, Dn, Dm

VF{N}op{cond}.F32 {Sd}, Sn, Sm

各パラメータには以下の意味があります。

op MA ま たは MS を指定します。

N 終結果を否定します。

cond 任意の条件コードを指定します。

Sd, Sn, Sm 結果とオペランドを保持する単精度レジスタです。

Dd, Dn, Dm 結果とオペランドを保持する倍精度レジスタです。

Qd, Qn, Qm 結果とオペランドを保持する倍精度レジスタです。

使用法

VFMA 演算は、オペランドレジスタの値を乗算し、デスティネーションレジスタの値

を加算して、その 終結果をデスティネーションレジスタに返します。累算の前に乗算の結果の丸めは行われません。

VFMS 演算は、オペランドレジスタの値を乗算し、その結果をデスティネーションレ

ジスタの値から減算し、 終結果をデスティネーションレジスタに返します。減算の前に乗算の結果の丸めは行われません。

いずれの場合も、N オプションを使用すると 終結果は否定されます。

浮動小数点の例外

命令は、入力非正規例外、無効演算例外、オーバーフロー例外、アンダーフロー例外、または不正確例外を生成する場合があります。

関連項目

概念

『アセンブラの使用』:

• 「スカラ演算、ベクタ演算、および混合演算の制御」 (ページ 9-39)

リファレンス:

• 「条件コード」 (ページ 3-173)

• 「VMUL、VMLA、VMLS、VNMUL、VNMLA、VNMLS」 (ページ 4-82)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-83ID 011811 Non-Confidential

Page 291: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.10.5 VCMP

浮動小数点比較

VCMP では常にスカラ演算が実行されます。

構文

VCMP{cond}.F32 Sd, Sm

VCMP{cond}.F32 Sd, #0

VCMP{cond}.F64 Dd, Dm

VCMP{cond}.F64 Dd, #0

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Sd, Sm オペランドを保持する単精度レジスタです。

Dd, Dm オペランドを保持する倍精度レジスタを指定します。

使用法

VCMP 命令は、第 2 オペランドレジスタの値(第 2 オペランドが #0 の場合は 0)を第 1 オペランドレジスタの値から減算し、その結果に VFP 条件フラグを設定します。

浮動小数点の例外

VCMP 命令は、無効演算例外を生成することがあります。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-84ID 011811 Non-Confidential

Page 292: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.10.6 VCVT (単精度と倍精度の間)

単精度数と倍精度数間の変換を実行します。

VCVT では常にスカラ演算が実行されます。

構文

VCVT{cond}.F64.F32 Dd, Sm

VCVT{cond}.F32.F64 Sd, Dm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Dd 結果を保持する倍精度レジスタです。

Sm オペランドを保持する単精度レジスタです。

Sd 結果を保持する単精度レジスタです。

Dm オペランドを保持する倍精度レジスタです。

使用法

これらの命令は Sm の単精度値を倍精度に変換し、その結果を Dd に返すか、Dm の倍精

度値を単精度に変換し、その結果を Sd に返します。

浮動小数点の例外

命令は、無効演算例外、入力非正規例外、オーバーフロー例外、アンダーフロー例外、または不正確例外を生成する場合があります。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-85ID 011811 Non-Confidential

Page 293: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.10.7 VCVT (浮動小数点と整数間の変換)

浮動小数点数と整数間の変換を実行します。

VCVT では常にスカラ演算が実行されます。

構文

VCVT{R}{cond}.type.F64 Sd, Dm

VCVT{R}{cond}.type.F32 Sd, Sm

VCVT{cond}.F64.type Dd, Sm

VCVT{cond}.F32.type Sd, Sm

各パラメータには以下の意味があります。

R FPSCR で指定されている丸めモードを演算で使用することを指定しま

す。それ以外の場合は、0 に丸めます。

cond 任意の条件コードを指定します。

type U32(符号なし 32 ビット整数)または S32(符号付き 32 ビット整数)を

指定できます。

Sd 結果を保持する単精度レジスタです。

Dd 結果を保持する倍精度レジスタです。

Sm オペランドを保持する単精度レジスタです。

Dm オペランドを保持する倍精度レジスタです。

使用法

この命令の 初の 2 つの形式は浮動小数点から整数への変換を実行します。

3 番目と 4 番目の形式は整数から浮動小数点への変換を実行します。

浮動小数点の例外

これらの命令は、入力非正規例外、無効演算例外、または不正確例外を生成する場合があります。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-86ID 011811 Non-Confidential

Page 294: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.10.8 VCVT (浮動小数点と固定小数点間)

浮動小数点数と固定小数点数間の変換を実行します。

VCVT では常にスカラ演算が実行されます。

構文

VCVT{cond}.type.F64 Dd, Dd, #fbits

VCVT{cond}.type.F32 Sd, Sd, #fbits

VCVT{cond}.F64.type Dd, Dd, #fbits

VCVT{cond}.F32.type Sd, Sd, #fbits

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

type 次のいずれかを指定できます。

S16 16 ビットの符号付き固定小数点値

U16 16 ビットの符号なし固定小数点値

S32 32 ビットの符号付き固定小数点値

U32 32 ビットの符号なし固定小数点値

Sd オペランドと結果を保持する単精度レジスタです。

Dd オペランドと結果を保持する倍精度レジスタです。

fbits 固定小数点数の小数部ビットを指定します。type が S16 または U16 の場合

は 0 ~ 16 の範囲、type が S32 または U32 の場合は 1 ~ 32 の範囲です。

使用法

この命令の 初の 2 つの形式は浮動小数点から固定小数点への変換を実行します。

3 番目と 4 番目の形式は固定小数点から浮動小数点への変換を実行します。

いずれの場合も、固定小数点値は、レジスタの 下位の 16 または 32 ビットに含まれ

ます。

浮動小数点の例外

これらの命令は、入力非正規例外、無効演算例外、または不正確例外を生成する場合があります。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-87ID 011811 Non-Confidential

Page 295: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.10.9 VCVTB、VCVTT (半精度拡張)

半精度浮動小数点数と単精度浮動小数点数を以下の方法で相互変換します。

• VCVTB はシングルワードレジスタの下位ビット(ビット [15:0])を使用して、半

精度値の取得またはストアを行います。

• VCVTT はシングルワードレジスタの上位ビット(ビット [31:16])を使用して、

半精度値の取得またはストアを行います。

VCVTB と VCVTT では、常にスカラ演算が実行されます。

構文

VCVTB{cond}.type Sd, Sm

VCVTT{cond}.type Sd, Sm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

type 次のいずれかを指定できます。

F32.F16 半精度から単精度への変換

F16.F32 単精度から半精度への変換

Sd 結果を保持するシングルワードレジスタです。

Sm オペランドを保持するシングルワードレジスタです。

アーキテクチャ

これらの命令を使用できるのは、半精度拡張をサポートしている VFPv3 システムだ

けです。

浮動小数点の例外

命令は、入力非正規例外、無効演算例外、オーバーフロー例外、アンダーフロー例外、または不正確例外を生成する場合があります。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-88ID 011811 Non-Confidential

Page 296: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

NEON と VFP プログラミング

4.10.10 VMOV

単精度または倍精度レジスタに浮動小数点イミディエート値を挿入するか、1 つのレ

ジスタを別のレジスタにコピーします。

この命令では常にスカラ演算が実行されます。

構文

VMOV{cond}.F32 Sd, #imm

VMOV{cond}.F64 Dd, #imm

VMOV{cond}.F32 Sd, Sm

VMOV{cond}.F64 Dd, Dm

各パラメータには以下の意味があります。

cond 任意の条件コードを指定します。

Sd 単精度デスティネーションレジスタを指定します。

Dd 倍精度デスティネーションレジスタを指定します。

imm 浮動小数点イミディエート値を指定します。

Sm 単精度ソースレジスタを指定します。

Dm 倍精度ソースレジスタを指定します。

イミディエート値

+/–n * 2–r と表すことができる任意の数値。ここで、n と r は整数、16 <= n <= 31、0 <= r <= 7 です。

アーキテクチャ

イミディエート定数をコピーする命令は VFPv3 で使用できます。

レジスタからのコピーを行う命令は、すべての VFP システムで使用できます。

関連項目

リファレンス:

• 「条件コード」 (ページ 3-173)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 4-89ID 011811 Non-Confidential

Page 297: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

第 5 章 ワイヤレス MMX テクノロジの命令

以下の各トピックでは、ワイヤレス MMX テクノロジの命令のサポートについて説明し

ます。

• 「はじめに」 (ページ 5-2)• 「ワイヤレス MMX テクノロジに対する ARM のサポート」 (ページ 5-3)• 「ワイヤレス MMX の命令」 (ページ 5-6)• 「ワイヤレス MMX の疑似命令」 (ページ 5-8)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 5-1ID 011811 Non-Confidential

Page 298: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ワイヤレス MMX テクノロジの命令

5.1 はじめに

Marvell ワイヤレス MMX テクノロジは SIMD(単一命令複数データ処理)命令の

セットで、マルチメディアアプリケーションのパフォーマンスを向上させる一部の XScale プロセッサで使用できます。ワイヤレス MMX テクノロジでは 64 ビットレジ

スタを使用して、パック形式の複数のデータ要素で演算できるようにします。

アセンブラでは、Marvell ワイヤレス MMX テクノロジ命令をアセンブルし、PXA270 プロセッサ用のコードを開発することができます。このプロセッサは、MMX 拡張を

採用した ARMv5TE アーキテクチャを実装しています。ワイヤレス MMX テクノロジ

では ARM コプロセッサ 0 および 1 を使用して、その命令セットとデータ型をサポー

トしています。ARM コンパイラツールチェーンは、ワイヤレス MMX テクノロジ制

御と単一命令複数データ処理(SIMD)データレジスタをサポートしており、ワイヤ

レス MMX テクノロジによる開発のための新しいディレクティブが導入されていま

す。また、ロード命令とストア命令のサポートも強化されました。

アセンブラを使用するときは、以下の点に注意して下さい。

• ワイヤレス MMX テクノロジの命令は、サポートされているプロセッサ

(armasm --cpu PXA270)を指定した場合にのみアセンブルされます。

• PXA270 プロセッサでは、ARM または Thumb で記述されたコードのみをサポー

トします。

• ARM フラグの状態によっては、ほとんどのワイヤレス MMX テクノロジの命令

は条件実行できます。ワイヤレス MMX テクノロジの条件コードは、ARM の条

件コードと同じです。

ワイヤレス MMX 2 テクノロジは、ワイヤレス MMX テクノロジのアップグレード

バージョンです。

ここでは、ARM コンパイラツールチェーンのアセンブラによるワイヤレス MMX テクノロジのサポートについて説明します。ワイヤレス MMX テクノロジ自体につい

ては詳しく説明していません。プログラマモデル、およびワイヤレス MMX テクノ

ロジの命令セットの詳細な説明については、『ワイヤレス MMX テクノロジデベロッ

パガイド』を参照して下さい。

関連項目

リファレンス

• 『ワイヤレス MMX テクノロジデベロッパガイド』

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 5-2ID 011811 Non-Confidential

Page 299: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ワイヤレス MMX テクノロジの命令

5.2 ワイヤレス MMX テクノロジに対する ARM のサポート

このセクションでは、ワイヤレス MMX テクノロジ、および MMX 2 テクノロジに対

するアセンブラのサポートについて説明します。このセクションは、以下のサブセクションから構成されています。

• 「ディレクティブ、WRN と WCN」• 「Frame ディレクティブ」

• 「ワイヤレス MMX ロード / ストア命令」 (ページ 5-4)• 「ワイヤレス MMX テクノロジの命令と XScale の命令」 (ページ 5-5)

5.2.1 ディレクティブ、WRN と WCN

次のディレクティブを使用して、ワイヤレス MMX テクノロジをサポートできます。

WCN 指定された制御レジスタ名を定義します。例は以下の通りです。

speed WCN wcgr0 ; 制御レジス タ 0 のシンボル と し て速度を定義する

WRN 指定された SIMD データレジスタ名を定義します。例は以下の通りで

す。

rate WRN wr6 ; デー タ レジス タ 6 のシンボル と し て レー ト を定義する

同一レジスタに複数の名前を付けて矛盾を生じさせるような使用方法は避けて下さい。定義済みのレジスタおよびコプロセッサの名前は使用しないで下さい。

5.2.2 Frame ディレクティブ

ワイヤレス MMX テクノロジのレジスタを通常の方法で FRAME ディレクティブととも

に使用して、オブジェクトファイルにデバッグ情報を追加できます。次の制限に注意して下さい。

• ワイヤレス MMX テクノロジのレジスタである wR0 ~ wR9 または wCGR0 ~ wCGR3 をスタックにプッシュしようとすると、警告が表示されます

• ワイヤレス MMX テクノロジのレジスタは、アドレスオフセットとして使用で

きません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 5-3ID 011811 Non-Confidential

Page 300: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ワイヤレス MMX テクノロジの命令

5.2.3 ワイヤレス MMX ロード / ストア命令

ワイヤレス MMX コプロセッサレジスタに対してバイト、ハーフワード、ワード、

またはダブルワードのロード / ストアを実行します。

構文

op<type>{cond} wRd, [Rn, #{-}offset]{!}

op<type>{cond} wRd, [Rn] {, #{-}offset}

opW{cond} wRd, label

opW wCd, [Rn, #{-}offset]{!}

opW wCd, [Rn] {, #{-}offset}

opD{cond} wRd, label

opD wRd, [Rn, {-}Rm {, LSL #imm4}]{!} ; MMX2 のみ

opD wRd, [Rn], {-}Rm {, LSL #imm4} ; MMX2 のみ

各パラメータには以下の意味があります。

op 次のいずれかを指定できます。

WLDR ワイヤレス MMX レジスタをロードします。

WSTR ワイヤレス MMX レジスタをストアします。

<type> 次のいずれかを指定できます。

B バイト

H ハーフワード

W ワード

D ダブルワード

cond 任意の条件コードを指定します。

wRd ロードまたはストアを実行するワイヤレス MMX SIMD データレジスタ

を指定します。

wCd ロードまたはストアを実行するワイヤレス MMX ステータスレジスタお

よび制御レジスタを指定します。

Rn メモリアドレスのベースとなるレジスタを指定します。

offset イミディエートオフセットを指定します。オフセットを指定しなかった

場合、その命令はゼロオフセット命令になります。

! 任意に指定できる接尾文字です。! が存在する場合、命令はプレインデ

クス命令になります。

label PC 相対式を指定します。

label は現在の命令から +/- 1020 バイト以内に配置する必要があります。

Rm オフセットとして使用される値を保持するレジスタを指定します。Rm に PC は指定できません。

imm4 Rm を左にシフトするビット数を 0 ~ 15 の範囲で保持します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 5-4ID 011811 Non-Confidential

Page 301: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ワイヤレス MMX テクノロジの命令

SIMD レジスタへの定数のロード

アセンブラでは、WLDRW および WLDRD リテラルロード疑似命令もサポートします。以下

に例を示します。

WLDRW wr0, =0x114

以下の点に注意して下さい。

• アセンブラでは、バイトおよびハーフワードリテラルをロードできません。これらをロードすると降格可能エラーが生成されます。ダウングレードされると、命令は WLDRW に変換され、32 ビットリテラルが生成されます。これはバイ

トリテラルのロードと同様ですが、32 ビットワードを使用する点が異なりま

す。

• ロードするリテラルがゼロで、デスティネーションが SIMD データレジスタで

ある場合、命令は WZERO に変換されます。

• 8 バイト整列ではないダブルワードロードは予測不能です。

5.2.4 ワイヤレス MMX テクノロジの命令と XScale の命令

ワイヤレス MMX テクノロジの命令は XScale の命令と重複します。競合を避けるた

めに、アセンブラには次の制約があります。

• XScale の命令とワイヤレス MMX テクノロジの命令を同じアセンブリに混在さ

せることはできません。

• ワイヤレス MMX テクノロジの TMIA 命令には、XScale の MIA 命令と重複する MIA ニーモニックがあります。次の点に注意して下さい。

— MIA acc0, Rm, Rs は XScale では使用できますが、ワイヤレス MMX テクノロ

ジではエラーになります。

— MIA wR0, Rm, Rs および TMIA wR0, Rm, Rs は、ワイヤレス MMX テクノロジで

使用できます。

— TMIA acc0, Rm, Rs は XScale ではエラーになります(XScale には TMIA 命令は

ありません)。

関連項目

概念

『アセンブラの使用』:

• 「事前宣言されている XScale レジスタ名」 (ページ 3-17)

• 「レジスタ相対式と PC 相対式」 (ページ 8-7)

参照

• 「条件コード」 (ページ 3-173)

• 「MIA、MIAPH、MIAxy」 (ページ 3-101)

• 「MAR、MRA」 (ページ 3-158)

• 「Frame ディレクティブ」 (ページ 6-42)

• 「FRAME PUSH」 (ページ 6-46)

• 「FRAME ADDRESS」 (ページ 6-44)

• 「FRAME RETURN ADDRESS」 (ページ 6-50)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 5-5ID 011811 Non-Confidential

Page 302: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ワイヤレス MMX テクノロジの命令

5.3 ワイヤレス MMX の命令

表 5-1 に、ワイヤレス MMX テクノロジの命令セットの一覧を示します。各命令の詳

細については、『ワイヤレス MMX テクノロジデベロッパガイド』を参照して下さい。

ワイヤレス MMX テクノロジのレジスタは wRn、wRd、ARM のレジスタは Rn、Rd と示

されています。

表 5-1 ワイヤレス MMX テクノロジの命令

ニーモニック 例

TANDC TANDCB r15

TBCST TBCSTB wr15, r1

TEXTRC TEXTRCB r15, #0

TEXTRM TEXTRMUBCS r3, wr7, #7

TINSR TINSRB wr6, r11, #0

TMIA, TMIAPH, TMIAxy

TMIANE wr1, r2, r3TMIAPH wr4, r5, r6TMIABB wr4, r5, r6MIAPHNE wr4, r5, r6

TMOVMSK TMOVMSKBNE r14, wr15

TORC TORCB r15

WACC WACCBGE wr1, wr2

WADD WADDBGE wr1, wr2, wr13

WALIGNI, WALIGNR WALIGNI wr7, wr6, wr5,#3WALIGNR0 wr4, wr8, wr12

WAND, WANDN WAND wr1, wr2, wr3WANDN wr5, wr5, wr9

WAVG2 WAVG2B wr3, wr6, wr9WAVG2BR wr4, wr7, wr10

WCMPEQ WCMPEQB wr0, wr4, wr2

WCMPGT WCMPGTUB wr0, wr4, wr2

WLDR WLDRB wr1, [r2, #0]

WMAC WMACU wr3, wr4, wr5

WMADD WMADDU wr3, wr4, wr5

WMAX, WMIN WMAXUB wr0, wr4, wr2WMINSB wr0, wr4, wr2

WMUL WMULUL wr4, wr2, wr3

WOR WOR wr3, wr1, wr4

WPACK WPACKHUS wr2, wr7, wr1

WROR WRORH wr3, wr1, wr4

WSAD WSADB wr3, wr5, wr8

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 5-6ID 011811 Non-Confidential

Page 303: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ワイヤレス MMX テクノロジの命令

関連項目

リファレンス

• 「ワイヤレス MMX の疑似命令」 (ページ 5-8)

• 『ワイヤレス MMX テクノロジデベロッパガイド』

WSHUFH WSHUFH wr8, wr15, #17

WSLL, WSRL WSLLH wr3, wr1, wr4WSRLHG wr3, wr1, wcgr0

WSRA WSRAH wr3, wr1, wr4WSRAHG wr3, wr1, wcgr0

WSTR WSTRB wr1, [r2, #0]WSTRW wc1, [r2, #0]

WSUB WSUBBGE wr1, wr2, wr13

WUNPCKEH, WUNPCKEL WUNPCKEHUB wr0, wr4WUNPCKELSB wr0, wr4

WUNPCKIH, WUNPCKIL WUNPCKIHB wr0, wr4, wr2WUNPCKILH wr1, wr5, wr3

WXOR WXOR wr3, wr1, wr4

表 5-1 ワイヤレス MMX テクノロジの命令 (続き)

ニーモニック 例

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 5-7ID 011811 Non-Confidential

Page 304: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ワイヤレス MMX テクノロジの命令

5.4 ワイヤレス MMX の疑似命令

表 5-2 では、ワイヤレス MMX テクノロジの疑似命令の概要を説明します。各命令の

詳細については、『ワイヤレス MMX テクノロジデベロッパガイド』を参照して下さ

い。

関連項目

参照

• 『ワイヤレス MMX テクノロジデベロッパガイド』

• 第 3 章 ARM 命令と Thumb 命令

表 5-2 ワイヤレス MMX テクノロジの疑似命令

ニーモニック

概要 例

TMCR ソースレジスタ Rn の内容を制御レジスタ wCn に移動します。ARM MCR コプロセッサ命令にマップします((ページ 3-134))。

TMCR wc1, r10

TMCRR 2 つのソースレジスタ RnLo および RnHi の内容をデスティネーショ

ンレジスタ wRd に移動します。RnLo または RnHi に R15 を使用しない

で下さい。ARM MCRR コプロセッサ命令にマップします((ページ 3-134))。

TMCRR wr4, r5, r6

TMRC 制御レジスタ wCn の内容をデスティネーションレジスタ Rd に移動し

ます。Rd に R15 を使用しないで下さい。ARM MRC コプロセッサ命令

にマップします((ページ 3-135))。

TMRC r1, wc2

TMRRC ソースレジスタ wRn の内容を 2 つのデスティネーションレジスタ RdLo および RdHi に移動します。デスティネーションレジスタに R15 を使用しないで下さい。RdLo および RdHi は別のレジスタである必要

があります。それ以外の場合は結果が予測できないものになります。ARM MRRC コプロセッサ命令にマップします((ページ 3-135))。

TMRRC r1, r0, wr2

WMOV ソースレジスタ wRn の内容をデスティネーションレジスタ wRd に移

動します。この命令は WOR の形式です(表 5-1 (ページ 5-6) を参

照)。

WMOV wr1, wr8

WZERO デスティネーションレジスタ wRd をゼロにします。この命令は WANDN の形式です(表 5-1 (ページ 5-6) を参照)。

WZERO wr1

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 5-8ID 011811 Non-Confidential

Page 305: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

第 6 章 ディレクティブリファレンス

以下の各トピックでは、ARM アセンブラ armasm で使用できるディレクティブについて

説明します。

• 「ディレクティブの一覧(アルファベット順)」 (ページ 6-2)• 「シンボル定義ディレクティブ」 (ページ 6-4)• 「データ定義ディレクティブ」 (ページ 6-18)• 「アセンブリ制御ディレクティブ」 (ページ 6-33)• 「Frame ディレクティブ」 (ページ 6-42)• 「通知ディレクティブ」 (ページ 6-57)• 「命令セットと構文選択のディレクティブ」 (ページ 6-63)• 「その他のディレクティブ」 (ページ 6-66)

注 ここで説明するディレクティブは、ARM C コンパイラおよび C++ コンパイラのインラ

インアセンブラでは使用できません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-1ID 011811 Non-Confidential

Page 306: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.1 ディレクティブの一覧(アルファベット順)

表 6-1 は、ディレクティブの一覧を示しています。ここから個々のディレクティブの

説明を見つけて下さい。

表 6-1 各ディレクティブの参照先

ディレクティブ

を参照 ディレクティブ を参照 ディレクティブ を参照

ALIAS (ページ 6-67)

EQU (ページ 6-78) LTORG (ページ 6-19)

ALIGN (ページ 6-68)

EXPORT、GLOBAL (ページ 6-79) MACRO、MEND (ページ 6-34)

ARM、CODE32 (ページ 6-64)

EXPORTAS (ページ 6-81) MAP (ページ 6-20)

AREA (ページ 6-71)

EXTERN (ページ 6-83) MEND (「MACRO」を参

照)

(ページ 6-34)

ASSERT (ページ 6-57)

FIELD (ページ 6-21) MEXIT (ページ 6-37)

ATTR (ページ 6-75)

FRAME ADDRESS (ページ 6-44) NOFP (ページ 6-87)

CN (ページ 6-14)

FRAME POP (ページ 6-45) OPT (ページ 6-60)

CODE16 (ページ 6-64)

FRAME PUSH (ページ 6-46) PRESERVE8 (「REQUIRE8」を参照)

(ページ 6-88)

COMMON (ページ 6-32)

FRAME REGISTER (ページ 6-48) PROC (「FUNCTION」を

参照)

(ページ 6-54)

CP (ページ 6-15)

FRAME RESTORE (ページ 6-49) QN (ページ 6-16)

DATA (ページ 6-32)

FRAME SAVE (ページ 6-51) RELOC (ページ 6-10)

DCB (ページ 6-23)

FRAME STATE REMEMBER (ページ 6-52) REQUIRE (ページ 6-87)

DCD、DCDU (ページ 6-24)

FRAME STATE RESTORE (ページ 6-53) REQUIRE8、PRESERVE8 (ページ 6-88)

DCDO (ページ 6-25)

FRAME UNWIND ON、FRAME UNWIND OFF

(ページ 6-54) RLIST (ページ 6-13)

DCFD、DCFDU (ページ 6-26)

FUNCTION、PROC (ページ 6-54) RN (ページ 6-12)

DCFS、DCFSU (ページ 6-27)

GBLA、GBLL、GBLS (ページ 6-5) ROUT (ページ 6-89)

DCI (ページ 6-28)

GET、INCLUDE (ページ 6-82) SETA、SETL、SETS (ページ 6-9)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-2ID 011811 Non-Confidential

Page 307: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

DCQ、DCQU (ページ 6-30)

GLOBAL (「EXPORT」を

参照)

(ページ 6-79) SN (ページ 6-16)

DCW、DCWU (ページ 6-31)

IF、ELSE、ENDIF、ELIF (ページ 6-38) SPACE または FILL (ページ 6-22)

DN (ページ 6-16)

IMPORT (ページ 6-83) SUBT (ページ 6-62)

ELIF、ELSE (「IF」を参照)

(ページ 6-38)

INCBIN (ページ 6-85) THUMB (ページ 6-64)

END (ページ 6-77)

INCLUDE (「GET」を参

照)

(ページ 6-82) THUMBX (ページ 6-64)

ENDFUNC、ENDP (ページ 6-56)

INFO (ページ 6-58) TTL (ページ 6-62)

ENDIF (「IF」

を参照)

(ページ 6-38)

KEEP (ページ 6-86) WHILE、WEND (ページ 6-41)

ENTRY (ページ 6-77)

LCLA、LCLL、LCLS (ページ 6-8)

表 6-1 各ディレクティブの参照先 (続き)

ディレクティブ

を参照 ディレクティブ を参照 ディレクティブ を参照

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-3ID 011811 Non-Confidential

Page 308: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.2 シンボル定義ディレクティブ

このセクションでは、以下のディレクティブについて説明します。

• 「GBLA、GBLL、GBLS」 (ページ 6-5)

グローバル算術変数、論理変数、または文字列変数を宣言します。

• 「LCLA、LCLL、LCLS」 (ページ 6-8)

ローカル算術変数、論理変数、または文字列変数を宣言します。

• 「SETA、SETL、SETS」 (ページ 6-9)

算術変数、論理変数、または文字列変数の値を設定します。

• 「RELOC」 (ページ 6-10)

オブジェクトファイルで ELF の再配置をエンコードします。

• 「RN」 (ページ 6-12)

指定されたレジスタの名前を定義します。

• 「RLIST」 (ページ 6-13)

汎用レジスタセットの名前を定義します。

• 「CN」 (ページ 6-14)

コプロセッサレジスタ名を定義します。

• 「CP」 (ページ 6-15)

コプロセッサ名を定義します。

• 「QN、DN、SN」 (ページ 6-16)

倍精度または単精度の VFP レジスタ名を定義します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-4ID 011811 Non-Confidential

Page 309: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.2.1 GBLA、GBLL、GBLS

GBLA ディレクティブは、グローバル算術変数を宣言し、その値をゼロに初期化しま

す。

GBLL ディレクティブは、グローバル論理変数を宣言し、その値を {FALSE} に初期化し

ます。

GBLS ディレクティブは、グローバル文字列変数を宣言し、その値を NULL 文字列 "" に初期化します。

構文

<gblx> variable

各パラメータには以下の意味があります。

<gblx> GBLA、GBLL、または GBLS のいずれかを指定します。

variable 変数の名前を指定します。variable は、ソースファイル内のシンボルの

中で一意である必要があります。

使用法

定義済みの変数に対して上記のディレクティブのいずれかを使用すると、その変数は上記と同じ値に再初期化されます。

変数の有効範囲は、その変数を含むソースファイル内に制限されています。

変数の値は、SETA、SETL、または SETS のいずれかのディレクティブを使用して設定し

ます。

グローバル変数は、--predefine アセンブラコマンドラインオプションを使用して設定

することもできます。

例 6-1 では、変数 objectsize が宣言され、objectsize の値が 0xFF に設定されます。そ

の後、その値が SPACE ディレクティブで使用されます。

例 6-1

GBLA objectsize ; 変数名を宣言する

objectsize SETA 0xFF ; 変数の値を設定する . . ; 他の コ ード . SPACE objectsize ; 変数は引用符で囲む

例 6-2 (ページ 6-6) は、armasm を呼び出す場合の変数の宣言方法と設定方法を示して

います。アセンブリ時に変数の値を設定する場合は、この方法を使用して下さい。--pd は、--predefine と同じ意味です。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-5ID 011811 Non-Confidential

Page 310: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

例 6-2

armasm --predefine "objectsize SETA 0xFF" sourcefile -o objectfile

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-6ID 011811 Non-Confidential

Page 311: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

関連項目

リファレンス: • 「SETA、SETL、SETS」 (ページ 6-9)• 「LCLA、LCLL、LCLS」 (ページ 6-8)• 「アセンブラコマンドラインオプション」 (ページ 2-3)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-7ID 011811 Non-Confidential

Page 312: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.2.2 LCLA、LCLL、LCLS

LCLA ディレクティブは、ローカル算術変数を宣言し、その値をゼロに初期化します。

LCLL ディレクティブは、ローカル論理変数を宣言し、その値を {FALSE} に初期化しま

す。

LCLS ディレクティブは、ローカル文字列変数を宣言し、その値を NULL 文字列 "" に初期化します。

構文

<lclx> variable

各パラメータには以下の意味があります。

<lclx> LCLA、LCLL、または LCLS のいずれかを指定します。

variable 変数の名前を指定します。variable は、マクロ内で一意である必要があ

ります。

使用法

定義済みの変数に対して上記のディレクティブのいずれかを使用すると、その変数は上記と同じ値に再初期化されます。

変数の有効範囲は、その変数を含むマクロの特定のインスタンスに制限されています。

変数の値は、SETA、SETL、または SETS のいずれかのディレクティブを使用して設定し

ます。

MACRO ; マ ク ロ を宣言する

$label message $a ; マ ク ロ プ ロ ト タ イ プ行

LCLS err ; ロ ー カ ル文字列

; 変数のエ ラ ーを宣言する

err SETS "error no:" ; エ ラ ーの値を設定する

$label ; コ ー ド

INFO 0, "err":CC::STR:$a ; 文字列を使用する MEND

関連項目

リファレンス: • 「SETA、SETL、SETS」 (ページ 6-9)• 「MACRO、MEND」 (ページ 6-34)• 「GBLA、GBLL、GBLS」 (ページ 6-5)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-8ID 011811 Non-Confidential

Page 313: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.2.3 SETA、SETL、SETS

SETA ディレクティブは、ローカル算術変数またはグローバル算術変数の値を設定し

ます。

SETL ディレクティブは、ローカル論理変数またはグローバル論理変数の値を設定し

ます。

SETS ディレクティブは、ローカル文字列変数またはグローバル文字列変数の値を設

定します。

構文

variable <setx> expr

各パラメータには以下の意味があります。

<setx> SETA、SETL、または SETS のいずれかを指定します。

variable GBLA、GBLL、GBLS、LCLA、LCLL、または LCLS のいずれかのディレクティブで

宣言される変数の名前を指定します。

expr 以下の式を指定します。

• SETA の場合は数値式

• SETL の場合は論理式

• SETS の場合は文字列式

使用法

いずれかのディレクティブを使用する前に、グローバル宣言ディレクティブまたはローカル宣言ディレクティブを使用して variable を宣言する必要があります。

また、変数名はコマンドラインで事前に定義することもできます。

GBLA VersionNumberVersionNumber SETA 21 GBLL DebugDebug SETL {TRUE} GBLS VersionStringVersionString SETS "Version 1.0"

関連項目

概念:

『アセンブラの使用』:

• 「数値式」 (ページ 8-16)• 「論理式」 (ページ 8-19)• 「文字列式」 (ページ 8-14)

リファレンス: • 「アセンブラコマンドラインオプション」 (ページ 2-3)• 「LCLA、LCLL、LCLS」 (ページ 6-8)• 「GBLA、GBLL、GBLS」 (ページ 6-5)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-9ID 011811 Non-Confidential

Page 314: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.2.4 RELOC

RELOC ディレクティブは、オブジェクトファイルで ELF の再配置を明示的にエンコー

ドします。

構文

RELOC n, symbol

RELOC n

各パラメータには以下の意味があります。

n 0 ~ 255 の範囲内の整数であるか、ARM アーキテクチャのアプリケー

ションバイナリインタフェースで定義されている再配置名の 1 つである

必要があります。

symbol 任意の PC 相対ラベルを指定できます。

使用法

RELOC n, symbol を使用し、symbol というラベルの付いたアドレスを基準にして再配置を

行います。

RELOC ディレクティブを ARM 命令または Thumb 命令の直後に使用すると、その命令

で再配置が行われます。RELOC ディレクティブを DCB、DCW、DCD、またはその他のデー

タ生成ディレクティブの直後に使用すると、データの開始位置で再配置が行われます。適用される加数は、命令またはデータでエンコードする必要があります。

アセンブラによって同じ場所で既に再配置が行われている場合、RELOC ディレクティ

ブの設定内容で再配置が更新されます。以下に例を示します。

DCD sym2 ; sym32 への R_ARM_ABS32RELOC 55 ; それを R_ARM_ABS32_NOI に変更する

RELOC は、データ生成ディレクティブ以外のディレクティブ、LTORG、ALIGN の後に使用

したり、AREA の 初の項目として使用したりした場合など、その他すべての場合に失

敗します。

RELOC n を使用し、匿名のシンボル(シンボルテーブルのシンボル 0)を基準に再配置

を行います。以前にアセンブラによって再配置が行われていない場合に RELOC n を使

用すると、匿名のシンボルを基準に再配置が行われます。

IMPORT impsymLDR r0,[pc,#-8]RELOC 4, impsymDCD 0RELOC 2, symDCD 0,1,2,3,4 ; 後のワー ドが再配置されるRELOC 38,sym2 ; R_ARM_TARGET1DCD impsymRELOC R_ARM_TARGET1 ; 再配置コー ド 38

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-10ID 011811 Non-Confidential

Page 315: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

関連項目

参照

• 『Application Binary Interface for the ARM Architecture』, http://infocenter.arm.com/help/topic/com.arm.doc.subset.swdev.abi/index.html.

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-11ID 011811 Non-Confidential

Page 316: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.2.5 RN

RN ディレクティブは、指定されたレジスタのレジスタ名を定義します。

構文

name RN expr

各パラメータには以下の意味があります。

name レジスタに割り当てる名前を指定します。name には、定義済みの名前と

同じ名前を指定できません。

expr 0 ~ 15 のレジスタ番号を求める式を指定します。

使用法

RN を使用して適切な名前をレジスタに割り当てることにより、各レジスタの使用目

的を明確にすることができます。同一レジスタに複数の名前を付けて矛盾を生じさせるような使用方法は避けて下さい。

regname RN 11 ; レジス タ 11 のレジス タ名を定義する

sqr4 RN r6 ; レジス タ 6 の sqr4 を定義する

関連項目

リファレンス:

『アセンブラの使用』:

• 「事前宣言されている主要なレジスタ名」 (ページ 3-15)• 「事前宣言されている拡張レジスタ名」 (ページ 3-16)• 「事前宣言されている XScale レジスタ名」 (ページ 3-17)• 「事前宣言されているコプロセッサ名」 (ページ 3-19)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-12ID 011811 Non-Confidential

Page 317: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.2.6 RLIST

RLIST(レジスタリスト)ディレクティブは、汎用レジスタセットの名前を指定しま

す。

構文

name RLIST {list-of-registers}

各パラメータには以下の意味があります。

name レジスタセットに割り当てる名前を指定します。name には、定義済みの

名前と同じ名前を指定できません。

list-of-registers

レジスタ名とレジスタ範囲をコンマで区切って並べたリストを指定します。レジスタリストは括弧で囲む必要があります。

使用法

RLIST を使用して、LDM 命令または STM 命令によって転送されるレジスタセットに名前

を付けます。

LDM および STM は、LDM 命令または STM 命令に指定された順序に関係なく、 も小さい

物理レジスタ番号の内容を、メモリ内の 下位アドレスに格納します。シンボルレジスタ名を既に定義している場合は、レジスタリストが昇順で指定されているかどうかが分かりにくいことがあります。

アセンブラオプション --diag_warning 1206 を使用して、レジスタリスト内のレジスタ

が昇順で指定されていることを確認して下さい。レジスタが昇順で指定されていない場合には、警告が生成されます。

Context RLIST {r0-r6,r8,r10-r12,pc}

関連項目

リファレンス:

『アセンブラの使用』:

• 「事前宣言されている主要なレジスタ名」 (ページ 3-15)• 「事前宣言されている拡張レジスタ名」 (ページ 3-16)• 「事前宣言されている XScale レジスタ名」 (ページ 3-17)• 「事前宣言されているコプロセッサ名」 (ページ 3-19)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-13ID 011811 Non-Confidential

Page 318: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.2.7 CN

CN ディレクティブは、コプロセッサレジスタの名前を定義します。

構文

name CN expr

各パラメータには以下の意味があります。

name コプロセッサレジスタに定義する名前を指定します。name には、定義済

みの名前と同じ名前を指定できません。

expr 0 ~ 15 のコプロセッサレジスタ番号を求める式を指定します。

使用法

CN を使用して適切な名前をレジスタに割り当てることにより、各レジスタの使用目

的を明確にすることができます。

注 同一レジスタに複数の名前を付けて矛盾を生じさせるような使用方法は避けて下さ

い。

c0 ~ c15 の名前が事前に定義されています。

power CN 6 ; コ プ ロセ ッ サレジス タ 6 のシンボル と し て "power" を ; 定義する

関連項目

リファレンス:

『アセンブラの使用』:

• 「事前宣言されている主要なレジスタ名」 (ページ 3-15)• 「事前宣言されている拡張レジスタ名」 (ページ 3-16)• 「事前宣言されている XScale レジスタ名」 (ページ 3-17)• 「事前宣言されているコプロセッサ名」 (ページ 3-19)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-14ID 011811 Non-Confidential

Page 319: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.2.8 CP

CP ディレクティブは、指定されたコプロセッサの名前を定義します。コプロセッサ

番号は、0 ~ 15 の範囲で指定する必要があります。

構文

name CP expr

各パラメータには以下の意味があります。

name コプロセッサに割り当てる名前を指定します。name には、定義済みの名

前と同じ名前を指定できません。

expr 0 ~ 15 のコプロセッサ番号を求める式を指定します。

使用法

CP を使用して適切な名前をコプロセッサに割り当てることにより、各コプロセッサ

の使用目的を明確にすることができます。

注 同一コプロセッサに複数の名前を付けて矛盾を生じさせるような使用方法は避けて

下さい。

コプロセッサ 0 ~ 15 には、p0 ~ p15 の名前が事前に定義されています。

dmu CP 6 ; コ プ ロセ ッ サ 6 のシンボル と し て "dmu" を ; 定義する

関連項目

リファレンス:

『アセンブラの使用』:

• 「事前宣言されている主要なレジスタ名」 (ページ 3-15)• 「事前宣言されている拡張レジスタ名」 (ページ 3-16)• 「事前宣言されている XScale レジスタ名」 (ページ 3-17)• 「事前宣言されているコプロセッサ名」 (ページ 3-19)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-15ID 011811 Non-Confidential

Page 320: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.2.9 QN、DN、SN

QN ディレクティブは、指定された 128 ビット拡張レジスタの名前を定義します。

DN ディレクティブは、指定された 64 ビット拡張レジスタの名前を定義します。

SN ディレクティブは、指定された単精度 VFP レジスタの名前を定義します。

構文

name directive expr{.type}{[x]}

各パラメータには以下の意味があります。

directive QN、DN、または SN を指定します。

name 拡張レジスタに割り当てる名前を指定します。name には、定義済みの名

前と同じ名前を指定できません。

expr 以下を指定します。

• 以下の範囲の数値を求める式

— VFPv2 で DN を使用している場合、または NEON で QN を使

用している場合は 0 ~ 15— それ以外の場合は 0 ~ 31

• 定義済みレジスタ名、または以前のディレクティブで定義済みのレジスタ名

type NEON または VFP データ型を指定します。

[x] NEON コードでのみ使用されます。[x] は、レジスタへのスカラインデ

クスを指定します。

type および [x] は拡張表記です。

使用法

QN、DN、または SN を使用して適切な名前を拡張レジスタに割り当てることにより、各

レジスタの使用目的を明確にすることができます。

注 同一レジスタに複数の名前を付けて矛盾を生じさせるような使用方法は避けて下さ

い。

DN ディレクティブまたは SN ディレクティブではベクタ長を指定できません。

energy DN 6 ; VFP 倍精度レジス タ 6 のシンボル と し て "energy" を ; 定義する

mass SN 16 ; VFP 単精度レジス タ 16 のシンボル と し て "mass" を ; 定義する

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-16ID 011811 Non-Confidential

Page 321: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

拡張表記の例

varA DN d1.U16varB DN d2.U16varC DN d3.U16

VADD varA,varB,varC ; VADD.U16 d1,d2,d3index DN d4.U16[0]result QN q5.I32

VMULL result,varA,index ; VMULL.U16 q5,d1,d3[2]

関連項目

リファレンス:

『アセンブラの使用』:

• 「事前宣言されている主要なレジスタ名」 (ページ 3-15)• 「事前宣言されている拡張レジスタ名」 (ページ 3-16)• 「事前宣言されている XScale レジスタ名」 (ページ 3-17)• 「事前宣言されているコプロセッサ名」 (ページ 3-19)• 「拡張表記」 (ページ 9-21)• 「拡張表記の例」

• 「NEON データ型および VFP データ型」 (ページ 9-13)• 「VFP ディレクティブとベクタ表記」 (ページ 9-41)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-17ID 011811 Non-Confidential

Page 322: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3 データ定義ディレクティブ

このセクションでは、メモリの割り当て、データ構造の定義、およびメモリの初期内容の設定を行う以下のディレクティブについて説明します。

• 「LTORG」 (ページ 6-19)

リテラルプールの起点を設定します。

• 「MAP」 (ページ 6-20)

記憶域マップの起点を設定します。

• 「FIELD」 (ページ 6-21)

記憶域マップ内のフィールドを定義します。

• 「SPACE または FILL」 (ページ 6-22)

ゼロ初期化されるメモリブロックを割り当てます。

• 「DCB」 (ページ 6-23)

バイト単位でメモリを割り当てて、初期内容を指定します。

• 「DCD、DCDU」 (ページ 6-24)

ワード単位でメモリを割り当てて、初期内容を指定します。

• 「DCDO」 (ページ 6-25)

ワード単位でメモリを割り当てて、スタティックベースレジスタからのオフセットとして初期内容を指定します。

• 「DCFD、DCFDU」 (ページ 6-26)

ダブルワード単位でメモリを割り当てて、倍精度浮動小数点数として初期内容を指定します。

• 「DCFS、DCFSU」 (ページ 6-27)

ワード単位でメモリを割り当てて、単精度浮動小数点数として初期内容を指定します。

• 「DCI」 (ページ 6-28)

ワード単位でメモリを割り当てて、初期内容を指定します。メモリ位置をデータではなくコードとしてマークします。

• 「DCQ、DCQU」 (ページ 6-30)

ダブルワード単位でメモリを割り当てて、64 ビット整数として初期内容を指定

します。

• 「DCW、DCWU」 (ページ 6-31)

ハーフワード単位でメモリを割り当てて、初期内容を指定します。

• 「COMMON」 (ページ 6-32)

ブロック単位でメモリをシンボルに割り当てて、境界調整を指定します。

• 「DATA」 (ページ 6-32)

コードセクション内のデータをマークします。このディレクティブは、下位互換性を維持する目的だけでサポートされています。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-18ID 011811 Non-Confidential

Page 323: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3.1 LTORG

LTORG ディレクティブは、現在のリテラルプールをすぐにアセンブルするようアセン

ブラに指示します。

構文

LTORG

使用法

アセンブラは、各コードセクションの終了位置で現在のリテラルプールをアセンブルします。コードセクションの終了位置は、次のセクションの先頭にある AREA ディ

レクティブによって決まるか、またはアセンブリの終了位置となります。

このようなデフォルトのリテラルプールは、LDR、VLDR、および WLDR 疑似命令の範囲外

になる場合があります。リテラルプールが範囲内でアセンブルされていることを確認するには、LTORG を使用します。

大きなプログラムでは、複数のリテラルプールが必要になる場合があります。定数がプロセッサによって命令として実行されないように、LTORG ディレクティブは、無

条件分岐またはサブルーチン復帰命令の後に配置して下さい。

リテラルプール内のデータは、アセンブラによってワード境界で整列されます。

AREA Example, CODE, READONLYstart BL func1func1 ; 関数本体

; コ ー ド LDR r1,=0x55555555 ; => LDR R1, [pc, #offset to Literal Pool 1] ; コ ー ド

MOV pc,lr ; 関数終了

LTORG ; Literal Pool 1 には リ テ ラ ル &55555555 が含まれる

data SPACE 4200 ; メ モ リ の現在の位置か ら 4200 バイ ト を

; ク リ アする

END ; デ フ ォ ル ト の リ テ ラ ルプールが空になる

関連項目

リファレンス: • 「LDR 疑似命令」 (ページ 3-169)• 「VLDR 疑似命令」 (ページ 4-73)• 「ワイヤレス MMX ロード / ストア命令」 (ページ 5-4)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-19ID 011811 Non-Confidential

Page 324: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3.2 MAP

MAP ディレクティブは、指定されたアドレスを記憶域マップの起点として設定しま

す。記憶域マップの位置カウンタ {VAR} には、同じアドレスが設定されます。̂ は MAP と同じ意味です。

構文

MAP expr{,base-register}

各パラメータには以下の意味があります。

expr 数値式または PC 相対式を指定します。

• base-register が指定されていない場合は、expr によって記憶域マッ

プの開始アドレスが求められます。記憶域マップの位置カウンタには、同じアドレスが設定されます。

• expr に PC 相対式が指定されている場合、マップ内でラベルを使用

するには、ラベルを事前に定義しておく必要があります。マップでは、アセンブラの 初のパスでラベルを定義する必要があります。

base-register

レジスタを指定します。base-register が指定されている場合、記憶域

マップの開始アドレスは、expr と、ランタイムの base-register の値の合

計になります。

使用法

記憶域マップを記述するには、MAP ディレクティブを FIELD ディレクティブと組み合

わせて使用します。

base-register を指定してレジスタ相対ラベルを定義します。次の MAP ディレクティブ

が出現するまで、このベースレジスタが、後続の FIELD ディレクティブで定義される

すべてのラベル内で暗黙的に使用されます。レジスタ相対ラベルは、ロード命令とストア命令で使用できます。

MAP ディレクティブを複数回使用することにより、複数の記憶域マップを定義できま

す。

初の MAP ディレクティブが使用されるまで、{VAR} カウンタにはゼロが設定されま

す。

MAP 0,r9 MAP 0xff,r9

関連項目

リファレンス: • 「FIELD」 (ページ 6-21)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-20ID 011811 Non-Confidential

Page 325: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3.3 FIELD

FIELD ディレクティブは、MAP ディレクティブを使用して定義された記憶域マップ内の

空間を定義します。# は FIELD と同じ意味です。

構文

{label} FIELD expr

各パラメータには以下の意味があります。

label ラベルを指定します(省略可)。指定されている場合は、label に記憶域

マップの位置カウンタ {VAR} の値が割り当てられます。その後、記憶域

マップの位置カウンタは、expr の値でインクリメントされます。

expr 記憶域マップの位置カウンタをインクリメントするバイト数を求める式

を指定します。

使用法

記憶域マップが base-register を指定する MAP ディレクティブによって設定されている

場合は、次の MAP ディレクティブが出現するまで、このベースレジスタが、後続の FIELD ディレクティブで定義されるすべてのラベル内で暗黙的に使用されます。これ

らのレジスタ相対ラベルは、ロード命令とストア命令で使用できます。

以下の例は、MAP ディレクティブと FIELD ディレクティブを使用してレジスタ相対ラ

ベルを定義する方法を示しています。

MAP 0,r9 ; R9 にス ト ア される ア ド レ ス を {VAR} に設定する

FIELD 4 ; {VAR} を 4 バイ ト イ ン ク リ メ ン トする

Lab FIELD 4 ; Lab に ア ド レ ス [R9 + 4] を設定する

; {VAR} を 4 バイ ト イ ン ク リ メ ン トする

LDR r0,Lab ; LDR r0,[r9,#4] と等価

関連項目

リファレンス: • 「MAP」 (ページ 6-20)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-21ID 011811 Non-Confidential

Page 326: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3.4 SPACE または FILL

SPACE ディレクティブは、ゼロ初期化されるメモリブロックを予約します。% は SPACE と同じ意味です。

FILL ディレクティブは、所定の値で埋めるメモリブロックを予約します。

構文

{label} SPACE expr

{label} FILL expr{,value{,valuesize}}

各パラメータには以下の意味があります。

label ラベルを指定します(省略可)。

expr 埋めるかゼロ初期化するバイトの数を求める式を指定します。

value 予約したバイトを埋める値に評価されます。value はオプションであり、

省略した場合には 0 になります。NOINIT 領域では value は 0 である必要

があります。

valuesize value のサイズ(バイト数単位)。1、2、および 4 のいずれかの値を取り

ます。valuesize はオプションであり、省略された場合には、1 になりま

す。

使用法

SPACE または FILL ディレクティブの後のコードの境界を整列するには、ALIGN ディレク

ティブを使用します。

AREA MyData, DATA, READWRITEdata1 SPACE 255 ; ゼロ初期化されるス ト アの 255 バイ ト を定義する

data2 FILL 50,0xAB,1 ; 0xAB を含む 50 バイ ト を定義する

関連項目

概念:

『アセンブラの使用』:

• 「数値式」 (ページ 8-16)

リファレンス: • 「DCB」 (ページ 6-23)• 「DCD、DCDU」 (ページ 6-24)• 「DCDO」 (ページ 6-25)• 「DCW、DCWU」 (ページ 6-31)• 「ALIGN」 (ページ 6-68)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-22ID 011811 Non-Confidential

Page 327: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3.5 DCB

DCB ディレクティブは、バイト単位でメモリを割り当てて、実行時のメモリの初期内

容を定義します。= は DCB と同じ意味です。

構文

{label} DCB expr{,expr}...

各パラメータには以下の意味があります。

expr 以下のいずれかを指定します。

• -128 ~ 255 の範囲の整数を求める数値式。

• 引用符で囲まれた文字列。文字列中の文字はストアの連続したバイトにロードされます。

使用法

DCB の後に命令が続く場合、ALIGN ディレクティブを使用して命令を整列させて下さ

い。

C 言語の文字列とは異なり、ARM アセンブラの文字列の終端は NULL ではありませ

ん。終端が NULL の C 言語の文字列は、DCB を以下のように使用して作成できます。

C_string DCB "C_string",0

関連項目

概念:

『アセンブラの使用』:

• 「数値式」 (ページ 8-16)

リファレンス: • 「DCD、DCDU」 (ページ 6-24)• 「DCQ、DCQU」 (ページ 6-30)• 「DCW、DCWU」 (ページ 6-31)• 「SPACE または FILL」 (ページ 6-22)• 「ALIGN」 (ページ 6-68)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-23ID 011811 Non-Confidential

Page 328: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3.6 DCD、DCDU

DCD ディレクティブは、ワード単位でメモリを割り当てて 4 バイト境界で整列させ、

実行時のメモリの初期内容を定義します。

& は DCD と同じ意味です。

メモリの境界調整が任意である点を除き、DCDU も同じです。

構文

{label} DCD{U} expr{,expr}

各パラメータには以下の意味があります。

expr 以下のいずれかを指定します。

• 数値式

• PC 相対式

使用法

DCD は、必要に応じて、 初に定義されたワードの前に 大 3 バイトのパディングを

挿入して、境界調整を 4 バイトにします。

境界調整が不要な場合は、DCDU を使用して下さい。

data1 DCD 1,5,20 ; 10 進数値の 1、 5、 および 20 を ; 保持する 3 ワー ド を定義する

data2 DCD mem06 + 4 ; ラ ベル mem06 のア ド レ ス + 4 を ; 保持する 1 ワー ド を定義する AREA MyData, DATA, READWRITE DCB 255 ; 境界調整が不適切

data3 DCDU 1,5,20 ; 1、 5、 および 20 を保持する 3 ワー ド を定義する

; ただ し、 ワー ド境界で整列されない

関連項目

概念:

『アセンブラの使用』:

• 「数値式」 (ページ 8-16)

リファレンス: • 「DCB」 (ページ 6-23)• 「DCI」 (ページ 6-28)• 「DCW、DCWU」 (ページ 6-31)• 「DCQ、DCQU」 (ページ 6-30)• 「SPACE または FILL」 (ページ 6-22)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-24ID 011811 Non-Confidential

Page 329: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3.7 DCDO

DCDO ディレクティブは、ワード単位でメモリを割り当てて、4 バイト境界で整列さ

せ、実行時のメモリの初期内容をスタティックベースレジスタ sb(R9)からのオフ

セットとして定義します。

構文

{label} DCDO expr{,expr}...

各パラメータには以下の意味があります。

expr レジスタ相対式またはラベルを指定します。ベースレジスタには sb を指定する必要があります。

使用法

DCDO を使用して、スタティックベースレジスタと相対的な再配置可能アドレスのた

めにメモリ内の空間を割り当てます。

IMPORT externsym DCDO externsym ; SB セ ク シ ョ ンのベースか ら の externsym の ; オ フ セ ッ ト で 32 ビ ッ ト ワー ドの再配置を行う

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-25ID 011811 Non-Confidential

Page 330: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3.8 DCFD、DCFDU

DCFD ディレクティブは、ワード境界で整列された倍精度浮動小数点数にメモリを割

り当て、実行時のメモリの初期内容を定義します。倍精度浮動小数点数には 2 ワー

ドが使用されます。この 2 ワードを算術演算で使用するには、ワード境界で整列さ

せる必要があります。

メモリの境界調整が任意である点を除き、DCFDU も同じです。

構文

{label} DCFD{U} fpliteral{,fpliteral}...

各パラメータには以下の意味があります。

fpliteral 倍精度浮動小数点リテラルを指定します。

使用法

アセンブラは、必要に応じて、 初に定義された数値の前に 大 3 バイトのパディ

ングを挿入して、境界調整を 4 バイトにします。

境界調整が不要な場合は、DCFDU を使用して下さい。

fpliteral を内部形式に変換する場合に使用されるワードの順序は、選択された浮動

小数点アーキテクチャによって制御されます。--fpu none オプションを選択すると、

DCFD および DCFDU は使用できません。

倍精度数の範囲は以下のとおりです。

• 大:1.79769313486231571e+308• 小:2.22507385850720138e–308

DCFD 1E308,-4E-100 DCFDU 10000,-.1,3.1E26

関連項目

概念:

『アセンブラの使用』:

• 「浮動小数点リテラル」 (ページ 8-18)

リファレンス: • 「DCFS、DCFSU」 (ページ 6-27)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-26ID 011811 Non-Confidential

Page 331: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3.9 DCFS、DCFSU

DCFS ディレクティブは、ワード境界で整列された単精度浮動小数点数にメモリを割

り当て、実行時のメモリの初期内容を定義します。単精度浮動小数点数には 1 ワー

ドが使用されます。この 1 ワードを算術演算で使用するには、ワード境界で整列さ

せる必要があります。

メモリの境界調整が任意である点を除き、DCFSU も同じです。

構文

{label} DCFS{U} fpliteral{,fpliteral}...

各パラメータには以下の意味があります。

fpliteral 単精度浮動小数点リテラルを指定します。

使用法

DCFS は、必要に応じて、 初に定義された数値の前に 大 3 バイトのパディングを挿

入して、境界調整を 4 バイトにします。

境界調整が不要な場合は、DCFSU を使用して下さい。

単精度数値の範囲は以下のとおりです。

• 大:3.40282347e+38• 小:1.17549435e–38

DCFS 1E3,-4E-9 DCFSU 1.0,-.1,3.1E6

関連項目

概念:

『アセンブラの使用』:

• 「浮動小数点リテラル」 (ページ 8-18)

リファレンス: • 「DCFD、DCFDU」 (ページ 6-26)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-27ID 011811 Non-Confidential

Page 332: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3.10 DCI

ARM コードでは、DCI ディレクティブは、ワード単位でメモリを割り当てて、4 バイ

ト境界で整列させ、実行時のメモリの初期内容を定義します。

Thumb コードでは、DCI ディレクティブは、ハーフワード単位でメモリを割り当て

て、2 バイト境界で整列させ、実行時のメモリの初期内容を定義します。

構文

{label} DCI{.W} expr{,expr}

各パラメータには以下の意味があります。

expr 数値式を指定します。

.W 指定されている場合は、Thumb コードに 4 バイトを挿入する必要がある

ことを示します。

使用法

DCI ディレクティブは、DCD ディレクティブや DCW ディレクティブとよく似ています

が、メモリ位置はデータではなくコードとしてマークされます。使用しているアセンブラのバージョンでサポートされていない新しい命令のマクロを記述する場合は、DCI を使用して下さい。

ARM コードでは、DCI は、必要に応じて、 初に定義されたワードの前に 大 3 バイ

トのパディングを挿入して、境界調整を 4 バイトにします。Thumb コードでは、DCI は、必要に応じて、先頭バイトのパディングを挿入して、境界調整を 2 バイトにし

ます。

DCI を使用して、ビットパターンを命令ストリームに挿入できます。例えば、以下を

使用します。

DCI 0x46c0

Thumb 演算 MOV r8,r8 が挿入されます。

MACRO ; こ のマ ク ロは新しい命令 Rd,Rm を ; 適切なマシン コ ー ド に変換する newinst $Rd,$Rm DCI 0xe16f0f10 :OR:($Rd:SHL:12) :OR:$Rm MEND

Thumb-2 の例

DCI.W 0xf3af8000 ; 32 ビ ッ ト NOP を挿入し、 2 バイ ト境界で整列させる

関連項目

概念:

『アセンブラの使用』:

• 「数値式」 (ページ 8-16)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-28ID 011811 Non-Confidential

Page 333: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

リファレンス: • 「DCD、DCDU」 (ページ 6-24)• 「DCW、DCWU」 (ページ 6-31)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-29ID 011811 Non-Confidential

Page 334: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3.11 DCQ、DCQU

DCQ ディレクティブは、8 バイト単位でメモリブロックを割り当てて、4 バイト境界

で整列させ、実行時のメモリの初期内容を定義します。

メモリの境界調整が任意である点を除き、DCQU も同じです。

構文

{label} DCQ{U} {-}literal{,{-}literal}...

各パラメータには以下の意味があります。

literal 64 ビットの数値リテラルを指定します。

この値の有効範囲は 0 ~ 264-1 です。

数値リテラルで通常使用できる文字に加え、literal の先頭にマイナス符

号を付けることができます。この場合の値の有効範囲は -263 ~ -1 となり

ます。

-n を指定した場合は、264–n を指定した場合と同じ結果が得られます。

使用法

DCQ は、必要に応じて、 初に定義された 8 バイトのブロックの前に 大 3 バイトの

パディングを挿入して、境界調整を 4 バイトにします。

境界調整が不要な場合は、DCQU を使用して下さい。

AREA MiscData, DATA, READWRITEdata DCQ -225,2_101 ; 2_101 はバイ ナ リ の 101 を表す

DCQU number+4 ; 数値は定義済みである こ と が必要

関連項目

概念:

『アセンブラの使用』:

• 「数値リテラル」 (ページ 8-17)

リファレンス: • 「DCB」 (ページ 6-23)• 「DCD、DCDU」 (ページ 6-24)• 「DCW、DCWU」 (ページ 6-31)• 「SPACE または FILL」 (ページ 6-22)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-30ID 011811 Non-Confidential

Page 335: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3.12 DCW、DCWU

DCW ディレクティブは、ハーフワード単位でメモリを割り当てて、2 バイト境界で整

列させ、実行時のメモリの初期内容を定義します。

メモリの境界調整が任意である点を除き、DCWU も同じです。

構文

{label} DCW{U} expr{,expr}...

各パラメータには以下の意味があります。

expr -32768 ~ 65535 の範囲の整数を求める数値式です。

使用法

DCW は、必要に応じて、 初に定義されたハーフワードの前に 1 バイトのパディング

を挿入して、境界調整を 2 バイトにします。

境界調整が不要な場合は、DCWU を使用して下さい。

data DCW -225,2*number ; 数値は定義済みである こ と が必要 DCWU number+4

関連項目

概念:

『アセンブラの使用』:

• 「数値式」 (ページ 8-16)

リファレンス: • 「DCB」 (ページ 6-23)• 「DCD、DCDU」 (ページ 6-24)• 「DCQ、DCQU」 (ページ 6-30)• 「SPACE または FILL」 (ページ 6-22)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-31ID 011811 Non-Confidential

Page 336: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.3.13 COMMON

COMMON ディレクティブは、定義されたサイズのメモリブロックを、指定したシンボル

で割り当てます。メモリの整列方法を指定します。境界調整を省略した場合、デフォルトの境界調整は 4 になります。また、サイズを省略した場合、デフォルトの

サイズは 0 になります。

このメモリには他のメモリと同様にアクセスできますが、オブジェクトファイルに領域は割り当てられません。

構文

COMMON symbol{,size{,alignment}} {[attr]}

各パラメータには以下の意味があります。

symbol シンボル名を指定します。シンボル名では大文字と小文字が区別されま

す。

size 予約するバイト数を指定します。

alignment 境界調整を指定します。

attr 次のいずれかを指定できます。

DYNAMIC ELF シンボルの可視性を STV_DEFAULT に設定します。

PROTECTED ELF シンボルの可視性を STV_PROTECTED に設定します。

HIDDEN ELF シンボルの可視性を STV_HIDDEN に設定します。

INTERNAL ELF シンボルの可視性を STV_INTERNAL に設定します。

使用法

リンカは、リンク段階で、必要な領域をゼロで初期化されたメモリとして割り当てます。COMMON ディレクティブで作成されたシンボルを定義、インポート(IMPORT)、ま

たはエクスターン(EXTERN)することはできません。同様に、定義済みのシンボルや IMPORT または EXTERN ディレクティブで使用されたシンボルを COMMON ディレクティブで

使用することはできません。

LDR r0, =xyzCOMMON xyz,255,4 ; ZI ス ト アの 255 バイ ト を定義し、 ワー ド境界で整列させる

誤用例

COMMON foo,4,4COMMON bar,4,4

foo DCD 0 ; COMMON と同じ名前を持つ ラ ベルは定義できない

IMPORT bar ; COMMON と同じ名前を持つ ラ ベルはイ ンポー ト できない

6.3.14 DATA

DATA ディレクティブは必要なくなりました。このディレクティブはアセンブラに

よって無視されます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-32ID 011811 Non-Confidential

Page 337: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.4 アセンブリ制御ディレクティブ

このセクションでは、条件付きアセンブリ、ループ、インクルード、およびマクロを制御する以下のディレクティブについて説明します。

• 「MACRO、MEND」 (ページ 6-34)• 「MEXIT」 (ページ 6-37)• 「IF、ELSE、ENDIF、ELIF」 (ページ 6-38)• 「WHILE、WEND」 (ページ 6-41)

6.4.1 ネスティングディレクティブ

以下の構造は合計で 256 の深さまでネストできます。

• MACRO 定義

• WHILE...WEND ループ

• IF...ELSE...ENDIF 条件構造

• INCLUDE ファイルインクルード

これらの構造がどのようにネストされているかに関係なく、上記の制限はネストされた構造全体に適用されます。各構造の制限が 256 ではありません。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-33ID 011811 Non-Confidential

Page 338: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.4.2 MACRO、MEND

MACRO ディレクティブは、マクロ定義の開始位置をマークします。マクロ拡張は、

MEND ディレクティブで終了します。

構文

マクロの定義には 2 つのディレクティブを使用します。構文は以下のとおりです。

MACRO{$label} macroname{$cond} {$parameter{,$parameter}...} ; code MEND

各パラメータには以下の意味があります。

$label マクロが呼び出されたときに、指定されたシンボルが代入されるパラ

メータを指定します。通常、このシンボルはラベルです。

macroname マクロの名前を指定します。命令またはディレクティブの名前で始まる

名前は付けられません。

$cond 条件コードを含んでいるように設計された特別なパラメータです。有効

な条件コード以外の値も許可されます。

$parameter マクロが呼び出されたときに値が代入されるパラメータを指定します。

パラメータのデフォルト値は、以下の形式を使用して設定できます。

$parameter="default value"

デフォルト値にスペースが含まれているか、または値の前後のいずれかにスペースがある場合は、二重引用符を使用する必要があります。

使用法

マクロ内で WHILE...WEND ループまたは IF...ENDIF 条件を始める場合は、MEND ディレク

ティブに到達する前にこのループまたは条件を閉じる必要があります。ループ内からの終了時など、マクロからの早期終了を可能にする必要がある場合は、MEXIT を使

用して下さい。

マクロ本体内では、$label、$parameter または $cond などのパラメータは他の変数と同

じように使用できます。これらのパラメータには、マクロが呼び出されるたびに新しい値が渡されます。パラメータを通常のシンボルと区別するには、先頭に $ を付け

る必要があります。パラメータはいくつでも使用できます。

$label は省略可能ですが、マクロによって内部ラベルが定義される場合に役立ちま

す。このラベルは、マクロへのパラメータとして処理されますが、必ずしも、マクロ拡張の 初の命令を表す必要はありません。マクロでは、すべてのラベルの位置が定義されます。

パラメータのデフォルト値を使用するには、| を引数として使用します。この引数が

省略されている場合は、空の文字列が使用されます。

複数の内部ラベルを使用するマクロでは、各内部ラベルを、異なる接尾文字の付いたベースラベルとして定義すると役立ちます。

拡張にスペースが不要な場合には、パラメータとそれに続くテキストの間、またはパラメータとパラメータの間にはドット(.)を使用します。ただし、パラメータと

その前のテキストの間にはドットは使用しないで下さい。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-34ID 011811 Non-Confidential

Page 339: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

条件コードには、$cond パラメータを使用できます。単項演算子 :REVERSE_CC: を使用し

て、条件コードの逆数を検索し、:CC_ENCODING: を使用して、条件コードの 4 ビットエ

ンコーディングを検索します。

マクロでは、ローカル変数の有効範囲を定義します。

マクロはネストできます。

; マ ク ロ定義

MACRO ; マ ク ロ定義開始$label xmac $p1,$p2 ; コ ー ド

$label.loop1 ; コ ー ド

; コ ー ド BGE $label.loop1$label.loop2 ; コ ー ド BL $p1 BGT $label.loop2 ; コ ー ド ADR $p2 ; コ ー ド

MEND ; マ ク ロ定義終了

; マ ク ロ の呼び出し

abc xmac subr1,de ; マ ク ロ を呼び出す

; コ ー ド ; これが

abcloop1 ; コ ー ド ; xmac マ ク ロの

; コ ー ド ; 拡張時に

BGE abcloop1 ; 生成される

abcloop2 ; コ ー ド BL subr1 BGT abcloop2 ; コ ー ド

ADR de ; コ ー ド

マクロを使用したアセンブリ時の診断を以下に示します。

MACRO ; マ ク ロ定義

diagnose $param1="default" ; こ のマ ク ロ に よ り

INFO 0,"$param1" ; 第 2 アセン ブ リ パスで

MEND ; アセン ブ リ時の診断が生成される

; マ ク ロ拡張

diagnose ; アセン ブ リ時に空白行を出力する

diagnose "hello" ; アセン ブ リ時に "hello" を出力する

diagnose | ; アセン ブ リ時にデ フ ォ ル ト を出力する

注 変数も引数として渡される場合、| を使用すると、一部の変数が代入されないままに

なる場合があります。この問題を回避するには、| を LCLS または GBLS 変数で定義し、

この変数を | の代わりに引数として渡します。以下に例を示します。

MACRO ; マ ク ロ定義

m2 $a,$b=r1,$c ; $b のデ フ ォ ル ト値は r1add $a,$b,$c ; マ ク ロは $b と $c を加算し て、 結果を $a に代入

MEND ; マ ク ロの終了

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-35ID 011811 Non-Confidential

Page 340: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

MACRO ; マ ク ロ定義

m1 $a,$b ; こ のマ ク ロは $b を r1 に加算し て、 結果を $a に代入

LCLS def ; | のための ロー カ ル文字列変数を宣言

def SETS "|" ; | を定義

m2 $a,$def,$b ; マ ク ロ m2 を | の代わ り に $def で呼び出し て

; 2 番目の引数にデ フ ォ ル ト値を使用。

MEND ; マ ク ロの終了

条件付きマクロの例

AREA codx, CODE, READONLY

; マ ク ロ定義

MACROReturn$cond[ {ARCHITECTURE} <> "4"BX$cond lr|MOV$cond pc,lr

] MEND

; マ ク ロ の呼び出し

fun PROCCMP r0,#0MOVEQ r0,#1ReturnEQ MOV r0,#0

戻り値ENDP

END

関連項目

概念:

『アセンブラの使用』:

• 「マクロの使用」 (ページ 5-33)• 「アセンブリ時の変数代入」 (ページ 8-6)

リファレンス: • 「MEXIT」 (ページ 6-37)• 「ネスティングディレクティブ」 (ページ 6-33)• 「GBLA、GBLL、GBLS」 (ページ 6-5)• 「LCLA、LCLL、LCLS」 (ページ 6-8)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-36ID 011811 Non-Confidential

Page 341: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.4.3 MEXIT

MEXIT ディレクティブは、マクロ定義の終了位置に到達する前にマクロを終了する場

合に使用します。

使用法

MEXIT は、マクロ本体の中から終了する必要がある場合に使用します。マクロ本体の

中で閉じられていない WHILE...WEND ループまたは IF...ENDIF 条件は、マクロが終了す

る前にアセンブラによって閉じられます。

MACRO$abc example abc $param1,$param2 ; コ ー ド WHILE condition1 ; コ ー ド IF condition2 ; コ ー ド MEXIT ELSE ; コ ー ド ENDIF WEND ; コ ー ド MEND

関連項目

リファレンス: • 「MACRO、MEND」 (ページ 6-34)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-37ID 011811 Non-Confidential

Page 342: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.4.4 IF、ELSE、ENDIF、ELIF

IF ディレクティブは、命令とディレクティブのシーケンスをアセンブルするかどう

かを決める条件を定義します。[ は IF と同じ意味です。

ELSE ディレクティブは、前の条件が満たされなかった場合にアセンブルされる命令

とディレクティブのシーケンスの開始位置をマークします。| は ELSE と同じ意味で

す。

ENDIF ディレクティブは、条件付きでアセンブルされる命令とディレクティブのシー

ケンスの終了位置をマークします。] は ENDIF と同じ意味です。

ELIF ディレクティブは、条件をネストまたは反復することなく、ELSE IF と同じ構造

を作成します。

構文

IF logical-expression …;code{ELSE …;code}ENDIF

各パラメータには以下の意味があります。

logical-expression

{TRUE} または {FALSE} を求める式を指定します。

使用法

指定された条件下においてのみアセンブルまたは実行される命令とディレクティブのシーケンスには、IF と ENDIF に加え、必要に応じて ELSE を組み合わせて使用しま

す。

IF...ENDIF 条件はネストできます。

ELIF の使用

ELIF を使用せずに、以下のようなネストされた条件付き命令セットを作成できます。

IF logical-expression instructions ELSE IF logical-expression2 instructions ELSE IF logical-expression3 instructions ENDIF ENDIF ENDIF

このようなネスト構造は、256 の深さまでネストできます。

ELIF を使用すると、同じ構造をより簡単に記述できます。

IF logical-expression instructions ELIF logical-expression2 instructions

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-38ID 011811 Non-Confidential

Page 343: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

ELIF logical-expression3 instructions ENDIF

この構造では、現在のネストの深さに IF...ENDIF ペアの 1 レベルだけが追加された深

さになります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-39ID 011811 Non-Confidential

Page 344: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

例 6-3 では、NEWVERSION が定義されている場合は 初の命令セットがアセンブルされ、

定義されていない場合は 2 番目の命令セットがアセンブルされます。

例 6-3 定義される変数に基づく条件付きアセンブリ

IF :DEF:NEWVERSION ; 初の命令またはデ ィ レ ク テ ィ ブのセ ッ ト ELSE ; 2 番目の命令またはデ ィ レ ク テ ィ ブのセ ッ ト ENDIF

armasm を以下のように呼び出した場合には NEWVERSION が定義されるため、 初の命令

およびディレクティブのセットがアセンブルされます。

armasm --predefine "NEWVERSION SETL {TRUE}" test.s

armasm を以下のように呼び出した場合には NEWVERSION が定義されていないため、2 番目の命令およびディレクティブのセットがアセンブルされます。

armasm test.s

例 6-4 では、NEWVERSION の値が {TRUE} の場合に 初の命令セットがアセンブルされ、

それ以外の場合は 2 番目の命令セットがアセンブルされます。

例 6-4 変数の値に基づく条件付きアセンブリ

IF NEWVERSION = {TRUE} ; 初の命令またはデ ィ レ ク テ ィ ブのセ ッ ト ELSE ; 2 番目の命令またはデ ィ レ ク テ ィ ブのセ ッ ト ENDIF

armasm を以下のように呼び出した場合には、 初の命令およびディレクティブのセッ

トがアセンブルされます。

armasm --predefine "NEWVERSION SETL {TRUE}" test.s

armasm を以下のように呼び出した場合には、2 番目の命令およびディレクティブの

セットがアセンブルされます。

armasm --predefine "NEWVERSION SETL {FALSE}" test.s

関連項目

概念:

『アセンブラの使用』:

• 「関係演算子」 (ページ 8-28)

リファレンス: • 「ELIF の使用」 (ページ 6-38)• 「ネスティングディレクティブ」 (ページ 6-33)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-40ID 011811 Non-Confidential

Page 345: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.4.5 WHILE、WEND

WHILE ディレクティブは、繰り返しアセンブルされる命令やディレクティブのシーケ

ンスを開始します。このシーケンスは WEND ディレクティブで終了します。

構文

WHILE logical-expression

code

WEND

各パラメータには以下の意味があります。

logical-expression

{TRUE} または {FALSE} を求める式を指定します。

使用法

命令のシーケンスを複数回アセンブルするには、WHILE ディレクティブを WEND ディレ

クティブと組み合わせて使用します。反復回数はゼロにすることもできます。

IF...ENDIF 条件は WHILE...WEND ループ内で使用できます。

WHILE...WEND ループはネストできます。

count SETA 1 ; も っ と複雑な条件も

WHILE count <= 4 ; 指定可能

count SETA count+1 ; こ の場合、

; コ ー ド ; こ の コ ー ドは

; コ ー ド ; 4 回繰り返される WEND

関連項目

概念:

『アセンブラの使用』:

• 「論理式」 (ページ 8-19)

リファレンス: • 「ネスティングディレクティブ」 (ページ 6-33)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-41ID 011811 Non-Confidential

Page 346: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.5 Frame ディレクティブ

このセクションでは、以下のディレクティブについて説明します。

• 「FRAME ADDRESS」 (ページ 6-44)• 「FRAME POP」 (ページ 6-45)• 「FRAME PUSH」 (ページ 6-46)• 「FRAME REGISTER」 (ページ 6-48)• 「FRAME RESTORE」 (ページ 6-49)• 「FRAME RETURN ADDRESS」 (ページ 6-50)• 「FRAME SAVE」 (ページ 6-51)• 「FRAME STATE REMEMBER」 (ページ 6-52)• 「FRAME STATE RESTORE」 (ページ 6-53)• 「FRAME UNWIND ON」 (ページ 6-54)• 「FRAME UNWIND OFF」 (ページ 6-54)• 「FUNCTION、PROC」 (ページ 6-54)• 「ENDFUNC、ENDP」 (ページ 6-56)

上記のディレクティブを使用することにより、以下の処理を行うことができます。

• armlink --callgraph オプションを使用して、アセンブラ関数によるスタック使用

量を計算できます。

スタック使用量の特定には、以下のルールが使用されます。

— 関数が PROC または ENDP でマークされていない場合、スタック使用量は特

定できません。

— 関数が PROC または ENDP でマークされていても FRAME PUSH または FRAME POP でマークされていない場合、スタック使用量はゼロであると見なされます。つまり、FRAME PUSH 0 または FRAME POP 0 を手動で追加する必要はありませ

ん。

— 関数が PROC または ENDP でマークされ、なおかつ FRAME PUSH n または FRAME POP n でマークされている場合、スタック使用量は n バイトと見なされま

す。

• 特に既存のコードを変更する場合に、関数の構造内でのエラーを回避できます。

• アセンブラが関数の構造内のエラーについて警告メッセージを生成できます。

• デバッグ時に関数呼び出しのバックトレースを行うことができます。

• デバッガを使用して、アセンブラ関数のプロファイルを取得することができます。

アセンブラ関数のプロファイルを必要としていても、他の目的にフレーム記述ディレクティブを必要としない場合、以下のようになります。

• FUNCTION ディレクティブと ENDFUNC ディレクティブ、または PROC ディレクティブ

と ENDP ディレクティブを使用する必要があります。

• 他の FRAME ディレクティブは省略できます。

• FUNCTION ディレクティブと ENDFUNC ディレクティブは、プロファイルの取得の対

象となる関数に対してのみ使用する必要があります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-42ID 011811 Non-Confidential

Page 347: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

DWARF での標準構造フレームアドレスは、割り込み関数のコールフレームがある場

所を指定する、スタック上のアドレスです。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-43ID 011811 Non-Confidential

Page 348: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.5.1 FRAME ADDRESS

FRAME ADDRESS ディレクティブは、後続の命令の標準構造フレームアドレスの計算方法

を記述します。このディレクティブは、FUNCTION ディレクティブと ENDFUNC ディレク

ティブを含む関数または PROC ディレクティブと ENDP ディレクティブを含む関数での

み使用できます。

構文

FRAME ADDRESS reg[,offset]

各パラメータには以下の意味があります。

reg 標準構造フレームアドレスのベースとなるレジスタを指定します。関数

で別のフレームポインタを使用しない限り、このレジスタが SP になり

ます。

offset reg から標準構造フレームアドレスまでのオフセットを指定します。

offset がゼロの場合は省略できます。

使用法

FRAME ADDRESS ディレクティブは、コードによって標準構造フレームアドレスのベース

となるレジスタが変更される場合またはレジスタから標準構造フレームアドレスまでのオフセットが変更される場合に使用します。FRAME ADDRESS ディレクティブは、標

準構造フレームアドレスの計算方法を変更する命令の直後に使用する必要があります。

注 コードでレジスタを保存してスタックポインタを変更する 1 つの命令を使用する場

合、FRAME ADDRESS と FRAME SAVE の両方を使用する代わりに FRAME PUSH を使用できます。

また、コードでレジスタをロードしてスタックポインタを変更する 1 つの命令を使

用する場合は、FRAME ADDRESS と FRAME RESTORE の両方を使用する代わりに FRAME POP を使

用できます。

_fn FUNCTION ; CFA (標準構造フ レームア ド レ ス) は、

; 関数へのエ ン ト リ時の SP の値

PUSH {r4,fp,ip,lr,pc} FRAME PUSH {r4,fp,ip,lr,pc} SUB sp,sp,#4 ; CFA オ フ セ ッ ト が変更されたため、

FRAME ADDRESS sp,24 ; 修正する ADD fp,sp,#20 FRAME ADDRESS fp,4 ; 新しいベース レジス タ

; コ ール フ レームのベース と する fp (SP ではない) を使用する コ ー ド

関連項目

リファレンス: • 「FRAME POP」 (ページ 6-45)• 「FRAME PUSH」 (ページ 6-46)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-44ID 011811 Non-Confidential

Page 349: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.5.2 FRAME POP

FRAME POP ディレクティブを使用して、呼び出される側がレジスタをリロードするタ

イミングをアセンブラに通知します。このディレクティブは、FUNCTION ディレクティ

ブと ENDFUNC ディレクティブを含む関数または PROC ディレクティブと ENDP ディレク

ティブを含む関数でのみ使用できます。

このディレクティブは、関数内の 後の命令の後で必ず使用する必要があるものではありません。

構文

FRAME POP には以下の 3 つの構文があります。

FRAME POP {reglist}

FRAME POP {reglist},n

FRAME POP n

各パラメータには以下の意味があります。

reglist 関数へのエントリで保持していた値に復元されるレジスタリストを指定

します。リストには少なくとも 1 本のレジスタを指定する必要がありま

す。

n スタックポインタが移動するバイト数を指定します。

使用法

FRAME POP は、FRAME ADDRESS ディレクティブおよび FRAME RESTORE ディレクティブを使用

することと同じです。このディレクティブを使用すると、1 つの命令でレジスタを

ロードし、スタックポインタを変更することができます。

FRAME POP は、このディレクティブが参照する命令の直後に配置する必要があります。

n が指定されていないかゼロの場合、アセンブラによって、{reglist} から標準構造フ

レームアドレスまでの新しいオフセットが計算されます。アセンブラは以下を前提としています。

• ポップされる各 ARM レジスタによってスタック上の 4 バイトが占有されてい

ます。

• ポップされる各 VFP 単精度レジスタによってスタック上の 4 バイトが占有さ

れ、さらにリストごとに 4 バイトワードが占有されていること

• ポップされる各 VFP 倍精度レジスタによってスタック上の 8 バイトが占有さ

れ、さらにリストごとに 4 バイトワードが占有されていること

関連項目

リファレンス: • 「FRAME ADDRESS」 (ページ 6-44)• 「FRAME RESTORE」 (ページ 6-49)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-45ID 011811 Non-Confidential

Page 350: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.5.3 FRAME PUSH

FRAME PUSH ディレクティブを使用して、通常は関数エントリにおいて、呼び出される

側がレジスタを保存するタイミングをアセンブラに通知します。このディレクティブは、FUNCTION ディレクティブと ENDFUNC ディレクティブを含む関数または PROC ディ

レクティブと ENDP ディレクティブを含む関数でのみ使用できます。

構文

FRAME PUSH には以下の 2 つの構文があります。

FRAME PUSH {reglist}

FRAME PUSH {reglist},n

FRAME PUSH n

各パラメータには以下の意味があります。

reglist 標準構造フレームアドレスの下位方向に連続してストアされるレジスタ

のリストを指定します。リストには少なくとも 1 本のレジスタを指定す

る必要があります。

n スタックポインタが移動するバイト数を指定します。

使用法

FRAME PUSH は、FRAME ADDRESS ディレクティブおよび FRAME SAVE ディレクティブを使用す

ることと同じです。このディレクティブを使用すると、1 つの命令でレジスタを保存

し、スタックポインタを変更することができます。

FRAME PUSH は、このディレクティブが参照する命令の直後に配置する必要がありま

す。

n が指定されていないかゼロの場合、アセンブラによって、{reglist} から標準構造フ

レームアドレスまでの新しいオフセットが計算されます。アセンブラは以下を前提としています。

• プッシュされる各 ARM レジスタによってスタック上の 4 バイトが占有されて

いること

• プッシュされる各 VFP 単精度レジスタによってスタック上の 4 バイトが占有さ

れ、さらにリストごとに 4 バイトワードが占有されていること

• ポップされる各 VFP 倍精度レジスタによってスタック上の 8 バイトが占有さ

れ、さらにリストごとに 4 バイトワードが占有されていること

p PROC ; 標準構造フ レームア ド レ スは SP + 0 EXPORT p PUSH {r4-r6,lr} ; SP は標準構造フ レームア ド レ ス を基準に移動されてお り、

; レジス タ R4、 R5、 R6、 および LR がス タ ッ ク上にある FRAME PUSH {r4-r6,lr} ; 以下と等価 :

; FRAME ADDRESS sp,16 ; {R4-R6,LR} 内の 16 バイ ト ; FRAME SAVE {r4-r6,lr},-16

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-46ID 011811 Non-Confidential

Page 351: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

関連項目

リファレンス: • 「FRAME ADDRESS」 (ページ 6-44)• 「FRAME SAVE」 (ページ 6-51)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-47ID 011811 Non-Confidential

Page 352: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.5.4 FRAME REGISTER

FRAME REGISTER ディレクティブを使用して、レジスタに保持されている関数引数の位

置を管理します。このディレクティブは、FUNCTION ディレクティブと ENDFUNC ディレ

クティブを含む関数または PROC ディレクティブと ENDP ディレクティブを含む関数で

のみ使用できます。

構文

FRAME REGISTER reg1, reg2

各パラメータには以下の意味があります。

reg1 関数へのエントリで引数を保持するレジスタを指定します。

reg2 その値を保持するレジスタを指定します。

使用法

FRAME REGISTER ディレクティブは、関数へのエントリで別のレジスタに保持されてい

た引数を保持するレジスタを使用する場合に使用します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-48ID 011811 Non-Confidential

Page 353: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.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 を使

用できます。

関連項目

リファレンス: • 「FRAME POP」 (ページ 6-45)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-49ID 011811 Non-Confidential

Page 354: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.5.6 FRAME RETURN ADDRESS

FRAME RETURN ADDRESS ディレクティブによって、LR 以外のレジスタを復帰アドレスに

使用する関数を定義できます。このディレクティブは、FUNCTION ディレクティブと ENDFUNC ディレクティブを含む関数または PROC ディレクティブと ENDP ディレクティブ

を含む関数でのみ使用できます。

注 LR 以外のレジスタを復帰アドレスに使用する関数は AAPCS に準拠していません。

このような関数はエクスポートしないで下さい。

構文

FRAME RETURN ADDRESS reg

各パラメータには以下の意味があります。

reg 復帰アドレスに使用するレジスタを指定します。

使用法

FRAME RETURN ADDRESS ディレクティブは、復帰アドレスに LR を使用しない関数で使用

します。このディレクティブを使用しないと、デバッガはその関数のバックトレースを行うことができません。

FRAME RETURN ADDRESS は、r14 を使用しない関数の開始位置をマークする FUNCTION ディ

レクティブまたは PROC ディレクティブの直後に使用します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-50ID 011811 Non-Confidential

Page 355: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.5.7 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 を使用できます。

関連項目

リファレンス: • 「FRAME PUSH」 (ページ 6-46)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-51ID 011811 Non-Confidential

Page 356: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.5.8 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 REMEMBER ; イ ン ラ イ ン終了シーケ ン スの前に フ レームの状態を保存する POP {r4-r6,pc} ; 制御が関数か ら渡されたため、 こ こ で

; FRAME POP を使用する必要はない FRAME STATE RESTORE ; 終了シーケン スが終了し たので、 状態を復元する

exitB ; exitB の コ ー ド POP {r4-r6,pc} ENDP

関連項目

リファレンス: • 「FRAME STATE RESTORE」 (ページ 6-53)• 「FUNCTION、PROC」 (ページ 6-54)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-52ID 011811 Non-Confidential

Page 357: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.5.9 FRAME STATE RESTORE

FRAME STATE RESTORE ディレクティブは、標準構造フレームアドレスと、保存されるレ

ジスタ値の位置の計算方法に関する現在の情報を復元します。このディレクティブは、FUNCTION ディレクティブと ENDFUNC ディレクティブを含む関数または PROC ディレ

クティブと ENDP ディレクティブを含む関数でのみ使用できます。

構文

FRAME STATE RESTORE

関連項目

リファレンス: • 「FRAME STATE REMEMBER」 (ページ 6-52)• 「FUNCTION、PROC」 (ページ 6-54)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-53ID 011811 Non-Confidential

Page 358: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.5.10 FRAME UNWIND ON

FRAME UNWIND ON ディレクティブは、この関数と後に続く関数の unwind テーブルを生成

するようアセンブラに指示します。

構文

FRAME UNWIND ON

使用法

このディレクティブは関数の外部で使用できます。この場合のアセンブラは、FRAME

UNWIND OFF ディレクティブに到達するまで、後続のすべての関数の unwind テーブルを

生成します。

注 FRAME UNWIND ディレクティブは、例外テーブル生成を有効にするには不十分です。さ

らに、FRAME UNWIND ディレクティブに他の FRAME ディレクティブがない場合、情報が不

十分なので、アセンブラは unwind 情報を生成できません。

関連項目

リファレンス: • 「--exceptions」 (ページ 2-14)• 「--exceptions_unwind」 (ページ 2-14)

6.5.11 FRAME UNWIND OFF

FRAME UNWIND OFF ディレクティブは、この関数と後に続く関数の nounwind テーブルを

生成するようアセンブラに指示します。

構文

FRAME UNWIND OFF

使用法

このディレクティブは関数の外部で使用できます。この場合のアセンブラは、FRAME

UNWIND ON ディレクティブに到達するまで、後続のすべての関数の nounwind テーブル

を生成します。

関連項目

リファレンス: • 「--exceptions」 (ページ 2-14)• 「--exceptions_unwind」 (ページ 2-14)

6.5.12 FUNCTION、PROC

FUNCTION ディレクティブは、関数の開始位置をマークします。PROC は FUNCTION と同じ

意味です。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-54ID 011811 Non-Confidential

Page 359: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

構文

label FUNCTION [{reglist1} [, {reglist2}]]

各パラメータには以下の意味があります。

reglist1 呼び出される側によって保存される ARM レジスタのリストを指定でき

ます(省略可)。reglist1 が指定されていない場合、デバッガはレジスタ

の使用状況をチェックするときに AAPCS が使用されていると見なしま

す。

reglist2 呼び出される側によって保存される VFP レジスタのリストを指定でき

ます(省略可)。

使用法

FUNCTION ディレクティブを使用して関数の開始位置をマークします。ELF の DWARF コールフレーム情報を生成するとき、アセンブラは FUNCTION を使用して関数の開始位

置を識別します。

FUNCTION によって標準構造フレームアドレスは R13(SP)に設定され、フレーム状態

スタックは空になります。

各 FUNCTION ディレクティブには、対応する ENDFUNC ディレクティブが必要です。

FUNCTION と ENDFUNC の対をネストしたり、これらの対に PROC ディレクティブや ENDP ディレクティブを含めたりすることはできません。

別のプロシージャコール標準を使用している場合は、オプションの reglist パラメー

タを使用して、その情報をデバッガに通知できます。ただし、すべてのデバッガがこの機能をサポートしているわけではありません。詳細については、デバッガのマニュアルを参照して下さい。

注 FUNCTION では、ワード境界(Thumb の場合はハーフワード境界)への境界調整は自動

的には行われません。境界調整を行う必要がある場合は ALIGN を使用します。この

ディレクティブを使用しないと、コールフレームによって関数の開始位置が示されない場合があります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-55ID 011811 Non-Confidential

Page 360: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

ALIGN ; 境界調整を行う

dadd FUNCTION ; ALIGN デ ィ レ ク テ ィ ブなしではワード境界への境界調整が行われない可能性がある EXPORT dadd PUSH {r4-r6,lr} ; 自動的にワード境界への境界調整が行われる FRAME PUSH {r4-r6,lr} ; サブルーチ ン本体 POP {r4-r6,pc} ENDFUNCfunc6 PROC {r4-r8,r12},{D1-D3} ; AAPCS に非準拠の関数 ... ENDP

関連項目

リファレンス: • 「FRAME ADDRESS」 (ページ 6-44)• 「FRAME STATE RESTORE」 (ページ 6-53)• 「ALIGN」 (ページ 6-68)

6.5.13 ENDFUNC、ENDP

ENDFUNC ディレクティブは、AAPCS 準拠の関数の終了位置をマークします。ENDP は ENDFUNC と同じ意味です。

関連項目

リファレンス: • 「FUNCTION、PROC」 (ページ 6-54)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-56ID 011811 Non-Confidential

Page 361: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.6 通知ディレクティブ

このセクションでは、以下のディレクティブについて説明します。

• 「ASSERT」

アセンブリ時にアサーションが偽になる場合にエラーメッセージを生成します。

• 「INFO」 (ページ 6-58)

アセンブリ時に診断情報を生成します。

• 「OPT」 (ページ 6-60)

リストオプションを設定します。

• 「TTL、SUBT」 (ページ 6-62)

リストにタイトルとサブタイトルを挿入します。

6.6.1 ASSERT

ASSERT ディレクティブは、指定されたアサーションが偽になると、アセンブリ中にエ

ラーメッセージを生成します。

構文

ASSERT logical-expression

各パラメータには以下の意味があります。

logical-expression

{TRUE} または {FALSE} を返すアサーションを指定します。

使用法

ASSERT を使用して、必要な条件がアセンブリ時に満たされているかどうかを確認しま

す。

アサーションが偽の場合、エラーメッセージが生成され、アセンブルに失敗します。

ASSERT label1 <= label2 ; label1 で表される

; ア ド レ スが

; label2 で表される ア ド レ ス よ り小さ いか、 等しい こ と を

; 確認する

関連項目

リファレンス: • 「INFO」 (ページ 6-58)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-57ID 011811 Non-Confidential

Page 362: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.6.2 INFO

INFO ディレクティブは、アセンブルのどちらのパスに関する診断情報の生成もサ

ポートします。

! は INFO とよく似ていますが、通知される情報の詳細度は低くなります。

構文

INFO numeric-expression, string-expression{, severity}

各パラメータには以下の意味があります。

numeric-expression

アセンブリ時に評価される数値式を指定します。この式の結果がゼロになった場合、以下のようになります。

• 第 1 パスでは何も行われません。

• severity が 1 の場合、string-expression が第 2 パスで警告として出

力されます。

• severity が 0 か指定されていない場合、string-expression が第 2 パスでメッセージとして出力されます。

この式の結果がゼロ以外の場合は、以下のようになります。

• severity がゼロかどうかにかかわらず(この場合、severity のゼロ

以外の値は予約されています)、string-expression がエラーメッ

セージとして出力され、アセンブルに失敗します。

string-expression

文字列を返す式を指定します。

severity

メッセージの重大度を制御する任意の数を指定します。指定できる値は 0 または 1 です。それ以外の値はすべて予約されています。

使用法

INFO ディレクティブを使用すると、独自のエラーメッセージを柔軟に作成すること

ができます。

INFO 0, "Version 1.0" IF endofdata <= label1 INFO 4, "Data overrun at label1" ENDIF

関連項目

概念:

『アセンブラの使用』:

• 「数値式」 (ページ 8-16)• 「文字列式」 (ページ 8-14)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-58ID 011811 Non-Confidential

Page 363: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

リファレンス: • 「ASSERT」 (ページ 6-57)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-59ID 011811 Non-Confidential

Page 364: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.6.3 OPT

OPT ディレクティブは、ソースコード内からリストオプションを設定します。

構文

OPT n

各パラメータには以下の意味があります。

n OPT ディレクティブの設定を指定します。表 6-2 は、利用可能な設

定を示しています。

使用法

リスティングを有効にするには、--list= アセンブラオプションを指定します。

デフォルトでは、--list= オプションを指定すると、変数宣言、マクロ拡張、呼び出し

条件ディレクティブ、MEND ディレクティブを含む通常のリストが生成されます。この

リストは第 2 パスのみで生成されます。コード内でデフォルトのリストオプション

を修正するには、OPT ディレクティブを使用します。

表 6-2 OPT ディレクティブの設定

OPT n 効果

1 通常のリスティングが有効になります。

2 通常のリスティングが無効になります。

4 ページ区切りが行われます。すぐに改ページが行われ、新しいページが始まります。

8 行番号カウンタがゼロにリセットされます。

16 SET、GBL、および LCL ディレクティブのリスティングが有効

になります。

32 SET、GBL、および LCL ディレクティブのリスティングが無効

になります。

64 マクロ拡張のリスティングが有効になります。

128 マクロ拡張のリスティングが無効になります。

256 マクロ呼び出しのリスティングが有効になります。

512 マクロ呼び出しのリスティングが無効になります。

1024 第 1 パスのリスティングが有効になります。

2048 第 1 パスのリスティングが無効になります。

4096 条件ディレクティブのリスティングが有効になります。

8192 条件ディレクティブのリスティングが無効になります。

16384 MEND ディレクティブのリスティングが有効になります。

32768 MEND ディレクティブのリスティングが無効になります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-60ID 011811 Non-Confidential

Page 365: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

OPT ディレクティブを使用して、コードのリストのフォーマットを設定できます。例

えば、関数とセクションの前に新しいページを指定できます。

AREA Example, CODE, READONLYstart ; コ ー ド

; コ ー ド BL func1 ; コ ー ド

OPT 4 ; 改ページを func1 の前に挿入する

func1 ; コ ー ド

関連項目

リファレンス: • 「--list=file」 (ページ 2-18)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-61ID 011811 Non-Confidential

Page 366: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.6.4 TTL、SUBT

TTL ディレクティブは、リスティングファイルの各ページの先頭にタイトルを挿入し

ます。このタイトルは、新しい TTL ディレクティブが発行されるまで各ページに出力

されます。

SUBT ディレクティブは、リスティングファイルのページにサブタイトルを挿入しま

す。このサブタイトルは、新しい SUBT ディレクティブが発行されるまで各ページに

出力されます。

構文

TTL title

SUBT subtitle

各パラメータには以下の意味があります。

title タイトルを指定します。

subtitle サブタイトルを指定します。

使用法

TTL ディレクティブを使用して、リスティングファイルの各ページの 上部にタイト

ルを挿入します。 初のページにタイトルを出力する場合は、ソースファイルの 1 行目に TTL ディレクティブを配置する必要があります。

タイトルを変更するには、別の TTL ディレクティブを使用します。新しい TTL ディレ

クティブの設定内容は、次のページから反映されます。

SUBT ディレクティブを使用して、リスティングファイルのページの 上部にサブタ

イトルを挿入します。サブタイトルは、タイトルの次の行に出力されます。 初のページにサブタイトルを出力する場合は、ソースファイルの 1 行目に SUBT ディレク

ティブを配置する必要があります。

サブタイトルを変更するには、別の SUBT ディレクティブを使用します。新しい SUBT ディレクティブの設定内容は、次のページから反映されます。

TTL First Title ; タ イ ト ルを

; リ ス テ ィ ン グ フ ァ イ ルの

; 1 ページ目と後続のページに挿入する

SUBT First Subtitle ; サブ タ イ ト ルを

; リ ス テ ィ ン グ フ ァ イ ルの

; 2 ページ目と後続のページに挿入する

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-62ID 011811 Non-Confidential

Page 367: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.7 命令セットと構文選択のディレクティブ

このセクションでは、以下のディレクティブについて説明します。

• 「ARM、THUMB、THUMBX、CODE16、CODE32」 (ページ 6-64)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-63ID 011811 Non-Confidential

Page 368: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.7.1 ARM、THUMB、THUMBX、CODE16、CODE32

ARM ディレクティブと CODE32 ディレクティブは同じ意味です。これらは、UAL または UAL 以前の ARM アセンブラ言語構文のいずれかを使用して、後に続く命令を ARM 命令として解釈するようアセンブラに指示します。

THUMB ディレクティブは、UAL 構文を使用して、後に続く命令を Thumb 命令として

解釈するようにアセンブラに指示します。

THUMBX ディレクティブは、UAL 構文を使用して、後に続く命令を Thumb-2EE 命令と

して解釈するようにアセンブラに指示します。

CODE16 ディレクティブは、UAL 以前のアセンブリ言語構文を使用して、後に続く命

令を Thumb 命令として解釈するようにアセンブラに指示します。

これらのディレクティブはまた、必要に応じて、ARM に関しては 大 3 バイトのパ

ディングを挿入して次のワード境界で整列させ、Thumb または Thumb-2EE に関して

は 大 1 バイトのパディングを挿入して次のハーフワード境界で整列させます。

構文

ARMTHUMBTHUMBXCODE16CODE32

使用法

異なる命令セットを使用したコードを含むファイルでは、以下のようになります。

• ARM は ARM コードの前に配置する必要があります。CODE32 は ARM と同じ意味で

す。

• THUMB は、UAL 構文で記述された Thumb コードの前に配置する必要があります。

• THUMBX は、UAL 構文で記述された Thumb-2EE コードの前に配置する必要があり

ます。

• CODE16 は、UAL 以前の構文で記述された Thumb コードの前に配置する必要があ

ります。

これらのディレクティブをアセンブルしても、命令は生成されません。また、状態が変更されるわけでもありません。これらのディレクティブは、ARM、Thumb、ま

たは Thumb-2EE の命令を適切にアセンブルするようアセンブラに指示し、必要に応

じてパディングを挿入するだけです。

この例は、ARM および THUMB を使用して、状態を切り替え、ARM 命令と Thumb 命令を

両方とも 1 つの領域でアセンブルする方法を示しています。

AREA ToThumb, CODE, READONLY ; こ の コ ー ド ブ ロ ッ ク に名前を付ける

ENTRY ; 初に実行する命令を マー クする

ARM ; 後に続 く命令は ARMstart ADR r0, into_thumb + 1 ; プ ロセ ッ サは ARM 状態で起動する

BX r0 ; Thumb 状態へのイ ン ラ イ ン切り替え

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-64ID 011811 Non-Confidential

Page 369: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

THUMB ; 後に続 く命令は Thumbinto_thumb MOVS r0, #10 ; 新しい形式の Thumb 命令

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-65ID 011811 Non-Confidential

Page 370: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8 その他のディレクティブ

このセクションでは、以下のディレクティブについて説明します。

• 「ALIAS」 (ページ 6-67)• 「ALIGN」 (ページ 6-68)• 「AREA」 (ページ 6-71)• 「ATTR」 (ページ 6-75)• 「END」 (ページ 6-77)• 「ENTRY」 (ページ 6-77)• 「EQU」 (ページ 6-78)• 「EXPORT、GLOBAL」 (ページ 6-79)• 「EXPORTAS」 (ページ 6-81)• 「GET、INCLUDE」 (ページ 6-82)• 「IMPORT、EXTERN」 (ページ 6-83)• 「INCBIN」 (ページ 6-85)• 「KEEP」 (ページ 6-86)• 「NOFP」 (ページ 6-87)• 「REQUIRE」 (ページ 6-87)• 「REQUIRE8、PRESERVE8」 (ページ 6-88)• 「ROUT」 (ページ 6-89)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-66ID 011811 Non-Confidential

Page 371: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.1 ALIAS

ALIAS ディレクティブは、シンボルのエイリアスを作成します。

構文

ALIAS name, aliasname

各パラメータには以下の意味があります。

name エイリアスを作成するシンボルの名前を指定します。

aliasname 作成されるエイリアスの名前を指定します。

使用法

シンボル name は、エイリアスを作成する前に、ソースファイル内で定義されている

必要があります。EXPORT ディレクティブによって設定された name のプロパティは、

aliasname によって継承されないので、エイリアスを現在のソースファイルの外でも

使用する場合は、aliasname に対して EXPORT を使用する必要があります。EXPORT ディレ

クティブによって設定されたプロパティ以外については、name と aliasname は同じで

す。

bazbar PROC

BX lrENDPALIAS bar,foo ; foo は bar のエ イ リ ア スEXPORT barEXPORT foo ; foo と bar のプ ロパテ ィ は同じ

; (foo が ALIAS を使っ て作成されたため)

EXPORT baz ; baz と bar は同じではない

; (baz のサイズ フ ィ ール ドが設定されていないため)

誤用例

EXPORT barIMPORT carALIAS bar,foo ; エ ラ ー - bar が未定義

ALIAS car,boo ; エ ラ ー - car が外部bar PROC

BX lrENDP

関連項目

リファレンス: • 「データ定義ディレクティブ」 (ページ 6-18)• 「EXPORT、GLOBAL」 (ページ 6-79)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-67ID 011811 Non-Confidential

Page 372: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.2 ALIGN

ALIGN ディレクティブは、ゼロ、または NOP 命令でパディングすることにより、現在

の位置を指定された境界で整列させます。

構文

ALIGN {expr{,offset{,pad{,padsize}}}}

各パラメータには以下の意味があります。

expr 20 ~ 231 の 2 の累乗を返す数値式を指定します。

offset 任意の数値式を指定できます。

pad 任意の数値式を指定できます。

padsize 1、2、または 4 を指定できます。

演算

現在の位置は、以下の形式の次の 下位アドレスで整列されます。

offset + n * expr

n は、アセンブラがパディングを 小限に抑えるために選択する任意の整数です。

expr が指定されていない場合、ALIGN によって現在の位置に次のワード(4 バイト)境

界が設定されます。以前の位置と現在の新しい位置との間にある未使用の空間は、以下で埋められます。

• pad が指定されている場合は pad のコピー

• 以下すべての条件が満たされている場合は NOP 命令

— pad は指定されていません。

— ALIGN ディレクティブは、ARM または Thumb 命令に従います。

— 現在のセクションには、AREA ディレクティブに設定された CODEALIGN 属性が

あります。

• それ以外の場合はゼロ

pad は、padsize の値に応じて、バイト、ハーフワード、またはワードとして処理され

ます。padsize が指定されていない場合、pad は、デフォルトでデータセクションのバ

イト、Thumb コードのハーフワード、ARM コードのワードになります。

使用法

ALIGN を使用して、データとコードを適切な境界で整列させます。このディレクティ

ブは、一般的に以下の状況で必要となります。

• ADR Thumb 疑似命令は、ワード境界で整列されたアドレスしかロードできませ

んが、Thumb コード内のラベルはワード境界で整列されていない場合がありま

す。ALIGN 4 を使用して、Thumb コード内のアドレスを 4 バイト境界調整で整列

させることができます。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-68ID 011811 Non-Confidential

Page 373: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

• ALIGN を使用すると、一部の ARM プロセッサに搭載されているキャッシュを利

用することができます。例えば、ARM940T には、16 バイトのラインから構成

されるキャッシュがあります。このような場合は、ALIGN 16 を使用して、関数エ

ントリを 16 バイト境界で整列させてキャッシュの効果を 大限に高めることが

できます。

• LDRD および STRD のダブルワードデータ転送命令は、8 バイト境界で整列させる

必要があります。LDRD または STRD を使用してデータにアクセスする場合は、DCQ などのメモリ割り当てディレクティブの前に ALIGN 8 を使用します。

• ラベルだけの行は任意の境界で整列されます。それに続く ARM コードはワー

ド境界で整列されます(Thumb コードはハーフワード境界で整列されます)。

そのため、このラベルではコードが正しくアドレス指定されません。このような場合は、ラベルの前に ALIGN 4 (Thumb の場合は ALIGN 2)を使用します。

境界調整は、ルーチンが配置される ELF セクションの開始位置から相対的に行われ

ます。ELF セクションは、同じ境界またはそれよりも粗い境界で整列させる必要が

あります。AREA ディレクティブの ALIGN 属性は異なる方法で指定されます。

AREA cacheable, CODE, ALIGN=3rout1 ; コ ー ド ; 8 バイ ト境界で整列

; コ ー ド

MOV pc,lr ; 4 バイ ト境界でのみ整列

ALIGN 8 ; 8 バイ ト境界で整列

rout2 ; コ ー ド

以下の例では、ALIGN ディレクティブがアセンブラに、次の命令はワード境界で整列

され、3 バイトでオフセットされることを伝えます。3 バイトのオフセットは前の

ワード境界で整列されているアドレスから計算されるので、2 番目の DCB は同じワー

ドの 後のバイトに配置され、2 バイトのパディングが追加されることになります。

AREA OffsetExample, CODE DCB 1 ; こ の例では、 2 つのバイ ト を同じ ワー ド の

ALIGN 4,3 ; 先頭バイ ト と 4 バイ ト目に配置。

DCB 1 ; 2 つ目の DCB は 1 つ目の DCB か ら 3 バイ ト のオ フ セ ッ ト

以下の例では、ALIGN ディレクティブがアセンブラに、次の命令はワード境界で整列

され、2 バイトでオフセットされることを伝えます。この例では、2 バイトのオフ

セットは次のワード境界で整列されるアドレスから計算されるので、値 n は 1 に設定

されます(n=0 が 3 つ目の DCB と競合)。この場合は、3 バイトのパディングが追加さ

れます。

AREA OffsetExample1, CODEDCB 1 ; こ の例では、 3 つ目の DCB と競合するため

DCB 1 ; n をゼロ にはできない。 アセン ブ ラ に よ っ て n は 1 に設定されるDCB 1ALIGN 4,2 ; 次の命令はワード境界で整列され、 2 でオ フ セ ッ ト される。DCB 2

次の例では、DCB ディレクティブによる PC の境界調整が不適切になります。ALIGN ディレクティブは、ラベル subroutine1 とそれに続く命令がワード境界に整列される

ようにします。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-69ID 011811 Non-Confidential

Page 374: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

AREA Example, CODE, READONLYstart LDR r6,=label1 ; コ ー ド MOV pc,lrlabel1 DCB 1 ; PC の境界調整が不適切

ALIGN ; subroutine1 にsubroutine1 ; 次の命令を参照させる MOV r5,#0x5

関連項目

リファレンス: • 「データ定義ディレクティブ」 (ページ 6-18)• 「AREA」 (ページ 6-71)• 「例」 (ページ 6-69)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-70ID 011811 Non-Confidential

Page 375: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.3 AREA

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 ディレクティブの指定方法とは異なりま

す。

注 ARM コードセクションには ALIGN=0 または ALIGN=1 を使

用しないで下さい。

Thumb コードセクションには ALIGN=0 を使用しないで下

さい。

ASSOC=section

section には、関連する ELF セクションを指定します。

sectionname は、section を含むすべてのリンクに含まれて

いる必要があります。

CODE マシン命令を保持します。READONLY がデフォルトです。

CODEALIGN

ALIGN ディレクティブが異なるパディングを指定しない

限り、セクション内の ALIGN ディレクティブが ARM または Thumb 命令後に使用される際に、アセンブラに

よって NOP 命令が挿入されます。

COMDEF 共通セクションの定義です。この ELF セクションは、

コードまたはデータを保持できます。このセクションは、他のソースファイル内にある同じ名前の付いた他のセクションと同じである必要があります。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-71ID 011811 Non-Confidential

Page 376: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

同じ名前の付いた同一の ELF セクションは、リンカに

よって同じメモリセクションにオーバーレイされます。これらのセクションが異なっていると、リンカによって警告メッセージが生成され、セクションのオーバーレイは行われません。

COMGROUP=symbol_name

名前付きの ELF セクショングループの AREA の部分とな

る署名を指定します。詳細については、GROUP=symbol_name を参照して下さい。COMGROUP 属性は、

ELF セクショングループを GRP_COMDAT フラグでマークし

ます。

COMMON 共通データセクションです。このセクション内ではコー

ドまたはデータは定義できません。このセクションは、リンカによってゼロに初期化されます。同じ名前の付いたすべての共通セクションは、リンカによって同じメモリセクションにオーバーレイされます。すべてのセクションが同じサイズである必要はありません。リンカは、同じ名前の付いたセクションのうち も大きな共通セクションに必要とされるだけの空間を割り当てます。

DATA 命令ではなくデータを保持します。READWRITE がデフォル

トです。

FINI_ARRAY

現在の領域の ELF 型を SHT_FINI_ARRAY に設定します。

GROUP=symbol_name

名前付きの ELF セクショングループの AREA の部分とな

る署名を指定します。ソースファイル、またはソースファイルによってインクルードされるファイルによって定義される必要があります。同じ symbol_name 署名のす

べての AREAS は、同じグループの部分になります。グ

ループ内のセクションは、一緒に保持または破棄されます。

INIT_ARRAY

現在の領域の ELF 型を SHT_INIT_ARRAY に設定します。

LINKORDER=section

イメージ内での現在のセクションの相対的な位置を指定します。その結果、LINKORDER 属性を備えるセクションす

べての順序が、互いに関してイメージ内で対応する名前付き sections の順序と同じになります。

MERGE=n リンカが現在のセクションを MERGE=n 属性を備えた他の

セクションとマージできることを示します。n はセク

ション内の要素のサイズです。例えば、文字の場合には n は 1 です。この属性があってもリンカはセクションの

マージを強制されないので、必ずしもセクションがマージされるとは限りません。

NOALLOC ターゲットシステム上のメモリがこのエリアに割り当て

られないことを示します。

NOINIT データセクションが初期化されていないか、またはゼロ

に初期化されていることを示します。この属性に含まれるのは、空間予約ディレクティブ SPACE か、初期値がゼ

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-72ID 011811 Non-Confidential

Page 377: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

ロに設定された DCB、DCD、DCDU、DCQ、DCQU、DCW、または DCWU ディレクティブだけです。エリアを初期化しない

か、またはゼロで初期化するかはリンク時に決めることができます。

PREINIT_ARRAY

現在の領域の ELF 型を SHT_PREINIT_ARRAY に設定します。

READONLY このセクションへの書き込みが禁止されていることを示

します。コードエリアの場合はこれがデフォルトです。

READWRITE このセクションに対する読み出しと書き込みが可能なこ

とを示します。データエリアの場合はこれがデフォルトです。

SECFLAGS=n

現在のセクションに ELF フラグを 1 つ以上(n で指定さ

れます)追加します。

SECTYPE=n

現在のセクションの ELF 型を n に設定します。

STRINGS 現在のセクションに SHF_STRINGS フラグを追加します。

STRINGS 属性を使用するには、MERGE=1 属性も使用する必

要があります。セクションのコンテンツは、DCB ディレ

クティブを使用して NULL で終わる文字列である必要が

あります。

使用法

AREA ディレクティブを使用して、ソースファイルを複数の ELF セクションに分割し

ます。複数の AREA ディレクティブで同じ名前を使用できます。同じ名前の付いたエ

リアはすべて、同じ ELF セクションに配置されます。特定の名前の付いた 初の AREA ディレクティブの属性だけが適用されます。

通常、コードとデータには別々の ELF セクションを使用する必要があります。ただ

し、コードセクションにはデータを配置することができます。大きなプログラムは、扱いやすいように複数のコードセクションに分割できます。また、大きな独立データセットも別々のセクションに配置するのが適切です。

ローカルラベルの有効範囲は、AREA ディレクティブによって定義され、必要に応じて ROUT ディレクティブによって分割されます。

アセンブリには少なくとも 1 つの AREA ディレクティブが必要です。

注 ディレクティブが PC 相対の式を使用していて、PREINIT_ARRAY、FINI_ARRAY、または INIT_ARRAY ELF セクション内にある場合、アセンブラは DCD および DCDU ディレクティ

ブの R_ARM_TARGET1 再配置を生成します。各 DCD または DCDU ディレクティブの後で RELOC ディレクティブを使用して、再配置をオーバーライドできます。この再配置を

使用する場合、読み出し / 書き込みセクションは、プラットフォーム ABI が許可す

れば、リンク時に読み出し専用セクションになります。

以下の例では、Example という名前の読み出し専用のコードセクションを定義します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-73ID 011811 Non-Confidential

Page 378: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

AREA Example,CODE,READONLY ; コ ー ドセ ク シ ョ ンの例

; コ ー ド

関連項目

概念:

『アセンブラの使用』:

• 「ELF セクションと AREA ディレクティブ」 (ページ 4-5)

概念:

『リンカの使用』:

• 第 4 章 イメージの構造と生成

リファレンス: • 「ALIGN」 (ページ 6-68)• 「RELOC」 (ページ 6-10)• 「DCD、DCDU」 (ページ 6-24)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-74ID 011811 Non-Confidential

Page 379: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.4 ATTR

ATTR ディレクティブセットは、ABI ビルド属性の値を設定します。

ATTR スコープディレクティブは、設定値の適用先の有効範囲を指定します。

構文

ATTR FILESCOPE

ATTR SCOPE name

ATTR settype tagid, value

各パラメータには以下の意味があります。

name セクション名またはシンボル名を指定します。

settype 次のいずれかを指定できます。

• SETVALUE

• SETSTRING

• SETCOMPATIBLEWITHVALUE

• SETCOMPATIBLEWITHSTRING

tagid 属性タグ名(またはその数値)を指定します。これは、ARM アーキテ

クチャの ABI で定義されます。

value settype に依存します。

• 32 ビット整数値(settype が SETVALUE または SETCOMPATIBLEWITHVALUE の場合)

• NULL 終端文字列(settype が SETSTRING または SETCOMPATIBLEWITHSTRING の場合)

使用法

ATTR FILESCOPE ディレクティブに続く ATTR 設定ディレクティブは、オブジェクトファ

イル全体に適用されます。ATTR SCOPE name ディレクティブに続く ATTR 設定ディレク

ティブは、名前付きセクションまたはシンボルだけに適用されます。

整数が必要なタグの場合、SETVALUE または SETCOMPATIBLEWITHVALUE を使用する必要があ

ります。文字列が来ることになっているタグの場合、SETSTRING または SETCOMPATIBLEWITHSTRING を使用する必要があります。

SETCOMPATIBLEWITHVALUE と SETCOMPATIBLEWITHSTRING を使用して、オブジェクトファイル

も互換性を備えるタグ値を設定します。

ATTR SETSTRING Tag_CPU_raw_name, "Cortex-A8"ATTR SETVALUE Tag_VFP_arch, 3 ; VFPv3 命令は使用可能

ATTR SETVALUE 10, 3 ; 10 は; Tag_VFP_arch の数値

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-75ID 011811 Non-Confidential

Page 380: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

関連項目

リファレンス

• 『Addenda to, and Errata in, the ABI for the ARM Architecture』, http://infocenter.arm.com/help/topic/com.arm.doc.ihi0045-/index.html

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-76ID 011811 Non-Confidential

Page 381: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.5 END

END ディレクティブは、ソースファイルの終わりに到達したことをアセンブラに通知

します。

構文

END

使用法

すべてのアセンブリ言語のソースファイルは、END ディレクティブが単独で記述され

た行で終了する必要があります。

GET ディレクティブによってソースファイルがペアレントファイルにインクルードさ

れている場合、アセンブラはペアレントファイルに戻り、GET ディレクティブの次の

行からアセンブルを継続します。

トップレベルのソースファイル内で、エラーが発生することなく第 1 パスで END に到

達すると、第 2 パスが開始されます。

トップレベルのソースファイル内で、第 2 パスで END に到達すると、アセンブラはア

センブリを終了して適切な出力を行います。

関連項目

リファレンス: • 「GET、INCLUDE」 (ページ 6-82)

6.8.6 ENTRY

ENTRY ディレクティブは、プログラムへのエントリポイントを宣言します。

構文

ENTRY

使用法

プログラムには少なくとも 1 つの ENTRY ポイントを指定する必要があります。ENTRY が存在しない場合は、リンク時に警告メッセージが生成されます。

1 つのソースファイル内で複数の ENTRY ディレクティブを使用することはできません。

また、すべてのソースファイル内に ENTRY ディレクティブを指定する必要があるわけ

ではありません。1 つのソースファイル内に複数の ENTRY が存在すると、アセンブリ

時にエラーメッセージが生成されます。

AREA ARMex, CODE, READONLY ENTRY ; ア プ リ ケーシ ョ ンのエ ン ト リ ポ イ ン ト

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-77ID 011811 Non-Confidential

Page 382: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.7 EQU

EQU ディレクティブは、数値定数、レジスタ相対値、または PC 相対値にシンボル名

を割り当てます。* は EQU と同じ意味です。

構文

name EQU expr{, type}

各パラメータには以下の意味があります。

name 値に割り当てるシンボル名を指定します。

expr レジスタ相対アドレス、PC 相対アドレス、絶対アドレス、または 32 ビット整数定数のいずれかを指定します。

type オプションです。type には、以下のいずれかを指定できます。

• ARM

• THUMB

• CODE32

• CODE16

• DATA

type は、expr が絶対アドレスの場合にのみ使用できます。name がエクス

ポートされる場合、オブジェクトファイル内のシンボルテーブルに含まれる name エントリは、type に指定されている値に基づいて ARM、THUMB、

CODE32、CODE16、または DATA のいずれかとしてマークされます。この情報

はリンカによって使用されます。

使用法

EQU を使用して定数を定義します。これは、C 言語で #define を使用して定数を定義す

る方法と似ています。

abc EQU 2 ; 値 2 をシンボル abc に割り当てる。

xyz EQU label+8 ; ア ド レ ス (label+8) を

; シンボル xyz に割り当てる。

fiq EQU 0x1C, CODE32 ; 絶対ア ド レ ス 0x1C を ; シンボル fiq に割り当て、 コ ー ド と し て マー クする。

関連項目

リファレンス: • 「KEEP」 (ページ 6-86)• 「EXPORT、GLOBAL」 (ページ 6-79)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-78ID 011811 Non-Confidential

Page 383: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.8 EXPORT、GLOBAL

EXPORT ディレクティブは、個別のオブジェクトファイルとライブラリファイルに含ま

れるシンボルへの参照を解決するためにリンカが使用できるシンボルを宣言します。GLOBAL は EXPORT と同じ意味です。

構文

EXPORT {[WEAK]}

EXPORT symbol {[SIZE=n]}

EXPORT symbol {[type{,set}]}

EXPORT symbol [attr{,type{,set}}{,SIZE=n}]

EXPORT symbol [WEAK{,attr}{,type{,set}}{,SIZE=n}]

各パラメータには以下の意味があります。

symbol エクスポートするシンボル名を指定します。シンボル名では大文字と小

文字が区別されます。symbol が省略されている場合は、すべてのシンボ

ルがエクスポートされます。

WEAK 他のソースによって別の symbol がエクスポートされない場合にのみ、

symbol は他のソースにインポートされます。symbol を指定せずに [WEAK] を指定すると、エクスポートされるすべてのシンボルが WEAK になり

ます。

attr 次のいずれかを指定できます。

DYNAMIC ELF シンボルの可視性を STV_DEFAULT に設定します。

PROTECTED ELF シンボルの可視性を STV_PROTECTED に設定します。

HIDDEN ELF シンボルの可視性を STV_HIDDEN に設定します。

INTERNAL ELF シンボルの可視性を STV_INTERNAL に設定します。

type シンボル型を指定します。

DATA ソースがアセンブルされリンクされると、symbol はデータとし

て扱われます。

CODE ソースがアセンブルされリンクされると、symbol はコードとし

て扱われます。

ELFTYPE=n n の値に従って、symbol は特定の ELF シンボルとして扱われま

す。ただし、n は 0 ~ 15 の任意の値を取ります。

指定されない場合、アセンブラは 適な type を選択します。通常はアセ

ンブラによって適切な型が選択されるので、type を指定する必要はあり

ません。

set 命令セットを指定します。

ARM symbol は ARM シンボルとして処理されます。

THUMB symbol は Thumb シンボルとして処理されます。

指定されない場合、アセンブラは 適なセットを選択します。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-79ID 011811 Non-Confidential

Page 384: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

n 32 ビット値でサイズを指定します。SIZE 属性が指定されていない場合、

アセンブラはサイズを次のように計算します。

• PROC および FUNCTION シンボルの場合、サイズは ENDP または ENDFUNC までのコードのサイズに設定されます。

• その他のシンボルの場合、サイズは同じソース行の命令またはデータのサイズになります。命令またはデータがない場合、サイズはゼロです。

使用法

EXPORT を使用して、他のファイルのコードが現在のファイルのシンボルにアクセスで

きるようにします。

[WEAK] 属性を使用して、symbol の別のインスタンスが別のソースに存在する場合は、

そのインスタンスがこのインスタンスに優先されることをリンカに通知します。[WEAK] 属性は、任意のシンボル可視性属性と共に使用できます。

AREA Example,CODE,READONLY EXPORT DoAdd ; 外部モジ ュ ールで

; 使用される

; 関数名を エ ク スポー トするDoAdd ADD r0,r0,r1

エクスポートが重複する場合、シンボル可視性はオーバーライドされることがあります。以下の例では、 後の EXPORT のバインドと可視性が優先されます。

EXPORT SymA[WEAK] ; 非表示の weak シンボル と し て エ ク スポー トする

EXPORT SymA[DYNAMIC] ; SymA はダ イ ナ ミ ッ ク な非 weak シンボルになる

以下に、SIZE 属性の使用例を示します。

EXPORT symA [SIZE=4]EXPORT symA [DATA, SIZE=4]

関連項目

リファレンス: • 「IMPORT、EXTERN」 (ページ 6-83).

• ELF for the ARM Architecture ABI, http://infocenter/help/topic/com.arm.doc.ihi0044-/index.html

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-80ID 011811 Non-Confidential

Page 385: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.9 EXPORTAS

EXPORTAS ディレクティブを使用すると、ソースファイル内の別のシンボルに対応する

シンボルをオブジェクトファイルにエクスポートできます。

構文

EXPORTAS symbol1, symbol2

各パラメータには以下の意味があります。

symbol1 ソースファイル内のシンボルの名前を指定します。symbol1 は事前に定義

されている必要があります。この名前には、エリア名、ラベル、または定数を含むシンボルを指定できます。

symbol2 オブジェクトファイルで使用するシンボルの名前を指定します。

シンボル名では大文字と小文字が区別されます。

使用法

EXPORTAS を使用すると、ソースファイル内の各インスタンスを変更することなく、オ

ブジェクトファイル内のシンボルを変更することができます。

AREA data1, DATA ; 新しい領域 data1 を開始する

AREA data2, DATA ; 新しい領域 data2 を開始する

EXPORTAS data2, data1 ; data2 と い う セ ク シ ョ ンシンボルは、

; オ ブジ ェ ク ト フ ァ イ ルのス ト リ ン グ テーブルに data1 と し て表示されるone EQU 2 EXPORTAS one, two EXPORT one ; シンボル "two" は、

; オ ブジ ェ ク ト フ ァ イ ルのシンボルテーブルに値 2 のシンボル と し て表示され

関連項目

リファレンス: • 「EXPORT、GLOBAL」 (ページ 6-79)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-81ID 011811 Non-Confidential

Page 386: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.10 GET、INCLUDE

GET ディレクティブは、アセンブル中のファイル内に別のファイルをインクルードし

ます。インクルードされるファイルは、GET ディレクティブの位置でアセンブルされ

ます。INCLUDE は GET と同じ意味です。

構文

GET filename

各パラメータには以下の意味があります。

filename アセンブリ時にインクルードされるファイルの名前を指定します。アセ

ンブラは UNIX 形式または MS-DOS 形式のパス名を認識します。

使用法

GET は、アセンブリ時にマクロ定義、EQU、および記憶域マップをインクルードするの

に便利です。インクルードされたファイルのアセンブルが完了すると、アセンブラは GET ディレクティブの次の行からアセンブルを継続します。

デフォルトでは、アセンブラは、現在の場所でインクルードされるファイルを検索します。現在の場所とは、呼び出し元のファイルが存在するディレクトリを指します。検索パスにディレクトリを追加するには、アセンブラの -i コマンドラインオプ

ションを使用します。スペースを含むファイル名およびディレクトリ名を二重引用符(" ")で囲まないで下さい。

インクルードされるファイル内で別の GET ディレクティブを使用して、他のファイル

をインクルードできます。

インクルードされるファイルが現在の場所とは異なるディレクトリにある場合は、インクルードされるファイルの終わりまで、そのディレクトリが現在の場所となります。その後、前の場所が復元されます。

GET を使用してオブジェクトファイルをインクルードすることはできません。

AREA Example, CODE, READONLY GET file1.s ; file1 が現在の場所にある場合に

; イ ン ク ルー ドする

GET c:\project\file2.s ; file2 を イ ン ク ルー ドする

GET c:\Program files\file3.s ; スペースは使用可能

関連項目

リファレンス: • 「INCBIN」 (ページ 6-85)• 「ネスティングディレクティブ」 (ページ 6-33)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-82ID 011811 Non-Confidential

Page 387: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.11 IMPORT、EXTERN

これらのディレクティブは、現在のアセンブリに定義されていない名前をアセンブラに渡します。

構文

directive symbol {[SIZE=n]}

directive symbol {[type]}

directive symbol [attr{,type}{,SIZE=n}]

directive symbol [WEAK{,attr}{,type}{,SIZE=n}]

各パラメータには以下の意味があります。

directive 次のいずれかを指定できます。

IMPORT シンボルを無条件にインポートします。

EXTERN シンボルが現在のアセンブリで参照される場合にのみ、イン

ポートします。

symbol 別々にアセンブルされたソースファイル、オブジェクトファイル、また

はライブラリ内で定義されているシンボルの名前を指定します。シンボル名では大文字と小文字が区別されます。

WEAK シンボルがどこにも定義されていない場合に、リンカによってエラー

メッセージが生成されるのを回避します。また、このオプションを指定すると、リンカはインクルードされていないライブラリの検索も行いません。

attr 次のいずれかを指定できます。

DYNAMIC ELF シンボルの可視性を STV_DEFAULT に設定します。

PROTECTED ELF シンボルの可視性を STV_PROTECTED に設定します。

HIDDEN ELF シンボルの可視性を STV_HIDDEN に設定します。

INTERNAL ELF シンボルの可視性を STV_INTERNAL に設定します。

type シンボル型を指定します。

DATA ソースがアセンブルされリンクされると、symbol はデータとし

て扱われます。

CODE ソースがアセンブルされリンクされると、symbol はコードとし

て扱われます。

ELFTYPE=n n の値に従って、symbol は特定の ELF シンボルとして扱われま

す。ただし、n は 0 ~ 15 の任意の値を取ります。

指定されない場合、リンカは 適な型を選択します。

n 32 ビット値でサイズを指定します。SIZE 属性が指定されていない場合、

アセンブラはサイズを次のように計算します。

• PROC および FUNCTION シンボルの場合、サイズは ENDP または ENDFUNC までのコードのサイズに設定されます。

• その他のシンボルの場合、サイズは同じソース行の命令またはデータのサイズになります。命令またはデータがない場合、サイズはゼロです。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-83ID 011811 Non-Confidential

Page 388: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

使用法

別のオブジェクトファイル内で定義されたシンボルへのリンク時に、シンボル名が解決されます。このシンボルはプログラムのアドレスとして処理されます。[WEAK] が指定されていない場合、対応するシンボルがリンク時に検出されないと、リンカによってエラーが生成されます。

[WEAK] が指定されており、対応するシンボルがリンク時に検出されない場合は、以下

のようになります。

• 参照が B 命令または BL 命令のデスティネーションである場合、シンボルの値が

次の命令のアドレスとして使用されます。したがって、この B 命令または BL 命令は NOP となります。

• それ以外の場合、シンボルの値はゼロと見なされます。

この例では、C++ ライブラリがリンクされていて、演算結果に基づいて条件分岐が

発生するかどうかを確認しています。

AREA Example, CODE, READONLY EXTERN __CPP_INITIALIZE[WEAK] ; C++ ラ イ ブ ラ リ が リ ン ク されている場合、

; __CPP_INITIALIZE 関数のア ド レ ス を取得する

LDR r0,=__CPP_INITIALIZE ; リ ン ク されていない場合、 ア ド レ スはゼロ になる

CMP r0,#0 ; ゼロかど う かを確認する

BEQ nocplusplus ; 演算結果に基づいて分岐する

以下に、SIZE 属性の使用例を示します。

EXTERN symA [SIZE=4]EXTERN symA [DATA, SIZE=4]

関連項目

参照

• ELF for the ARM Architecture, http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044-/index.html

• 「EXPORT、GLOBAL」 (ページ 6-79)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-84ID 011811 Non-Confidential

Page 389: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.12 INCBIN

INCBIN ディレクティブは、アセンブル中のファイル内に別のファイルをインクルード

します。このファイルはアセンブルされずにそのままインクルードされます。

構文

INCBIN filename

各パラメータには以下の意味があります。

filename アセンブリ時にインクルードされるファイルの名前を指定します。アセ

ンブラは UNIX 形式または MS-DOS 形式のパス名を認識します。

使用法

INCBIN を使用して、実行可能ファイル、リテラル、または任意のデータをインクルー

ドできます。ファイルの内容は、解釈されることなく、現在の ELF セクションにバ

イト単位で追加されます。アセンブルは、INCBIN ディレクティブの次の行から継続さ

れます。

デフォルトでは、アセンブラは、現在の場所でインクルードされるファイルを検索します。現在の場所とは、呼び出し元のファイルが存在するディレクトリを指します。検索パスにディレクトリを追加するには、アセンブラの -i コマンドラインオプ

ションを使用します。スペースを含むファイル名およびディレクトリ名を二重引用符(" ")で囲まないで下さい。

AREA Example, CODE, READONLY INCBIN file1.dat ; file1 が ; 現在の場所にある場合に

; イ ン ク ルー ドする

INCBIN c:\project\file2.txt ; file2 を イ ン ク ルー ドする

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-85ID 011811 Non-Confidential

Page 390: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.13 KEEP

KEEP ディレクティブは、オブジェクトファイル内のシンボルテーブルにローカルシ

ンボルを保持しておくようアセンブラに指示します。

構文

KEEP {symbol}

各パラメータには以下の意味があります。

symbol 保持するローカルシンボルの名前を指定します。symbol が指定されてい

ない場合は、レジスタ相対シンボルを除くすべてのローカルシンボルが保持されます。

使用法

デフォルトでは、アセンブラによって出力されるオブジェクトファイル内に記述されるシンボルは以下のシンボルのみです。

• エクスポートされるシンボル

• 再配置されるシンボル

KEEP を使用して、デバッグに使用できるローカルシンボルを保持します。保持され

たシンボルは、ARM デバッガおよびリンカマップファイルに出力されます。

KEEP では、レジスタ相対シンボルを保持できません。

label ADC r2,r3,r4 KEEP label ; ラ ベルをデバ ッ ガで使用でき る よ う にする ADD r2,r2,r5

関連項目

リファレンス: • 「MAP」 (ページ 6-20)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-86ID 011811 Non-Confidential

Page 391: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.14 NOFP

NOFP ディレクティブは、アセンブリ言語ソースファイル内の浮動小数点命令を禁止

します。

構文

NOFP

使用法

NOFP を使用して、ソフトウェアまたはターゲットハードウェアで浮動小数点命令が

サポートされていない場合などに、浮動小数点命令が使用されることを防ぎます。

NOFP ディレクティブより後に浮動小数点命令が出現すると、" 不明なオペ コ ー ド " エラー

が生成され、アセンブルに失敗します。

浮動小数点命令より後に NOFP ディレクティブが検出されると、アセンブラによって

以下のエラーが生成されます。

浮動小数点数命令を禁止するには遅すぎます

アセンブルに失敗します。

6.8.15 REQUIRE

REQUIRE ディレクティブは、セクション間の依存関係を指定します。

構文

REQUIRE label

各パラメータには以下の意味があります。

label 必要なラベルの名前を指定します。

使用法

REQUIRE を使用すると、関連するセクションが直接呼び出されない場合でも、そのセ

クションをインクルードすることができます。REQUIRE ディレクティブを含むセク

ションがリンクにインクルードされる場合、リンカは、指定されたラベルの定義を含むセクションもインクルードします。

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-87ID 011811 Non-Confidential

Page 392: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

6.8.16 REQUIRE8、PRESERVE8

REQUIRE8 ディレクティブは、現在のファイルに 8 バイト境界で境界調整されたスタッ

クが必要であることを指定します。このディレクティブは、このことをリンカに通知するために REQ8 ビルド属性を設定します。

PRESERVE8 ディレクティブは、現在のファイルが 8 バイト境界で境界調整されたス

タックを保持していることを指定します。このディレクティブは、このことをリンカに通知するために PRES8 ビルド属性を設定します。

リンカは、8 バイト境界で境界調整されたスタックを必要とするコードが、8 バイト

境界で境界調整されたスタックを保持するコードによってのみ直接的または間接的に呼び出されることをチェックします。

構文

REQUIRE8 {bool}

PRESERVE8 {bool}

各パラメータには以下の意味があります。

bool 任意でブール定数({TRUE} または {FALSE})を指定します。

使用法

8 バイト境界で境界調整されたスタックをコードで保持する場合は、必要に応じて、

PRESERVE8 を使用してファイルに PRES8 ビルド属性を設定します。8 バイト境界で境

界調整されたスタックをコードで保持しない場合は、PRESERVE8 {FALSE} を使用して PRES8 ビルド属性が設定されないようにします。ファイル内に複数の REQUIRE8 ディ

レクティブまたは PRESERVE8 ディレクティブがある場合、アセンブラは 後のディレ

クティブの値を使用します。

注 PRESERVE8 と PRESERVE8 {FALSE} の両方を省略すると、アセンブラは、SP を変更する命

令を調べて、PRES8 ビルド属性を設定するかどうかを決定します。PRESERVE8 は明示

的に指定することを推奨します。

以下のように警告メッセージをイネーブルできます。

armasm --diag_warning 1546

警告メッセージをイネーブルすると、以下のような警告メッセージが表示されます。

"test.s"、 ラ イ ン 37 : 警告 : A1546W : ス タ ッ ク ポ イ ン タ の更新によ っ て、

8 バイ ト のス タ ッ ク のア ラ イ メ ン トが分断される可能性があ り ます 37 00000044 STMFD sp!,{r2,r3,lr}

REQUIRE8REQUIRE8 {TRUE} ; REQUIRE8 と等価

REQUIRE8 {FALSE} ; REQUIRE8 が指定されていない場合と等価

PRESERVE8 {TRUE} ; PRESERVE8 と等価

PRESERVE8 {FALSE} ; PRESERVE8 が指定されていない場合と完全に等価ではない

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-88ID 011811 Non-Confidential

Page 393: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

ディレクティブリファレンス

関連項目

概念: • 8 バイト境界のスタック整列 , http://infocenter.arm.com/help/topic/com.arm.doc.faqs/ka4127.html

リファレンス: • 「アセンブラコマンドラインオプション」 (ページ 2-3)

6.8.17 ROUT

ROUT ディレクティブは、ローカルラベルの有効範囲の境界をマークします。

構文

{name} ROUT

各パラメータには以下の意味があります。

name 有効範囲に割り当てる名前を指定します。

使用法

ROUT ディレクティブを使用して、ローカルラベルの有効範囲を制限します。これに

より、誤って違うラベルが参照されるのを簡単に防ぐことができます。ローカルラベルの有効範囲内に ROUT ディレクティブが存在しない場合は、ローカルラベルの有

効範囲はエリア全体となります。

正しいローカルラベルへの参照が行われるようにするには、name オプションを使用し

ます。ラベルの名前またはラベルへの参照が、その前の ROUT ディレクティブに指定

されている名前と一致しない場合は、アセンブラによってエラーメッセージが生成され、アセンブルに失敗します。

; コ ー ド

routineA ROUT ; ROUT は必ずし もルーチ ンではない

; コ ー ド

3routineA ; コ ー ド ; こ の ラ ベルがチ ェ ッ ク される

; コ ー ド

BEQ %4routineA ; こ の参照がチ ェ ッ ク される

; コ ー ド

BGE %3 ; 上の 3 を参照するが、 チ ェ ッ ク されない

; コ ー ド

4routineA ; コ ー ド ; こ の ラ ベルがチ ェ ッ ク される

; コ ー ド

otherstuff ROUT ; 次の有効範囲の開始位置

関連項目

概念:

『アセンブラの使用』:

• 「ローカルラベル」 (ページ 8-12)

リファレンス: • 「AREA」 (ページ 6-71)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. 6-89ID 011811 Non-Confidential

Page 394: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

付録 A アセンブラリファレンス』に対する改訂

『アセンブラリファレンス』に対して、以下の技術的変更が加えられました。

表 A-1 発行 A と 発行 B の相違点

変更点 関連するトピック

--cpu=name の説明を更新しました。 「--cpu=name」 (ページ 2-9)

オプション --execstack を追加しました。 「--execstack」 (ページ 2-13)

オプション --no_execstack を追加しました。 「--no_execstack」 (ページ 2-20)

オプション --fpmode=none を追加しました。 「--fpmode=model」 (ページ 2-14)

--show_cmdline の説明を更新しました。 「--show_cmdline」 (ページ 2-25)

ARMv7E-M 用に命令の概要の表と脚注を更新しま

した。

「命令の概要」 (ページ 3-2)

命令の概要の表と、命令の説明のアーキテクチャのセクションで、ARMv6-M、ARMv7-M、ARMv7-R、および ARMv7-A に言及する場合の "プロファイル " を " アーキテクチャ " に置換しました。

「命令の概要」 (ページ 3-2)

Operand2 の説明で、レジスタ制御シフトについて言

及しました。

「シフトが任意に実行されるレジスタとしての Operand2」 (ページ 3-52)

ADR(PC 相対)に対するレジスタの制約条件を追加

しました。

「ADR(PC 相対)」 (ページ 3-29)

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. A-1ID 011811 Non-Confidential

Page 395: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

『アセンブラリファレンス』に対する改訂

LDR および STR(イミディエートオフセット)で、レ

ジスタの制約条件と非推奨情報を追加しました。

「LDR と STR (イミディエートオフセット)」 (ペー

ジ 3-15)

LDR および STR(レジスタオフセット)で、ARM 独自の命令構文を特定しました。

「LDR と STR (レジスタオフセット)」 (ペー

ジ 3-18)

LDR および STR(レジスタオフセット)で、レジスタ

の制約条件と非推奨情報、SP の使用、および PC の使用を追加しました。

「LDR と STR (レジスタオフセット)」 (ペー

ジ 3-18)

PC 相対 STR が利用可能ではあるものの、非推奨であ

ることを注記しました。

「LDR(PC 相対)」 (ページ 3-23)

LDR(PC 相対)で、非推奨と SP の使用についての情

報を追加しました。

「LDR(PC 相対)」 (ページ 3-23)

ARM 命令の reglist の制約条件で、ARM LDM の PC と LR の両方を含む reglist は非推奨であることを追加

しました。

「LDM、STM」 (ページ 3-35)

ARM 命令の reglist に関する制約条件を追加しまし

た。

「PUSH および POP」 (ページ 3-38)

Rn のレジスタの制約条件を追加し、このセクション

に "Rm に PC は指定できない " という記述を移動しま

した。

「PLD、PLDW、PLI」 (ページ 3-33)

LDM および STM での reglist に関する制約条件を追加し

ました。

「LDM、STM」 (ページ 3-35)

構文内の各レジスタに "PC は指定できない " という

記述を追加しました。

「SWP と SWPB」 (ページ 3-49)

「ARM 命令での PC の使用」から SUBS pc, lr へのリ

ンクを追加しました。

「ADD、SUB、RSB、ADC、SBC、RSC」 (ペー

ジ 3-56)

ユーザモードまたはシステムモードで PC を Rd とし

て使用する場合の S 接尾文字の使用に対する注意を

削除しました。

「ADD、SUB、RSB、ADC、SBC、RSC」 (ペー

ジ 3-56)

PC を使用する非推奨の命令について言及しました。 「ADD、SUB、RSB、ADC、SBC、RSC」 (ペー

ジ 3-56)

ARM コードだけにある構文を追加し、構文の追加

の項目について説明しました。

「SUBS PC、lr」 (ページ 3-60)

ARM と Thumb での SUBS 命令の有効な形式を記述

し、これらの命令をユーザモードまたはシステムモードで使用しないようにという注意を追加しました。

「SUBS PC、lr」 (ページ 3-60)

「ARM 命令での PC の使用」および「関連項目」セ

クションから SUBS pc, lr へのリンクを追加しまし

た。

「AND、ORR、EOR、BIC、ORN」 (ページ 3-62)

表 A-1 発行 A と 発行 B の相違点 (続き)

変更点 関連するトピック

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. A-2ID 011811 Non-Confidential

Page 396: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

『アセンブラリファレンス』に対する改訂

ユーザモードまたはシステムモードで PC を Rd とし

て使用する場合の S 接尾文字の使用に対する注意を

削除しました。

「AND、ORR、EOR、BIC、ORN」 (ページ 3-62)

Rn にライトバックする命令で Rn を PC にすることは

できないことを伝える「レジスタの制約条件」セクションを追加しました。

「LDC、LDC2、STC、STC2」 (ページ 3-140)

Rt を PC にすることはできないことに言及しました。 「MCR、MCR2、MCRR、MCRR2」 (ページ 3-134)

Rm を PC にすることはできないことに言及しました。 「MSR」 (ページ 3-147)

「ARM 命令での PC の使用」から SUBS pc, lr へのリ

ンクを追加しました。

「MOV、MVN」 (ページ 3-68)

ユーザモードまたはシステムモードで PC を Rd とし

て使用する場合の S 接尾文字の使用に対する注意を

削除しました。

「MOV、MVN」 (ページ 3-68)

PC を使用する非推奨の命令について言及しました。 「MOV、MVN」 (ページ 3-68)

SP は、Thumb の TST および TEQ 命令で使用できず、

ARM の TST および TEQ 命令では非推奨であることに

言及しました。

「TST、TEQ」 (ページ 3-72)

ARMv7E-M では SEL を利用できることを追記しまし

た。

「SEL」 (ページ 3-74)

ARMv6 より前では、MUL および MLA で Rn は Rd とは異

なる必要があることを追記しました。

「MUL、MLA、MLS」 (ページ 3-83)

ARMv6 より前では、Rn は RdLo および RdHi とは異な

る必要があることを追記しました。

「UMULL、UMLAL、SMULL、SMLAL」 (ペー

ジ 3-85)

ARMv7E-M では Thumb 命令が利用できることを追

記しました。

• 「SMULxy、SMLAxy」 (ページ 3-87)• 「SMULWy、SMLAWy」 (ページ 3-89)• 「SMLALxy」 (ページ 3-90)• 「SMUAD{X}、SMUSD{X}」 (ページ 3-92)• 「SMMUL、SMMLA、SMMLS」 (ページ 3-94)• 「SMLAD、SMLSD」 (ページ 3-96)• 「SMLALD、SMLSLD」 (ページ 3-98)• 「UMAAL」 (ページ 3-100)• 「QADD、QSUB、QDADD、QDSUB」 (ペー

ジ 3-104)• 「並列加算と並列減算」 (ページ 3-109)• 「USAD8、USADA8」 (ページ 3-112)• 「SSAT16、USAT16」 (ページ 3-114)• 「SXT、SXTA、UXT、UXTA」 (ページ 3-119)• 「PKHBT、PKHTB」 (ページ 3-121)

表 A-1 発行 A と 発行 B の相違点 (続き)

変更点 関連するトピック

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. A-3ID 011811 Non-Confidential

Page 397: ARM コンパイラツールチェーン アセンブラリファレ …infocenter.arm.com/help/topic/com.arm.doc.dui0489bj/DUI...2012/02/02 · ARM ® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

『アセンブラリファレンス』に対する改訂

ARM では ARMv6K 以降、Thumb では ARMv6T2 以降で DBG を使用できることに言及しました。また、

ARMv6K および ARMv6T2 では DBG が NOP として実

行されることにも言及しました。

「DBG」 (ページ 3-155)

VSLI および VSRI の演算に関する図 4-4 と 4-5 を追加

しました。

「VSLI および VSRI」 (ページ 4-42)

VUZP および VZIP の演算の前後のレジスタ状態を示す

表を追加しました。

「VUZP、VZIP」 (ページ 4-34)

n が定義済みの再配置名でもよいことを追記し、関

連する例を例のセクションに追加しました。

「RELOC」 (ページ 6-10)

| を使用する場合のマクロの回避方法の注を追加し

ました。

「MACRO、MEND」 (ページ 6-34)

エラーの生成が、アセンブリの第 2 パスではなくア

センブリ時に行われることを伝えるメッセージを明確にしました。

「ASSERT」 (ページ 6-57)

ALIAS ディレクティブを追加し、概要の表に含めま

した。

「ALIAS」 (ページ 6-67)

n は任意の整数であることを明確にし、例を例のセ

クションに記述しました。

「ALIGN」 (ページ 6-68)

COMGROUP および GROUP の説明を明確にしました。 「AREA」 (ページ 6-71)

R_ARM_TARGET1 についての注を追加しました。 「AREA」 (ページ 6-71)

「関連項目」セクションに 8 バイト境界のスタック

整列へのリンクを追加しました。

「REQUIRE8、PRESERVE8」 (ページ 6-88)

--apcs オプションに /hardfp および /softfp 値を追加

し、--apcs オプションへのリンクを「コンパイラリ

ファレンス」に追加しました。

「--apcs=qualifier…qualifier」 (ページ 2-5)

"Rd、Rn、Rm、および Ra に PC は指定できません " で、

Rn を Rm に変更しました。

「USAD8、USADA8」 (ページ 3-112)

表 A-1 発行 A と 発行 B の相違点 (続き)

変更点 関連するトピック

ARM DUI 0489BJ Copyright © 2010 ARM. All rights reserved. A-4ID 011811 Non-Confidential