5.1.2 記述方法

アセンブリ言語のソース・プログラムは,文で構成されます。

1つの文は,1行以内に「(1) 文字セット」で表される文字を使って記述します。アセンブリ言語文は,“シンボル”,“ニモニック”,“オペランド”,および“コメント”から構成されます。

[シンボル][:]       [ニモニック]     [オペランド], [オペランド]    ;[コメント]

 

各欄は,空白,タブ,コロン(:),またはセミコロン(;)で区切ります。1行の最大文字数は4294967294(=0xFFFFFFFE)(理論値)です。ただし,実際にはメモリ量により制限されます。

文の記述方法は自由記述形式で,シンボル欄,ニモニック欄,オペランド欄,コメント欄の順序が正しければ任意のカラムから記述することができます。ただし,1つの文は1行以内で記述しなければなりません。

 

シンボル欄にシンボルを記述する場合は,コロン,1つ以上の空白,またはタブで区切ります。ただし,コロンか空白かタブかはニモニックで記述する命令によります。また,コロンの前後には,任意の数の空白,またはタブを記述することができます。

 

オペランド欄の記述が必要な場合は,1つ以上の空白,またはタブで区切ります。

 

コメント欄にコメントを記述する場合は,セミコロンで区切ります。セミコロンの前後には,任意の数の空白,またはタブを記述することができます。

 

アセンブリ言語文は,1行に1文を記述します。文の最後は改行(リターン)します。

 

(1)

文字セット

アセンブラがサポートするソース・プログラムで,使用できる文字は次の3つから構成されます。

(a)

言語文字

ソース上で命令を記述するために使用する文字です。

言語文字をさらに機能別に細分類すると下表になります。

表 5.1

言語文字の文字セット

細分類の総称名

文字

数字

0 1 2 3 4 5 6 7 8 9

英字

大文字

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

小文字

a b c d e f g h i j k l m n o p q r s t u v w x y z

英字相当文字

@ _(アンダースコア) .(ピリオド)

特殊文字

特殊1

. , : ; * / + - ‘ < > ( ) $ = ! & # [ ] “ % << >> | ^ ? ~ △

特殊2

\

特殊3

LF,CR LF,HT

-

英字(英字相当文字も英字に含める)と数字をまとめて英数字といいます。

-

予約語,または数値定数に記述した英小文字は,対応する英大文字として解釈されます。

-

英小文字をユーザ定義シンボルの中に使った場合,英大文字,英小文字の区別をして解釈されます。

 

特殊1文字の用途を以下に示します。

以下の使用方法以外で,文字データ・注釈(コメント)部以外のソース・プログラム中に現れたときはエラーとなります。

表 5.2

特殊1文字とその用途

文字

用途

.(ピリオド)

ビット位置指定子

疑似命令の開始記号

,(カンマ)

オペランドの区切り

:(コロン)

ラベルの区切り

拡張アドレス指定(”ES:”)

;(セミコロン)

コメントの開始

*

乗算演算子

/

除算演算子

+

正符号

加算演算子

-(ハイフン)

負符号

減算演算子

'(シングル・クォーテーション)

文字定数の開始・終了記号

<

比較演算子

シフト演算子

>

比較演算子

シフト演算子

( )

演算順序の指定

$

制御命令の開始記号

相対アドレッシング開始記号

=

比較演算子

!

比較演算子

絶対アドレッシングの開始

&

ビット論理演算子

論理演算子

#

イミディエート値の開始

コメントの開始(行頭の場合)

[ ]

インダイレクト表示記号

"(ダブル・クォーテーション)

文字列定数の開始と終了

%

剰余演算子

|

ビット論理演算子

論理演算子

^

ビット論理演算子

?

コンカティネート記号(マクロボディ内で使用)

~

ビット論理演算子

△(空白,またはタブ)

各欄の区切り記号

 

特殊2文字の用途を以下に示します。

表 5.3

特殊2文字とその用途

エスケープ・シーケンス

値(ASCII)

意味

\0

0x00

null文字

\a

0x07

アラート(警告音)

\b

0x08

バックスペース

\f

0x0C

フォーム・フィード(改ページ)

\n

0x0A

ニュー・ライン(改行)

\r

0x0D

キャリッジ・リターン(復帰)

\t

0x09

水平タブ

\v

0x0B

垂直タブ

\\

0x5C

バックスラッシュ

\’

0x27

シングル・クォーテーション

\”

0x22

ダブル・クォーテーション

\?

0x3F

疑問符

\ooo

0〜0377

3桁まで(10進表記で0〜255)の8進数(oは8進数字)

\xhh

0x00〜0xFF

2桁まで(10進表記で0〜255)の16進数(hは16進数字)

 

特殊3文字の用途を以下に示します。

<1>

CR LF,LF

行の区切りを示す文字です。

特殊3文字

リスト出力

CR LF

0x0D0A

LF

0x0A

<2>

HT

