モード制御のディレクティブ
構文
ARM
CODE
CODE16
CODE32
DATA
DATA64
THUMB
説明
これらのディレクティブはプロセッサのモードを制御します。
ディレクティブ | 説明 |
|---|---|
これ以降の命令は32ビット(Arm)命令としてアセンブルされます。CODE32 内のラベルはbit 0 が0 に設定されます。4 バイトアライメントを強制します。 | |
アセンブラオプション | |
これ以降の命令は、従来のCODE16構文を使用して、16ビット(Thumb)命令としてアセンブルされます。CODE16 内のラベルはbit 0 が1 に設定されます。2 バイトアライメントを強制します。 | |
コードセクション内で領域を定義します。ラベルはCODE32領域として扱われます。 | |
コードセクション内の64 ビットのアラインされたデータの領域を定義します。この領域は、ラベルがAArch64 状態のA64 命令セットのCODE 領域にあるように動作します。 | |
これ以降の命令は、16ビットThumb命令または32ビットThumb-2命令(指定コアでThumb-2命令セットがサポートされている場合)のいずれかとしてアセンブルされます。アセンブラ構文は、Arm Limitedで規定されているようにUnified Assembler構文に従っています。 |
ThumbおよびArm間でプロセッサモードを変更するには、BX命令(BranchおよびExchange)でCODE16/THUMBおよびCODE32/ARMディレクティブを使用するか、実行モードを変更するその他の命令を使用します。CODE16/THUMBとCODE32/ARMモードディレクティブはモードを変更する命令にアセンブルされることはなく、単にアセンブラにそれ以降の命令をどのように解釈するかを指示するだけです。
モードディレクティブCODE32とCODE16の使用は廃止予定です。代わりに、ARMとTHUMBをそれぞれ使用してください。
DC8、DC16、または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