5.1.16 オペランドの特性

オペランドを必要とする命令(インストラクション,および疑似命令)は,その種類により要求するオペランド値のサイズ,範囲などが異なります。

たとえば,“MOV r, #byte”というインストラクションの機能は,「レジスタrに,byteで示される値を転送する」ものです。このとき,レジスタrは8ビット長のレジスタであるため,転送されるデータ“byte”のサイズは,8ビット以下でなければなりません。

もし,“MOV R0, 0x100”と記述した場合には,第2オペランド“0x100”のサイズが8ビット長を越えているため,アセンブル・エラーとなります。

このように,オペランドを記述する場合には,次のような注意が必要です。

-

値のサイズ,アドレス範囲がその命令のオペランドに適しているかどうか(数値やネーム,ラベル)

(1)

オペランドの値のサイズとアドレス範囲

命令のオペランドとして記述可能な数値/ネーム/ラベルの値のサイズとアドレス範囲には条件があります。

インストラクションの場合は,各インストラクションのオペランドの表現形式により,疑似命令の場合には命令の種類により,記述可能なオペランドのサイズとアドレス範囲に条件があります。

これらの条件を次に示します。

表 5.9

インストラクションのオペランド値の範囲

オペランドの
表現形式

値の範囲

byte

8ビット値 : 0x00〜0xFF

word

word [ B ]

word [ C ]

word [ BC ]

-

数値定数の場合

0x0000〜0xFFFF

-

ラベルの場合

0xF0000〜0xFFFFF注1

ただし,ラベルがミラー元領域注2に属する場合はミラー先領域注2の値を16ビット値にマスクした値となる

ES:word [ B ]

ES:word [ C ]

ES:word [ BC ]

-

数値定数の場合

0x0000〜0xFFFF

-

ラベルの場合

0x00000〜0xFFFFF

ESの値はチェックしない

上記以外

16ビット値 : 0x0000〜0xFFFF

saddr

0xFFE20〜0xFFF1F注3

ただし,saddr領域はデバイスにより異なります

saddrp

0xFFE20〜0xFFF1Fの偶数値注3

ただし,saddr領域はデバイスにより異なります

sfr

0xFFF20〜0xFFFFF : 特殊機能レジスタ略号(SFR略号注4),および数値定数,シンボル

sfrp

0xFFF20〜0xFFFFE : 特殊機能レジスタ略号(SFR略号注4),および数値定数,シンボル(偶数値のみ)

addr5

0x00080〜0x000BF(CALLT命令テーブル領域/偶数値のみ)

addr16

!addr16

(BR,CALL命令)

0x0000〜0xFFFF

(数値定数,ラベルともに,指定可能な範囲は同じ)

!addr16注5

(BR,CALL以外の命令)

-

数値定数 の場合注6

0x0000〜0xFFFF

-

ラベルの場合注6

0xF0000〜0xFFFFF注1

ただし,ラベルがミラー元領域注2に属する場合はミラー先領域注2の値を16ビット値にマスクした値となる

ES:!addr16

-

数値定数の場合注6

0x0000〜0xFFFF

-

ラベルの場合注6

0x00000〜0xFFFFF

ESの値はチェックしない

!addr16.bit

-

addr16部分が数値定数の場合

0x0000〜0xFFFF

-

addr16部分,またはaddr16.bitがシンボルの場合

0xF0000〜0xFFFFF注1

ただし,ラベルがミラー元領域注2に属する場合はミラー先領域注2の値を16ビット値にマスクした値となる

ES:!addr16.bit

-

addr16部分が数値定数の場合

0x0000〜0xFFFF

-

addr16部分,またはaddr16.bitがシンボルの場合

0x00000〜0xFFFFF

ESの値はチェックしない

addr20

$addr20

0x00000〜0xFFFFF,かつ分岐命令の次のアドレスから分岐先までが(-0x80 )〜( +0x7F )の範囲

$!addr20

0x00000〜0xFFFFFF ,かつ分岐命令の次のアドレスから分岐先までが( -0x8000 )〜( +0x7FFF )の範囲

!!addr20

0x00000〜0xFFFFF

bit

3ビット値 : 0〜7

RBn

n:2ビット値 : 0〜3

注 1.

ミラー先領域,および内部RAM領域とし,各領域はデバイス・ファイルを参照します。デバイス・ファイルを参照しない場合の範囲は0xF0000〜0xFFFFFとします。

注 2.

ミラー元領域のアドレス範囲は,デバイスによって異なります。詳細については,デバイスのユーザーズ・マニュアルを参照してください。

注 3.

saddr領域はデバイス・ファイルを参照します。デバイス・ファイルを参照しない場合の範囲は0xFFE20〜 0xFFF1Fとします。

注 4.

SFR略号はデバイス・ファイルを参照します。デバイス・ファイルを参照しない場合はSFR略号の使用は不可とします。なお,SFR略号のアドレス範囲は0xFFF00〜0xFFFFFですが,0xFFF00〜0xFFF1Fのアドレス範囲は,SFR略号で記述されていてもsaddrとみなします。

注 5.

SFR略号,および拡張SFR(2ndSFR)略号をオペランドに記述する場合,「!addr16」として「!SFR」や「!2ndSFR」の記述が可能とし,!addr16としてコードが生成されます。
拡張SFR略号のアドレス範囲もデバイス・ファイルを参照します。

