5.1.11 演算の制限

式は“定数”,“シンボル”,“ラベルの参照”,“演算子”,および“かっこ”を要素とし,これらの要素で構成される値を示します。式は,絶対値式と相対値式に分けて扱います。

(1)

絶対値式

定数値を示す式を“絶対値式”と呼びます。絶対値式は,命令においてオペランドを指定する場合,または疑似命令において値などを指定する場合に用いることができます。通常,絶対値式は,定数,またはシンボルによって構成されます。次に示した形式が絶対値式として扱われます。

(a)

定数式

定義済みのシンボル参照を指定した場合,そのシンボルに対して定義した値の定数が指定されたものとして扱われます。したがって,定数式は,定義済みのシンボル参照を,その構成要素として持つことができます。

SYM1    .set    0x100           ;シンボルSYM1を定義
        mov     SYM1, r10       ;定義済みのSYM1は定数式として扱う

(b)

シンボル

シンボルに関する式には,次のものがあります(“±”は“+”か“-”のどちらかになります)。

-

シンボル

-

シンボル±定数式

-

シンボル-シンボル

-

シンボル-シンボル±定数式

 

ここで言う“シンボル”とは,同じファイル内でシンボル定義疑似命令によって定数として定義されたもので,かつ,その時点において未定義なシンボル参照を指します。定義済みのシンボル参照を指定した場合は,そのシンボルに対して定義した値の“定数”が指定されたものとして扱います。

        add     SYM1 + 0x100, r11       ;この時点でSYM1は未定義シンボル
SYM1    .set    0x10                    ; SYM1 を定義

(c)

ラベル参照

ラベル参照に関する式には,次のものがあります(“±”は“+”か“-”のどちらかになります)。

-

ラベル参照-ラベル参照

-

ラベル参照-ラベル参照±定数式

 

ラベル参照に関する式の例は,次のようになります。

mov     $label1 - $label2, r11

 

上記の例のような“2つのラベル参照”は,次のように参照にする必要があります。

-

指定したファイル内で,同じセクションに定義をもつ

-

同じ参照方法($labelは$label同士,#labelは#label同士など)

これらの条件を満たさない場合は,メッセージが出力され,アセンブルが中止されます。

 

.DW疑似命令においては,「2つのラベル参照」が絶対アドレス参照であれば,別ファイルで異なるセクションに定義を持っていても,アセンブル可能とします。

(2)

相対値式

特定のアドレスからのオフセット値注1を示す式を“相対値式”と呼びます。相対値式は,命令においてオペランドを指定する場合,データ定義疑似命令において値を指定する場合に用いることができます。通常,相対値式は,ラベル参照によって構成されます。次に示した形式注2が相対値式として扱われます。

注 1.

このアドレスはリンク時に定められます。このため,このオフセットの値もリンク時に定められます。

注 2.

絶対値式,相対値式ともに,“-シンボル+ラベルの参照”の形式の式を“ラベルの参照-シンボル”の形式の式とみなすことはできますが,“ラベルの参照-(+シンボル)”の形式の式を“ラベルの参照-シンボル”の形式の式とみなすことはできません。このため,かっこ“( )”は定数式においてのみ用いるようにしてください。

(a)

ラベル参照

ラベル参照に関する式には,次のものがあります(“±”は“+”か“-”のどちらかになります)。

-

ラベル参照

-

ラベル参照±定数式

-

ラベル参照-シンボル

-

ラベル参照-シンボル±定数式

 

ラベル参照に関する式の例は次のようになります。

SIZE    .set    0x10
        add     #label1, r10
        add     #label1 + 0x10, r10
        add     #label2 - SIZE, r10
        add     #label2 - SIZE + 0x10, r10