ソース・プログラム文のカラム位置を移動させる文字です。リストにはそのまま出力されます。

(b)

文字データ

文字データは,文字定数,文字列定数,および制御命令部を記述するために使用する文字です。

注意

すべての文字(マルチバイト文字を含みます。ただし,OSによってコードは異なります)が記述可能です。

-

英小文字と英大文字は区別して扱います。

-

HT,CR LF,LFの扱いを下記に示します。

 

オブジェクト出力

リスト出力

HT

0x09

0x09(タブはそのまま展開)

CR LF

0x0D0A

0x0D0A

LF

0x0A

0x0A

行の区切り文字であるため,文字データの一部とはみなされません。

(c)

注釈(コメント)用文字

コメントを記述するために使用する文字です。

注意

文字データの文字セットと同一です。

(2)

定数

定数は,それ自身で定まる値を持つもので,イミーディエト・データとも呼びます。

定数には,次の3つがあります。

(a)

数値定数

整定数として,2進数,8進数,10進数,16進数が記述可能です。
整定数,つまり,整数の定数は,32ビット幅をもつ定数です。負の数は2の補数で表現されます。32ビットで表現することのできる値を越える整数値が指定された場合,アセンブラはその整数値の下位32ビットの値を用いて処理を続行します(メッセージは出力しません)。

整定数の種類

表記方法

表記例

2進数

数値の前に“0b”,または“0B”を記述

数値の最後に“b”,または“B”を記述

0b1101,0B1101

1101b,1101B

8進数

数値の前に“0”を記述

数値の最後に“o”,または“O”を記述

074

074o,074O

10進数

数値をそのまま記述

128

16進数

数値の前に“0x”,または“0X”を記述

数値の最後に“h”,または“H”を記述

0xA6,0XA6

6Ah,6AH

 

先頭文字は数字でなければなりません。

例えば,10進数の10を16進数で数値の最後に“H”を付けて表記する場合,先頭に“0”をつけて“0AH”と記述してください。“AH”と記述した場合はシンボルとみなされます。

注意

Prefix表現(0xn…nなど)とSuffix表現(n…nhなど)は,1つのソース上での混在はできません。
オプション-base_number = (prefix | suffix)で表現形式を指定してください。

(b)

文字定数

文字定数は,1つの文字をシングル・クォーテーション(’)で囲むことにより構成され,囲まれた文字の値を示します。

文字の長さは,1とします。

値は,コード値を下位バイトから格納した32ビット値です。上位バイトが空いている場合は0で埋められます。

文字定数

評価値

'A'

0x00000041

' '(空白1個)

0x00000020

(c)

文字列定数