注 6.

16ビット命令(16ビット・データ転送命令,16ビット演算命令など)のオペランドの場合は偶数値のみです。

 

数値定数とラベルとで記述可能な範囲が異なる理由について,次に示します。

オペランドのword,addr16に対してコードを生成する場合,出力可能な値は0x0000〜0xFFFFです。したがって,オペランドに数値定数を記述する場合には,それぞれこの範囲でチェックを行います。しかし,オペランドにラベルを記述する場合には,それぞれの数値の意味を鑑み,以下の範囲としています。

(a)

word

ベースト・アドレッシングでは,実際のアクセス先は0xF0000〜0xFFFFFです。したがって,ラベルを記述する場合には,このアドレス範囲であることをチェックします。

(b)

addr16

BR,CALL以外の命令では,実際のアクセス先は0xF0000〜0xFFFFFです。したがって,ラベルを記述する場合には,このアドレス範囲であることをチェックします。

表 5.10

疑似命令のオペランド値の範囲

種類

疑似命令

値の範囲

セクション定義

.ORG

0x00000〜0xFFFFF

.OFFSET

0x00000〜0xFFFFF

シンボル定義

.EQU

0x00000000〜0xFFFFFFFF

ただし,ビット・シンボルの場合は,

アドレス値 :0x00000〜0xFFFFF

ビット値 :0〜7

です。

.SET

0x00000000〜0xFFFFFFFF

データ定義・領域確保

.DB

初期値指定 :0x00〜0xFF

.DB2

初期値指定 :0x0000〜0xFFFF

.DB4

初期値指定 :0x00000000〜0xFFFFFFFF

.DB8

初期値指定 :0x00000000 00000000〜0xFFFFFFFF FFFFFFFF

.DS

サイズ指定 :0x00000〜0xFFFFF

.ALIGN

整列条件 :2以上231未満の偶数

(2)

命令の要求するオペランドのサイズ

命令には,機械命令と疑似命令がありますが,オペランドとしてイミーディエト・データ,またはシンボルを要求する命令については,各命令により要求するオペランドのサイズが異なります。したがって,命令の要求するオペランドのサイズ以上のデータを記述すると,エラーとなります。

また,式の評価は計算結果,および途中も含めて32ビットで行うため,オーバフローした場合でも32ビット値として扱います。

ただし,オペランドにリロケータブルなシンボルを記述した場合は,アセンブラ内では値が決定されないので,最適化リンカにおいて値の決定と範囲のチェックが行われます。

(3)

命令の要求するシンボルの性質

オペランドとしてシンボルが記述可能な命令でも,各命令により,記述できるシンボルの性質(アブソリュート,リロケータブル,外部参照)が異なります。

シンボルの参照方向には,後方参照と前方参照があります。

-

後方参照:オペランドとして参照するシンボルがそれ以前の行で定義されています。

-

前方参照:オペランドとして参照するシンボルがそれ以降の行で定義されています。

 

例を以下に示します。

 

次に,機械語命令のオペランドとして記述可能なシンボルの性質を示します。

表 5.11

オペランドとして記述可能なシンボルの性質

 

リロケーション属性

アブソリュート

リロケータブル注1

SFR略号注2

参照パターン

後方

前方

後方

前方

SFR

2ndSFR注3

記述形式

byte

word

saddr

注4,5

saddrp

注4,6

sfr

注4,7

sfrp

注4,8

addr20

addr16

注9

注9

addr5

bit

 

前方 : 前方参照

後方 : 後方参照

○ : 記述可能

− : エラー

注 1.

リロケータブル・シンボルを記述した場合は,最適化リンカによって値の決定,および範囲チェックを 行います。

注 2.

.EQU疑似命令のオペランドに,sfr,sfrp(saddrとsfrがオーバーラップしていない領域のsfr)を指定し,定義されたシンボルは後方参照のみとし,前方参照は禁止します。

注 3.

拡張特殊機能レジスタ(2nd SFR:2nd Special Function Register)

注 4.

オペランドの組み合わせに,saddr/saddrpをsfr/sfrpに入れ替えた組み合わせが存在する命令に対し,saddr領域のSFR略号を記述した場合は,saddr/saddrpとしてコードが出力されます。

注 5.

saddr領域の8ビットSFR

注 6.

saddr領域の16ビットSFR

注 7.

8ビットSFR

注 8.

16ビットSFR

注 9.

BR,CALL以外の命令のオペランド!addr16でのみ,!SFR,!2ndSFR,およびSFRの指定が可能です。

表 5.12

疑似命令のオペランドとして記述可能なシンボルの性質

 

リロケーション属性

アブソリュート

リロケータブル注1

参照方向

後方

前方

後方

前方

疑似命令

.ORG

注2

.OFFSET

注2

.EQU

注2

.SET

注2

.DB

.DB2

.DB4

.DB8

注2

.DS

注2

.ALIGN

注2

 

前方 : 前方参照

後方 : 後方参照

○ : 記述可能

− : 記述不可能

注 1.

リロケータブル・シンボルを記述した場合は,最適化リンカによって値の決定,および範囲チェックを 行います。

注 2.

絶対式のみが記述可能です。