Skip to main content

IAR Embedded Workbench for Arm 9.70.x

式、オペランド、演算子

このセクションの内容:

式は、オペランドと演算子から構成されています。

アセンブラでは、算術演算や論理演算などさまざまな式を使用できます。すべての演算子は、64ビットの2の補数整数を使用します。コードの生成のために値が使用される場合、範囲チェックが行われます。

式は左から右へと評価されます。ただし、演算子の優先度によってこの順番が上書きされた場合を除きます。アセンブラ演算子を参照してください。

式で有効なオペランドは以下のとおりです。

  • データまたはアドレスの定数。浮動小数点定数を除きます。

  • シンボル(シンボル名)は、データとアドレスのどちらを表すこともできます。アドレスの場合、ラベルとも呼ばれます。

  • プログラムロケーションカウンタ(PLC)。.(ピリオド)。

オペランドについては、後ほど詳しく説明します。

注記

1つの式で2つのシンボルを使用することはできません。または、式がアセンブリ時に解決できない限り、複雑な式を使用することもできません。解決されない場合、アセンブラはエラーを生成します。

整数定数

すべてのIARシステムズのアセンブラは、64ビットの2の補数内部演算を使用しているため、整数の(符号付き)範囲は-263-1 ~263-1となります。

定数は一連の数字で記述し、オプションで先頭に-(マイナス)符号を付けて負の数を示します。

コンマと小数点は許可されません。

以下のような数値表現がサポートされます。

整数のタイプ

2進数

1010b, b'1010

8進数

1234q, q'1234

10進数

1234, -1, d'1234

16進数

0FFFFh, 0xFFFF, h'FFFF

表136 整数定数のフォーマット 


注記

プレフィックスとサフィックスはいずれも、大文字または小文字で記述できます。

ASCII文字定数

ASCII定数は、任意の数の文字を半角または全角の引用符で囲みます。ASCII文字列には、出力可能な文字と空白のみを使用できます。引用符の文字自体にアクセスする場合、引用符を2つ並べて使用する必要があります。

フォーマット

'ABCD'

ABCD(4文字)

"ABCD"

ABCD'\0'(5文字、最後はASCIIのnull)

'A''B'

A'B

'A'''

A'

