Skip to main content

IAR Embedded Workbench for Arm 9.70.x

モード制御のディレクティブ

このセクションの内容:
構文

ARM

CODE

CODE16

CODE32

DATA

DATA64

THUMB

説明

これらのディレクティブはプロセッサのモードを制御します。

ディレクティブ

説明

ARMCODE32

これ以降の命令は32ビット(Arm)命令としてアセンブルされます。CODE32 内のラベルはbit 0 が0 に設定されます。4 バイトアライメントを強制します。

CODE

アセンブラオプション‑‑arm‑‑cpu_mode‑‑thumbなど、またはAArch64状態のA64命令、あるいは‑‑aarch64‑‑abi、または‑‑cpu_mode a64オプションが使用される場合に応じて、これ以降の命令は、ArmまたはThumb命令として解釈されます。

CODE16

これ以降の命令は、従来のCODE16構文を使用して、16ビット(Thumb)命令としてアセンブルされます。CODE16 内のラベルはbit 0 が1 に設定されます。2 バイトアライメントを強制します。

DATA

コードセクション内で領域を定義します。ラベルはCODE32領域として扱われます。

DATA64

コードセクション内の64 ビットのアラインされたデータの領域を定義します。この領域は、ラベルがAArch64 状態のA64 命令セットのCODE 領域にあるように動作します。

THUMB

これ以降の命令は、16ビットThumb命令または32ビットThumb-2命令(指定コアでThumb-2命令セットがサポートされている場合)のいずれかとしてアセンブルされます。アセンブラ構文は、Arm Limitedで規定されているようにUnified Assembler構文に従っています。

表148 モード制御のディレクティブ


ThumbおよびArm間でプロセッサモードを変更するには、BX命令(BranchおよびExchange)でCODE16/THUMBおよびCODE32/ARMディレクティブを使用するか、実行モードを変更するその他の命令を使用します。CODE16/THUMBCODE32/ARMモードディレクティブはモードを変更する命令にアセンブルされることはなく、単にアセンブラにそれ以降の命令をどのように解釈するかを指示するだけです。

モードディレクティブCODE32CODE16の使用は廃止予定です。代わりに、ARMTHUMBをそれぞれ使用してください。

DC8DC16、またはDC32を持つThumbコードセクション中でデータを定義するときは、必ずDATAディレクティブを使用します。これを行わない場合、データのラベルにはbit 0がセットされます。ArmまたはThumbプロセッサモード間をAArch64 状態のA64命令セットに変更する、またはその逆を行う方法はありません。

注記

他のアセンブラ用に作成されたアセンブラソースコードを移植するときは、慎重に作業を行ってください。IARアセンブラは常にThumbコードラベル(local、external、またはpublic)のbit 0をセットします。詳細についてはをArm用IARアセンブラへの移行参照してください。

指定したコアでArmモードがサポートされていない場合を除き、アセンブラは、最初にArmモードになります。ARMモードがサポートされていない場合、アセンブラは、最初にThumbになります。

以下は、Arm関数に対するThumbエントリがどのように実装されるかを示した例です。

            name    modeChange
            section MYCODE:CODE(2)
            thumb
thumbEntry
            bx      pc              ; Branch to armEntry, and
                                    ; change execution mode.
            nop                     ; For alignment only.
            arm
armEntry
            ; ...

            end

次の例では、DATAディレクティブの後の32ビットラベルをどのように初期化するかを示しています。このラベルはThumbセクション内で使用できます。

            name    dataDirective
            section MYCODE:CODE(2)
            thumb
thumbLabel  ldr     r0,dataLabel
            bx      lr

            data                   ; Change to data mode, so
                                   ; that bit 0 is not set
                                   ; on labels.
dataLabel   dc32    0x12345678
            dc32    0x12345678

            end