式、オペランド、演算子
アセンブラでは、算術演算や論理演算などさまざまな式を使用できます。すべての演算子は、64ビットの2の補数整数を使用します。コードの生成のために値が使用される場合、範囲チェックが行われます。
式は左から右へと評価されます。ただし、演算子の優先度によってこの順番が上書きされた場合を除きます。アセンブラ演算子を参照してください。
式で有効なオペランドは以下のとおりです。
データまたはアドレスの定数。浮動小数点定数を除きます。
シンボル(シンボル名)は、データとアドレスのどちらを表すこともできます。アドレスの場合、ラベルとも呼ばれます。
プログラムロケーションカウンタ(PLC)。
.(ピリオド)。
オペランドについては、後ほど詳しく説明します。
注記
1つの式で2つのシンボルを使用することはできません。または、式がアセンブリ時に解決できない限り、複雑な式を使用することもできません。解決されない場合、アセンブラはエラーを生成します。
整数定数
すべてのIARシステムズのアセンブラは、64ビットの2の補数内部演算を使用しているため、整数の(符号付き)範囲は-263-1 ~263-1となります。
定数は一連の数字で記述し、オプションで先頭に-(マイナス)符号を付けて負の数を示します。
コンマと小数点は許可されません。
以下のような数値表現がサポートされます。
整数のタイプ | 例 |
|---|---|
2進数 |
|
8進数 |
|
10進数 |
|
16進数 |
|
注記
プレフィックスとサフィックスはいずれも、大文字または小文字で記述できます。
ASCII文字定数
ASCII定数は、任意の数の文字を半角または全角の引用符で囲みます。ASCII文字列には、出力可能な文字と空白のみを使用できます。引用符の文字自体にアクセスする場合、引用符を2つ並べて使用する必要があります。
フォーマット | 値 |
|---|---|
|
|
|
|
|
|
|
|
|
|
| 空白文字列(値なし) |
| ' |
|
|
|
|
|
|
浮動小数点定数
IAR アセンブラは、浮動小数点値を定数として扱い、IEEEのハーフ精度(16 ビット)、単精度(32ビット)、または浮動小数点形式、倍精度形式(64 ビット) 、または小数形式に変換します 。
浮動小数点値は次のフォーマットで記述できます。
[+|-][digits].[digits][{E|e}[+|-]digits]
次の表は、有効な例を示します。
フォーマット | 値 |
|---|---|
| 1.023 x 101 |
| 1.23456 x 10-24 |
| 1.0 x 103 |
空白とタブは、浮動小数点定数では使用できません。
注記
浮動小数点定数を式で使用しても、有用な結果とはなりません。
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ビットモードの利用可能な定義済のレジスタシンボルを示しています。
名前 | サイズ | 説明 |
|---|---|---|
| 32ビット | 現在のプログラムステータスレジスタ |
| 64ビット | 倍精度の浮動小数点コプロセッサレジスタ |
| 32ビット | 浮動小数点コンテキスト ペイロード |
| 32ビット | 浮動小数点コプロセッサ、例外レジスタ |
| 32ビット | 浮動小数点コプロセッサ、ステータスおよび制御レジスタ |
| 32ビット | 浮動小数点コプロセッサ、システムIDレジスタ |
| 128ビット | 高度な |
| 32ビット | 汎用レジスタ |
| 32ビット | スタックポインタ |
| 32ビット | リンクレジスタ |
| 32ビット | プログラムカウンタ |
| 32ビット | 単精度の浮動小数点コプロセッサレジスタ |
| 32ビット | 保存されたプログラムステータスレジスタ |
また、コアによっては、命令構文で使用可能な場合、たとえば、Cortex-M3のAPSRなど、他のレジスタシンボルを使用することもできます。
この表では、64ビットモードの利用可能な定義済のレジスタシンボルを示しています。
名前 | サイズ | 説明 |
|---|---|---|
| 64ビット | 64ビット一般の目的のレジスタ |
| 32ビット | 32ビット一般の目的のレジスタ |
| 64ビット | スタックポインタ |
| 32ビット | スタックポインタ |
| 128ビット | 128 ビット SIMD および浮動小数点レジスタ |
| 128ビット | 128 ビット SIMD および浮動小数点レジスタ |
| 64ビット | 128ビットSIMDおよび浮動小数点レジスタ |
| 32ビット | 128 ビット SIMD および浮動小数点レジスタ |
| 16ビット | 128ビットSIMDおよび浮動小数点レジスタ |
| 8ビット | 8ビットSIMDおよび浮動小数点レジスタ |
| 64ビット | 最初のintra-procedure-call検索レジスタ、 |
| 64ビット | 2番目のintra-procedure-call検索レジスタ、 |
| 64ビット | フレームポインタ、 |
| 64ビット | リンクレジスタ、 |
| 64ビット | ゼロ64ビットレジスタ |
| 32ビット | ゼロ32ビットレジスタ |
定義済シンボル
以下の定義済シンボルがあります。
シンボル | 値 |
|---|---|
AArch64状態でA64命令セットのアセンブルを行う場合、このシンボルが | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
| |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
アセンブラオプション 選択したプロセッサの構造にCMSE(Cortex-M security extensions)があり、アセンブラオプション シンボルは、CMSEなしのコアには未定義です。 | |
CRC32命令がサポートされる場合、このシンボルは このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
暗号化命令がサポートされる場合、このシンボルは このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
丸め方向および変換命令がサポートされている場合は、このシンボルは このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
FPUが結合浮動小数点積和演算をサポートしている場合は、このシンボルは このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
浮動小数点の最大と最小命令がサポートされている場合は、このシンボルは このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
| |
| |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
このシンボルは、Arm C 言語拡張 (ACLE)に従って定義されます。 | |
| |
| |
| |
| |
| |
使用中のアセンブラのビルド番号を示す固有の整数です。ビルド番号は、必ずしも後でリリースされたアセンブラの方が大きい番号になるとは限りません。 | |
使用中のチップコアを示す整数です。アセンブラオプション | |
| |
現在のソースファイルの名前(文字列)。 | |
IARアセンブラの識別子(数字)。将来のバージョンでは、番号が大きくなる可能性があります。このシンボルを | |
コードがIARアセンブラfor Armでアセンブルされている場合は | |
ILP32データモデルを使用してAArch64状態でA64命令セットのアセンブルを行う場合、このシンボルが | |
現在のソースの行番号(数字)。 | |
使用中のバイトオーダを識別します。コードがリトルエンディアンのバイトオーダでアセンブルされる場合、番号1 を返し、ビッグエンディアンコードが生成される場合は、番号0を返します。リトルエンディアンがデフォルトです。 | |
LP64データモデルを使用してAArch64状態でA64命令セットのアセンブルを行う場合、このシンボルが | |
2バイトからなるターゲットの識別子(数)。上位バイトはターゲットの識別を行い、IARアセンブラ forArmでは0x4F(= 79進数)です。 | |
| |
整数形式のバージョン番号。たとえば、バージョン6.21.2は6021002(数値)として返されます。 |
シンボル値をコードに含める
複数のデータ定義ディレクティブで、コードにシンボル値を含めることができます。これらのディレクティブは、値を定義するか、メモリを予約します。コードにシンボル値を含めるには、適切なデータ定義ディレクティブでシンボルを使用します。
たとえば、アセンブリの時刻を文字列として表示させるには、次のようにして行います。
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注記
アセンブリ時に、範囲チェックは行われません。範囲チェックはリンク時に行われ、値が長すぎる場合にはリンカエラーが発生します。