''''(4つの引用符)

'

''(2つの引用符)

空白文字列(値なし)

""(2つの二重引用符)

'\0'(1つのASCII null文字)

\'

'、文字列内で引用符を使用する場合('I\'d love to')

\\

\ 文字列内で\を使用する場合

\"

"、文字列内での二重引用符

表137 ASCII文字定数のフォーマット 


浮動小数点定数

IAR アセンブラは、浮動小数点値を定数として扱い、IEEEのハーフ精度(16 ビット)、単精度(32ビット)、または浮動小数点形式、倍精度形式(64 ビット) または小数形式に変換します 。

浮動小数点値は次のフォーマットで記述できます。

[+|-][digits].[digits][{E|e}[+|-]digits]

次の表は、有効な例を示します。

フォーマット

10.23

1.023 x 101

1.23456E-24

1.23456 x 10-24

1.0E3

1.0 x 103

表138 浮動小数点定数 


空白とタブは、浮動小数点定数では使用できません。

注記

浮動小数点定数を式で使用しても、有用な結果とはなりません。

Trueおよびfalse

式では、ゼロ値はfalseと見なされ、ゼロ以外の値はtrueと見なされます。

条件付きの式では、falseの場合は値0、trueの場合は1が返されます。

シンボル

ユーザ定義シンボルの長さは最大32,000文字であり、すべての文字は有意です。シンボルの後に続く演算の種類に応じて、シンボルはデータシンボルまたはアドレスシンボルのいずれかとなります。(アドレスシンボルはラベルと呼びます)。命令の前のシンボルはラベルであり、EQUディレクティブなどの前のシンボルはデータシンボルです。シンボルは以下のいずれかです。

  • 絶対—値はアセンブラに既知です。

  • 再配置可能—リンク時に解決されます。

シンボルは文字a–z またはA–Z、?(クエスチョンマーク)、または _ (アンダースコア)で始まる必要があります。シンボルには数字0~9と$(ドル)を使用できます。

シンボルには、` (バッククオート)で囲まれているかぎり、印刷可能文字も使用できます:

`strange#label`

命令、レジスタ、演算子、ディレクティブなどの組み込みシンボルでは、大文字/小文字は区別されません。ユーザ定義のシンボルに関しては、デフォルトで大文字/小文字が区別されますが、区別するかどうかは、アセンブラのユーザ シンボルの 大文字小文字の 区別 (-s)オプションで切り換えることができます。詳細については、-sを参照してください。

モジュール間でシンボルをどのように共有するか制御するには、シンボル制御ディレクティブを使用します。たとえば、1つ以上のシンボルを他のモジュールで使用できるようにするには、PUBLICディレクティブを使用します。タイプが設定されていない外部シンボルをインポートするには、EXTERNディレクティブを使用します。

シンボルとラベルはバイトアドレスです。データ定義ディレクティブまたは割当てディレクティブを参照してください。

ラベル

メモリロケーションに使用されるシンボルをラベルと呼びます。

プログラムロケーションカウンタ(PLC)

アセンブラは現在の命令の開始アドレスをトレースします。これを、プログラムロケーションカウンタと呼びます。

アセンブラソースコードでプログラムロケーションカウンタを参照するには、.(ピリオド)文字を使用します。例えば:

         section MYCODE:CODE(2)
         arm
         b       .       ; Loop forever
         end

レジスタシンボル

この表では、 32ビットモードの利用可能な定義済のレジスタシンボルを示しています。

名前

サイズ

説明

CPSR

32ビット

現在のプログラムステータスレジスタ

D0-D31

64ビット

倍精度の浮動小数点コプロセッサレジスタ

FPCXT

32ビット

浮動小数点コンテキスト ペイロード

FPEXC

32ビット

浮動小数点コプロセッサ、例外レジスタ

FPSCR

32ビット

浮動小数点コプロセッサ、ステータスおよび制御レジスタ

FPSID

32ビット

浮動小数点コプロセッサ、システムIDレジスタ

Q0-Q15

128ビット

高度なSIMDレジスタ

R0R12

32ビット

汎用レジスタ

R13 (SP)

32ビット

スタックポインタ

R14 (LR)

32ビット

リンクレジスタ

R15 (PC)

32ビット

プログラムカウンタ

S0-S31

32ビット

単精度の浮動小数点コプロセッサレジスタ

SPSR

32ビット

保存されたプログラムステータスレジスタ

表139 32ビットモードの定義済のレジスタシンボル 


また、コアによっては、命令構文で使用可能な場合、たとえば、Cortex-M3のAPSRなど、他のレジスタシンボルを使用することもできます。

この表では、64ビットモードの利用可能な定義済のレジスタシンボルを示しています。

名前

サイズ

説明

X0-X30

64ビット

64ビット一般の目的のレジスタR0-R30の64ビット

W0-W30

32ビット

32ビット一般の目的のレジスタR0-R30の64ビット

SP

64ビット

スタックポインタ

WSP

32ビット

スタックポインタ

V0-V31

128ビット

128 ビット SIMD および浮動小数点レジスタ V0-V31

Q0-Q31

128ビット

128 ビット SIMD および浮動小数点レジスタ V0-V31 の 128 ビットエンティティ

D0-D31

64ビット

128ビットSIMDおよび浮動小数点レジスタV0-V31の倍精度浮動小数点数

S0-S31

32ビット

128 ビット SIMD および浮動小数点レジスタV0-V31の単精度浮動小数点

H0-H31

16ビット

128ビットSIMDおよび浮動小数点レジスタV0V31のハーフ精度浮動小数点

B0-B31

8ビット

8ビットSIMDおよび浮動小数点レジスタV0V31の128ビットエンティティ

IP0

64ビット

最初のintra-procedure-call検索レジスタ、R16のエイリアス

IP1

64ビット

2番目のintra-procedure-call検索レジスタ、R17のエイリアス

FP

64ビット

フレームポインタ、R29のエイリアス

LR

64ビット

リンクレジスタ、R30のエイリアス

XZR

64ビット

ゼロ64ビットレジスタ

WZR

32ビット

ゼロ32ビットレジスタ

表140 64ビットモードの定義済64ビットレジスタシンボル 


定義済シンボル

以下の定義済シンボルがあります。

シンボル

__aarch64__

AArch64状態でA64命令セットのアセンブルを行う場合、このシンボルが1に定義されます。

__ARM_32BIT_STATE

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_64BIT_STATE

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_ADVANCED_SIMD__

‑‑cpu オプションに基づいて設定される整数。選択されたプロセッサのアーキテクチャがAdvanced SIMDアーキテクチャの拡張の場合、このシンボルは1に設定されます。このシンボルは、他のコアについては未定義です。

__ARM_ARCH

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_ARCH_ISA_A64

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_ARCH_ISA_ARM

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_ARCH_ISA_THUMB

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_ARCH_PROFILE

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_BIG_ENDIAN

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_AES

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_CLZ

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_CMSE

アセンブラオプション ‑‑cpu‑‑cmseに基づいて設定される整数。選択したプロセッサの構造にCMSE(Cortex-M security extensions)があり、アセンブラオプション ‑‑cmse が指定されている場合は、シンボルは 3 に設定されます。

選択したプロセッサの構造にCMSE(Cortex-M security extensions)があり、アセンブラオプション‑‑cmseが指定されてない場合は、シンボルは1に設定されます。

シンボルは、CMSEなしのコアには未定義です。

__ARM_FEATURE_CRC32

CRC32命令がサポートされる場合、このシンボルは1に設定されます(Armv8-A/Rではオプション)。

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_CRYPTO

暗号化命令がサポートされる場合、このシンボルは1に設定されます。(NeonのArmv8-A/Rを意味します)

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_DIRECTED_ROUNDING

丸め方向および変換命令がサポートされている場合は、このシンボルは1に設定されます。

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_DSP

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_FMA

FPUが結合浮動小数点積和演算をサポートしている場合は、このシンボルは1に設定されます。

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_FP16_FML

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_IDIV

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_NUMERIC_MAXMIN

浮動小数点の最大と最小命令がサポートされている場合は、このシンボルは1に設定されます。

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_QBIT

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_QRDMX

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_SAT

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_SHA2

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_SHA3

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_SHA512

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_SIMD32

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_SM3

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FEATURE_SM4

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_FP

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_MEDIA__

‑‑cpu オプションに基づいて設定される整数。選択されたプロセッサのアーキテクチャがマルチメディア用のARMv6 SIMD拡張である場合、このシンボルは1に設定されます。このシンボルは、他のコアについては未定義です。

__ARM_MPCORE__

‑‑cpu オプションに基づいて設定される整数。選択されたプロセッサのアーキテクチャがMultiprocessing Extensionsの場合、このシンボルは1に設定されます。このシンボルは、他のコアについては未定義です。

__ARM_NEON

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_NEON_FP

このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。

__ARM_PROFILE_M__

‑‑cpu オプションに基づいて設定される整数。選択されたプロセッサがプロファイルMコアの場合、このシンボルは1に設定されます。このシンボルは、他のコアについては未定義です。

__ARMVFP__

‑‑fpu オプションに基づいて設定される整数で、ベクタ浮動小数点コプロセッサ用の浮動小数点命令が有効になっているかどうかを識別します。このシンボルは __ARMVFPV2____ARMVFPV3__、または__ARMVFPV4__に定義されます。これらのシンボル名は、__ARMVFP__シンボルの評価に使用できます。浮動小数点命令が無効な場合(デフォルト)、シンボルの定義は解除されます。

__ARMVFP_D16__

‑‑fpuアセンブラオプションに基づいて設定される整数。選択されたFPUが16 Dレジスタのみを持つVFPv3またはVFPv4ユニットの場合、このシンボルは1に設定されます。それ以外の場合、シンボルは未定義です。

__ARMVFP_FP16__

‑‑fpuアセンブラオプションに基づいて設定される整数。選択されたFPUが16ビットの浮動小数点数のみをサポートする場合、このシンボルは1に設定されます。それ以外の場合、シンボルは未定義です。

__ARMVFP_SP__

‑‑fpuアセンブラオプションに基づいて設定される整数。選択されたFPUが32ビットの単精度のみをサポートする場合、このシンボルは1に設定されます。それ以外の場合、シンボルは未定義です。

__BUILD_NUMBER__

使用中のアセンブラのビルド番号を示す固有の整数です。ビルド番号は、必ずしも後でリリースされたアセンブラの方が大きい番号になるとは限りません。

__CORE__

使用中のチップコアを示す整数です。アセンブラオプション‑‑cpuの設定を反映した値です。使用可能な値については、‑‑cpuを参照してください。

__DATE__

dd/Mmm/yyyyフォーマットで示す現在の日付(文字列)。

__FILE__

現在のソースファイルの名前(文字列)。

__IAR_SYSTEMS_ASM__

IARアセンブラの識別子(数字)。将来のバージョンでは、番号が大きくなる可能性があります。このシンボルを#ifdefでテストし、コードがIARのアセンブラでアセンブルされたものかどうかを検出できます。

__IASMARM__

コードがIARアセンブラfor Armでアセンブルされている場合は1に設定される整数です。

__ilp32__

ILP32データモデルを使用してAArch64状態でA64命令セットのアセンブルを行う場合、このシンボルが 1 に定義されます。

__LINE__

現在のソースの行番号(数字)。

__LITTLE_ENDIAN__

使用中のバイトオーダを識別します。コードがリトルエンディアンのバイトオーダでアセンブルされる場合、番号1 を返し、ビッグエンディアンコードが生成される場合は、番号0を返します。リトルエンディアンがデフォルトです。

__lp64__

LP64データモデルを使用してAArch64状態でA64命令セットのアセンブルを行う場合、このシンボルが 1 に定義されます。

__TID__

2バイトからなるターゲットの識別子(数)。上位バイトはターゲットの識別を行い、IARアセンブラ forArmでは0x4F(= 79進数)です。

__TIME__

hh:mm:ssフォーマットで示す現在の時刻(文字列)。

__VER__

整数形式のバージョン番号。たとえば、バージョン6.21.26021002(数値)として返されます。

表141 定義済シンボル 


シンボル値をコードに含める

複数のデータ定義ディレクティブで、コードにシンボル値を含めることができます。これらのディレクティブは、値を定義するか、メモリを予約します。コードにシンボル値を含めるには、適切なデータ定義ディレクティブでシンボルを使用します。

たとえば、アセンブリの時刻を文字列として表示させるには、次のようにして行います。

            name    timeOfAssembly
            extern  printStr
            section MYCODE:CODE(2)

            adr     r0,time         ; Load address of time
                                    ; string in R0.
            bl      printStr        ; Call string output routine.
            bx      lr              ; Return

            data                    ; In data mode:
time        dc8     __TIME__        ; String representing the
                                    ; time of assembly.
            end
条件付きアセンブリ用のシンボルをテストする

アセンブリ時にシンボルをテストするには、いずれかの条件付きアセンブリディレクティブを使用します。これらのディレクティブを使用すると、アセンブリ時にアセンブリプロセスを制御できます。

たとえば、古いアセンブラバージョンと新しいアセンブラバージョンのどちらを使用しているかに応じて別々のコードをアセンブルするには、次のようにします。

#if (__VER__ > 6021000)                 ; New assembler version
;…
;…
#else                               ; Old assembler version
;…
;…
#endif

詳細については、条件付きアセンブリディレクティブを参照してください。

絶対式および再配置可能式

式を構成しているオペランドに応じて、式は絶対または再配置可能のいずれかになります。絶対式とは、絶対シンボルまたは再配置可能シンボルのみを含む式のことです。

再配置可能セクションにシンボルが含まれている式は、セクションのロケーションに依存しているため、アセンブリ時に解決することはできません。これらは再配置可能式と呼ばれます。

このような式は、リンク時にリンカによって評価され、解決されます。これらは、アセンブラにより縮小された後で、最大で1つのシンボル参照およびオフセットで構築できます。

たとえば、プログラムは以下のような絶対式と再配置可能式を定義することが可能です。

            name    simpleExpressions
            section MYCONST:CONST(2)
first       dc32    5                ; A relocatable label.
second      equ     10 + 5           ; An absolute expression.

            dc32    first            ; Examples of some legal
            dc32    first + 1        ; relocatable expressions.
            dc32    first + second
            end

注記

アセンブリ時に、範囲チェックは行われません。範囲チェックはリンク時に行われ、値が長すぎる場合にはリンカエラーが発生します。