5.1.14 演算の制限

式の演算は,項を演算子で結びつけて行います。項として記述できるものには,定数,ネーム,ラベルがあり,各項はリロケーション属性を持ちます。

各項の持つリロケーション属性の種類により,その項に対して演算可能な演算子が限られます。したがって,式を記述する場合には,式を構成する各項のリロケーション属性に留意することが大切です。

(1)

演算とリロケーション属性

式を構成する各項は,リロケーション属性を持ちます。

各項をリロケーション属性により分類すると,アブソリュート項,リロケータブル項に分けられます。

次に,演算におけるリロケーション属性の種類とその性質,およびそれに該当する項を示します。

表 5.7

リロケーション属性の種類

種類

性質

該当項

アブソリュート項

アセンブル時に値,定数が決定する項

-

定数

-

定数を定義したネーム

リロケータブル項

アセンブル時には値が決定しない項

-

ラベル

-

ラベルを定義したネーム

-

.EXTERN疑似命令で定義したラベル

-

.EXTBIT疑似命令で定義したネーム

-

モジュール内に定義がないシンボル

 

演算可能な演算子と項の組み合わせをリロケーション属性により分類すると,次のようになります。

表 5.8

リロケーション属性による項と演算子の組み合わせ

演算子の種類

項のリロケーション属性

X:ABS

Y:ABS

X:ABS

Y:REL

X:REL

Y:ABS

X:REL

Y:REL

+ X

A

A

R

R

- X

A

A

~ X

A

A

HIGH X

A

A

R注1

R注1

LOW X

A

A

R注1

R注1

HIGHW X

A

A

R注1

R注1

LOWW X

A

A

R注1

R注1

MIRHW X

A

A

R注2

R注2

MIRLW X

A

A

R注2

R注2

SMRLW X

A

A

R注2

R注2

DATAPOS X.Y

BITPOS X.Y

DATAPOS X

A

A

BITPOS X

A

A

X + Y

A

R

R

X - Y

A

R

R

X * Y

A

X / Y

A

X % Y

A

X >> Y

A

X << Y

A

X & Y

A

X | Y

A

X ^ Y

A

X == Y

A

X != Y

A

X > Y

A

X >= Y

A

X < Y

A

X <= Y

A

X && Y

A

X || Y

A

 

ABS : アブソリュート項

REL : リロケータブル項

A : 演算結果がアブソリュート項になります。

R : 演算結果がリロケータブル項になります。

− : 演算不可

注 1.

XがMIRHW,MIRLW,SMRLW,DATAPOS演算を行ったリロケータブル項でない場合にかぎり,演算可能です。

注 2.

XがHIGH,LOW,HIGHW,LOWW,MIRHW,MIRLW,SMRLW,DATAPOS演算を行ったリロケータブル項ではない場合にかぎり,演算可能です。

(2)

演算子の入れ子

HIGH/HIGHW/LOW/LOWWの各演算子は入れ子を行う事が出来ます。

(3)

絶対式と相対式

式は「絶対式」と「相対値式」に分けて扱います。

(a)

絶対式

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

<1>

定数式

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

ただし,シンボル参照時点において未定義なシンボル,および値が確定しないシンボルの場合は,定数式として扱われません。

SYM1    .EQU    0x10            ;シンボルSYM1を定義
        MOV     A, #SYM1        ;定義済みのSYM1は定数式として扱う

<2>

シンボル

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

-

シンボル

-

シンボル±定数式

-

シンボル-シンボル

-

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

 

ここで言う“シンボル”とは,アブソリュート項であるシンボル,すなわち,モジュール内で定数で定義されたネームで,かつ,その時点において未定義なシンボル,および値の確定しないシンボル参照を指します。定義済みのシンボル参照を指定した場合は,そのシンボルに対して定義した値の“定数”が指定されたものとして扱います。

        MOV     A, #SYM1        ;この時点でSYM1は未定義シンボル
SYM1    .EQU    0x10            ; SYM1 を定義

(b)

相対式

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

次に示した形式注2が相対式として扱われます(“±”は“+”か“-”のどちらかになります)。

注 1.

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

注 2.

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

 

-

シンボル

-

シンボル±定数式

-

シンボル-シンボル

-

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

“-”の後のシンボルとしてラベルを記述することはできません。ただし,ラベル同士の減算は除きます。

 

いずれかのシンボルがリロケータブル項であれば相対式となります。式の例は次のようになります。

SIZE    .EQU    0x10
        MOV     A, #label1
        MOV     A, #label1 + 0x10
        MOV     A, #label2 - SIZE
        MOV     A, #label2 - SIZE + 0x10