文字列定数は,文字そのものを表す文字の列で,「(1) 文字セット」で示した文字を引用符( " )で囲んだものです。

引用符自体を文字列定数とする場合には,引用符を2個続けて記述します。

文字列定数

評価値

"ab"

0x6162

"A"

0x41

" "(空白1個)

0x20

""

なし

(3)

シンボル

シンボルを参照した場合,そのシンボルに対して定義した値を指定したものとして扱われます。

本アセンブラでのシンボルは,次の種類に分けられます。

-

ネーム

シンボル定義疑似命令のシンボル欄に記述したシンボルです。このシンボルは値を持ちます。

値の範囲は-2147483648〜2147483647(0x80000000〜0x7FFFFFFF)です。

-

ラベル

行の先頭から’:’までの部分に記述したシンボルです。このシンボルはアドレス値を持ちます。

アドレス値の範囲は0〜1048575(0x00000〜0xFFFFF)です。

-

外部参照名

あるモジュールで定義したシンボルを,ほかのモジュールで参照するために,外部参照名定義疑似命令のオペランド欄に記述したシンボルです。このシンボルのアドレス値はアセンブル時には0とし,リンク時に決定されます。

また,参照しているモジュール内に定義がないシンボルも外部参照名とみなされます。

-

セクション名

セクション定義疑似命令のシンボル欄に記述したシンボルです。

このシンボルは,値を持ちません。

-

マクロ名

マクロ定義疑似命令のシンボル欄に記述したシンボルです。マクロ参照時に使用されます。

このシンボルは,値を持ちません。

-

マクロ仮パラメータ名

マクロ定義疑似命令のオペランド欄に記述したシンボルです。

このシンボルは値を持ちません。

 

シンボルの定義時にビット位置指定子を用いて定義したシンボルを,ビット・シンボルと呼びます。

また,シンボルの参照時にビット位置指定を用いる参照を,シンボルのビット参照と呼びます。

 

シンボル欄には,シンボルを記述します。シンボルとは,数値データやアドレスなどに付けた名前のことです。

シンボルを使用することにより,ソースの内容がわかりやすくなります。

(a)

シンボルの種類

シンボル欄に記述できるシンボルは,その使用目的,定義方法によって,次に示す種類に分けられます。

シンボルの種類

使用目的

定義方法

ラベル

ラベルの位置のアドレスを参照するために使用します。

なお,疑似命令に付加されたラベルは,その疑似命令の直前のセクションに含まれるとみなされます。

シンボルのあとにコロン( : )を付けることにより定義します。

ネーム

数値データやアドレスを割り付けて,それらの数値をシンボルとして参照するために使用します。

シンボル定義疑似命令のシンボル欄に記述します。

シンボル欄とニモニック欄は1個以上の空白,またはタブで区切ります。

セクション名

最適化リンカの入力情報として参照するために使用します。

セクション定義疑似命令のシンボル欄に定義します。

シンボル欄とニモニック欄は1個以上の空白,またはタブで区切ります。

マクロ名

ソース中で,マクロ参照時に使用します。

マクロ疑似命令のシンボル欄に記述します。

シンボル欄とニモニック欄は1個以上の空白,またはタブで区切ります。

 

シンボル欄に複数のシンボルを記述することはできません。また,1行にいずれかのシンボルを1個しか定義できません。

(b)

シンボル記述上の規則

シンボルは,次の規則に基づいて記述します。

-

シンボルは,英数字,および英字相当文字(@,_,.)で構成します。
ただし,先頭文字に数字(0〜9)は使用できません。

-

シンボルの最大文字数は4,294,967,294(=0xFFFFFFFE)(理論値)です。ただし,実際には利用可能なメモリ量に依存します。

-

シンボルとして,予約語は使用できません。予約語については,「5.6 予 約 語」を参照してください。
また,デバイス・ファイル読み込み時には,SFR略号,および拡張SFR略号をシンボルとして定義することもできません。SFR略号,および拡張SFR略号の詳細は,デバイスのユーザーズ・マニュアルを参照してください。

-

同一シンボルを二度以上定義することはできません。
ただし,.SET疑似命令で定義したシンボルは,.SET疑似命令で再定義することができます。

-

ラベルを記述する場合は,ラベルの直後にコロン( : )を記述します。
それ以外は空白,またはタブでニモニック欄と区切ります。

 

正しいシンボルの例を以下に示します。

CODE01  .CSEG               ; “CODE01”はセクション名
VAR01   .EQU    0x10        ; “VAR01”はネーム
LAB01:  .DB2    0           ; “LAB01”はラベル

 

誤ったシンボルの例を以下に示します。

1ABC    .EQU    0x3         ; 先頭文字に数字は使用できません。
LAB     MOV     A, r10      ; “LAB”ラベルです。ニモニック欄とコロン( : )で区切ります。
FLAG:   .EQU    0x10        ; ネームにはコロン( : )が必要ありません。

 

シンボルのみで構成される文の例を以下に示します。

ABCD:                       ; ABCDがラベルとして定義されます。

(c)

シンボルに関する注意事項

アセンブラ生成シンボル(5.7 アセンブラ生成シンボルを参照)を記述する場合,多重定義でエラーとなる可能性があるので,アセンブラ生成シンボルは使用しないでください。

また,セクション定義疑似命令でセクション名が指定されなかったときは,アセンブラがセクション名を自動生成する場合があるので注意しなければなりません。

(4)

ニモニック

ニモニック欄には,インストラクションのニモニック,疑似命令,およびマクロ参照を記述します。

オペランドの必要なインストラクションや疑似命令,マクロ参照の場合,ニモニック欄とオペランド欄を1つ以上の空白,またはタブで区切ります。

ただし,インストラクションの第1オペランドの先頭が“#”,“$”,“ ! ”,“ [ ”,“ (”の場合には,ニモニックと第1オペランドの間に何もなくても,正常にアセンブルが行われます。

正しい例を以下に示します。

MOV     A, #1

 

誤った例を以下に示します。

MOVA, #1        ; ニモニック欄とオペランド欄の間に,空白がありません。
MO V    A, #1   ; ニモニック中に空白があります。
MOVE    A, #1   ; ニモニック欄に記述できない命令です。

(5)

オペランド

オペランド欄には,インストラクションや疑似命令,およびマクロ参照の実行に必要なデータ(オペランド)を記述します。

各インストラクションや疑似命令により,オペランドを必要としないものや,複数のオペランドを必要とするものがあります。

2個以上のオペランドを記述する場合には,各オペランドをコンマ( , )で区切ります。なお,コンマの前後には任意の個数の空白,またはタブを記述することができます。

(6)

コメント

コメント欄には,行頭のシャープ(#),または,行中のセミコロン( ; )のあとにコメント(注釈)を記述します。

コメント欄は,シャープ,または,セミコロンからその行の改行コード,またはEOFまでです。

コメントを記述することにより,理解しやすいソースを作成できます。

コメント欄の記述は,アセンブル処理の対象とはならず,そのままアセンブル・リストに出力されます。

記述可能な文字は,「(1) 文字セット」に示すものです。

# これは コメント です
HERE:   MOV     A, #0x0F        ; これは コメント です
;
;       BEGIN LOOP HERE
;