オペランドを必要とする命令(インストラクション,および疑似命令)は,その種類により要求するオペランド値のサイズ,範囲などが異なります。
たとえば,“MOV r, #byte”というインストラクションの機能は,「レジスタrに,byteで示される値を転送する」ものです。このとき,レジスタrは8ビット長のレジスタであるため,転送されるデータ“byte”のサイズは,8ビット以下でなければなりません。
もし,“MOV R0, 0x100”と記述した場合には,第2オペランド“0x100”のサイズが8ビット長を越えているため,アセンブル・エラーとなります。
このように,オペランドを記述する場合には,次のような注意が必要です。
- | 値のサイズ,アドレス範囲がその命令のオペランドに適しているかどうか(数値やネーム,ラベル) |
命令のオペランドとして記述可能な数値/ネーム/ラベルの値のサイズとアドレス範囲には条件があります。
インストラクションの場合は,各インストラクションのオペランドの表現形式により,疑似命令の場合には命令の種類により,記述可能なオペランドのサイズとアドレス範囲に条件があります。
これらの条件を次に示します。
|
|
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以外の命令)
|
0x0000~0xFFFF
0xF0000~0xFFFFF注1
ただし,ラベルがミラー元領域注2に属する場合はミラー先領域注2の値を16ビット値にマスクした値となる
|
ES:!addr16
|
0x0000~0xFFFF
0x00000~0xFFFFF
ESの値はチェックしない
|
!addr16.bit
|
0x0000~0xFFFF
- | addr16部分,またはaddr16.bitがシンボルの場合 |
0xF0000~0xFFFFF注1
ただし,ラベルがミラー元領域注2に属する場合はミラー先領域注2の値を16ビット値にマスクした値となる
|
ES:!addr16.bit
|
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です。したがって,オペランドに数値定数を記述する場合には,それぞれこの範囲でチェックを行います。しかし,オペランドにラベルを記述する場合には,それぞれの数値の意味を鑑み,以下の範囲としています。
ベースト・アドレッシングでは,実際のアクセス先は0xF0000~0xFFFFFです。したがって,ラベルを記述する場合には,このアドレス範囲であることをチェックします。
BR,CALL以外の命令では,実際のアクセス先は0xF0000~0xFFFFFです。したがって,ラベルを記述する場合には,このアドレス範囲であることをチェックします。
|
|
|
セクション定義
|
.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未満の偶数
|
命令には,機械命令と疑似命令がありますが,オペランドとしてイミーディエト・データ,またはシンボルを要求する命令については,各命令により要求するオペランドのサイズが異なります。したがって,命令の要求するオペランドのサイズ以上のデータを記述すると,エラーとなります。
また,式の評価は計算結果,および途中も含めて32ビットで行うため,オーバフローした場合でも32ビット値として扱います。
ただし,オペランドにリロケータブルなシンボルを記述した場合は,アセンブラ内では値が決定されないので,最適化リンカにおいて値の決定と範囲のチェックが行われます。
オペランドとしてシンボルが記述可能な命令でも,各命令により,記述できるシンボルの性質(アブソリュート,リロケータブル,外部参照)が異なります。
シンボルの参照方向には,後方参照と前方参照があります。
- | 後方参照:オペランドとして参照するシンボルがそれ以前の行で定義されています。 |
- | 前方参照:オペランドとして参照するシンボルがそれ以降の行で定義されています。 |
例を以下に示します。
次に,機械語命令のオペランドとして記述可能なシンボルの性質を示します。
表 5.11 | オペランドとして記述可能なシンボルの性質 |
|
|
|
|
|
|
|
|
|
|
|
|
|
byte
|
|
|
|
|
|
|
word
|
|
|
|
|
|
|
saddr
|
|
|
|
|
|
|
saddrp
|
|
|
|
|
|
|
sfr
|
|
|
|
|
|
|
sfrp
|
|
|
|
|
|
|
addr20
|
|
|
|
|
|
|
addr16
|
|
|
|
|
|
|
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としてコードが出力されます。 |
注 9. | BR,CALL以外の命令のオペランド!addr16でのみ,!SFR,!2ndSFR,およびSFRの指定が可能です。 |
表 5.12 | 疑似命令のオペランドとして記述可能なシンボルの性質 |
|
|
|
|
|
|
|
|
|
|
.ORG
|
|
|
|
|
.OFFSET
|
|
|
|
|
.EQU
|
|
|
|
|
.SET
|
|
|
|
|
.DB
|
|
|
|
|
.DB2
|
|
|
|
|
.DB4
|
|
|
|
|
.DB8
|
|
|
|
|
.DS
|
|
|
|
|
.ALIGN
|
|
|
|
|
前方 : 前方参照
後方 : 後方参照
○ : 記述可能
- : 記述不可能
注 1. | リロケータブル・シンボルを記述した場合は,最適化リンカによって値の決定,および範囲チェックを 行います。 |