2.3 アセンブラ言語
2.3.2 アセンブラで有効な文字
アセンブラで有効な1文字のシーケンスがいくつかあります。文字の中には、使用されているコンテキス トによって異なる意味を持つものもあります。式の評価に関連する特殊文字については、"2.4 オペラン ドと式"で説明しています。その他のアセンブラ有効文字には、次のようなものがあります。
; - コメント区切り文字
¥ - 行連結文字
またはマクロのダミー引数連結演算子
? - マクロの値置換演算子
% - マクロの16進値置換演算子
^ - マクロのローカルラベル演算子
" - マクロの文字列区切り文字
または引用符が付いた文字列のDEFINE展開文字
@ - 関数区切り文字
* - ロケーションカウンタの置換演算子 [] - ロケーションアドレッシングモード演算子
# - 即値アドレッシングモード演算子
それぞれのアセンブラ特殊文字については、この後説明します。それぞれの説明では、使用法のガイドラ イン、機能の説明、例などを紹介します。
;
コメント区切り文字
セミコロン(;)の後にある数字や文字で、リテラル文字列の一部でないものは、コメントと見なされます。
コメントは、アセンブラにとっては無意味なものですが、ソースプログラムの記録を残すときに使用する ことができます。コメントは、アセンブラ出力リストでは再生成され、マクロ定義では保持されます。
コメントを記述するとき、1行全部を使用することもできますが、最後の有意なアセンブラフィールドの後 に置くこともできます。コメントは、リストファイルでも、元のように再生されます。
例:
; This comment begins in column 1 of the source file Loop: CALL [COMPUTE] ; This is a trailing comment
; These two comments are preceded
; by a tab in the source file
¥ (\)
行連結文字またはマクロのダミー引数連結演算子 行連結
円記号(¥)またはバックスラッシュ(\)は、行の最後に使用された場合、そのソース文が次の行に継続するこ とをアセンブラに指示します。連結行は、ソース文の前の行に連結されて、結果的に単一のソース文であ るかのように処理されます。ソース文の最大長(最初の行と継続行)は512文字です。
例:
; THIS COMMENT ¥ EXTENDS OVER ¥ THREE LINES
マクロのダミー引数連結演算子
円記号(¥)またはバックスラッシュ(\)は、マクロのダミー引数を隣接する他の英数字と連結するときに使用 することもできます。ダミー引数を認識するマクロプロセッサの場合、通常、シンボル以外の文字を使用 して、ダミー引数を他の英数字と区別する必要があります。ただし、場合によっては、引数文字を他の文 字と連結する方が良い場合もあります。引数を他のシンボル文字の前または後に連結する場合、バックス ラッシュをそれぞれ後または前に置く必要があります。
"2.5.5.1 ダミー引数連結演算子 - ¥"も参照してください。
例:
ソース入力ファイルに次のマクロ定義があると仮定します。
SWAP_MEM MACRO REG1,REG2 ;swap memory contents LD A,[I¥REG1] ;using A as temp LD B,[I¥REG2] ;using B as temp LD [I¥REG1],B
LD [I¥REG2],A ENDM
連結演算子(¥)は、ダミー引数の置換文字を、いずれの場合も文字@に連結するよう、マクロプロセッサに 対して指示します。このマクロが次の文で呼び出された場合、
SWAP_MEM X,Y 結果は次のように展開されます。
LD A,[IX]
LD B,[IY]
LD [IX],B
LD [IY],A
?
シンボル文字の戻り値
?symbolシーケンスがマクロ定義で使用された場合、symbolの値を示すASCII文字列で置換されます。この演 算子は、連結演算子(¥)と同等の方法で使用できます。symbolの値は整数でなければなりません。
"2.5.5.2 戻り値演算子 - ?"も参照してください。
例:
次のマクロ定義があると仮定します。
SWAP_MEM MACRO REG1,REG2 ;swap memory contents LD A,[_lab¥?REG1] ;using A as temp LD B,[_lab¥?REG2] ;using B as temp LD [_lab¥?REG1],B
LD [_lab¥?REG2],A ENDM
ソースファイルに次のSET文とマクロ呼び出しがある場合、
AREG SET 1 BREG SET 2
SWAP_MEM AREG,BREG
ソースリストに書き出される展開結果は次のようになります。
LD A,[_lab1]
LD B,[_lab2]
LD [_lab1],B LD [_lab2],A
%
シンボル文字の16進戻り値
%symbolシーケンスがマクロ定義で使用された場合、symbolの16進値を示すASCII文字列で置換されます。
この演算子は、連結演算子(¥)と同等の方法で使用できます。symbolの値は整数でなければなりません。
"2.5.5.3 戻り16進値演算子 - %"も参照してください。
例:
次のマクロ定義があると仮定します。
GEN_LAB MACRO LAB,VAL,STMT LAB¥%VAL: STMT
ENDM
このマクロが次のように呼び出された場合、
NUM SET 10
GEN_LAB HEX,NUM,'NOP'
リストファイルに書き出される展開結果は次のようになります。
HEXA: NOP
^
マクロのローカルラベル演算子
アクセント記号(^)が、マクロ定義で単一の演算子として使用された場合、対応するローカルラベルの名前 が無効になります。通常、マクロプリプロセッサは、マクロ展開にローカルラベルがある場合、現在のモ ジュールでは標準のラベルにしておきます。ローカルラベル文字(^)を使用すると、そのラベルは固有のラ ベルになります。これは、先行するアンダースコアを削除して固有の文字列"̲̲M̲Lxxxxxx"(ただし"xxxxxx"
は固有の順序番号)を追加することで実行します。^演算子は、マクロ展開外では何の影響も与えません。
^演算子は、マクロでローカルラベル名として使用されるマクロ引数としてラベル名を渡すときに使用する と便利です。アクセント記号は、2進数の排他的論理和演算子としても使用されます。
"2.5.5.5 マクロのローカルラベル演算子 - ^"も参照してください。
例:
次のマクロ定義があると仮定します。
LOAD MACRO ADDR ADDR:
LD A,[ADDR]
^ADDR:
LD A,[^ADDR]
ENDM
このマクロが次のように呼び出された場合、
LOAD _LOCAL
リストファイルに書き出される展開結果は次のようになります。
_LOCAL:
LD A,[_LOCAL]
_LOCAL__M_L000001:
LD A,[_LOCAL__M_L000001]
"
マクロの文字列区切り文字または引用符が付いた文字列のDEFINE展開文字 マクロ文字列
二重引用符(")は、マクロ定義で使用された場合、マクロプロセッサによって文字列の区切り文字、一重引 用符(')に変換されます。マクロプロセッサは、マクロ引数の二重引用符の間にある文字を調べます。この メカニズムにより、マクロ引数をリテラル文字列として使用することができます。
"2.5.5.4 ダミー引数文字列演算子 - ""も参照してください。
例:
次のマクロ定義と
CSTR MACRO STRING ASCII "STRING"
ENDM
次のマクロ呼び出しを使用すると、
CSTR ABCD 展開結果は次のようになります。
ASCII 'ABCD' 引用符が付いた文字列のDEFINE展開
文字シーケンスが、引用符の付いた文字列に含まれる場合、DEFINE擬似命令で作成されたシンボルと一致 する一連の文字は展開されません。アセンブラの文字列は一般的に一重引用符(')で囲みます。文字列が二 重引用符(")で囲まれている場合、DEFINEシンボルはその文字列内で展開されます。他の点では、二重引 用符は、一重引用符と同じです。
例:
次のようなソースがあると仮定します。
DEFINE LONG 'short' STR_MAC MACRO STRING
MSG 'This is a LONG STRING' MSG "This is a LONG STRING"
ENDM
このマクロが次のように呼び出された場合、
STR_MAC sentence 展開結果は次のようになります。
MSG 'This is a LONG STRING' MSG 'This is a short sentence'
@
関数区切り文字
すべてのアセンブラ組み込み関数は、最初に@シンボルが付いています。これらの関数の詳細については、
"2.4.4 関数"を参照してください。
例:
SVAL EQU @ABS(VAL) ; Obtain absolute value
*
ロケーションカウンタの置換
アスタリスクは、式のオペランドとして使用された場合、ランタイムロケーションカウンタの現在の整数 値を示します。
例:
DEFSECT ".CODE", CODE AT 100H SECT ".CODE"
XBASE EQU *+20H ; XBASE = 120H
[]
ロケーションアドレッシングモード演算子
角かっこは、ロケーションアドレッシングモードを使用するようアセンブラに指示するときに使用します。
例:
LD A,[_Value]
#
即値アドレッシングモード
ポンド記号(#)は、即値アドレッシングモードを使用するようアセンブラに指示するときに使用します。
例:
CNST EQU 5H
LD A,#CNST ;Load A with the value 5H