5.2.5 マクロ制御擬似命令

制御命令自身はデータを生成しません。命令に対する機械語コードの生成を制御する制御命令です。アドレスの更新は行いません。

マクロ機能および繰り返しマクロ機能を定義するための制御命令です。

表 5.30

マクロ制御命令

制御命令

機能内容

.MACRO

マクロ名を定義します。マクロボディの始まりを定義します。

.EXITM

マクロボディの展開を中止します。

.LOCAL

マクロ内ローカルラベルを宣言します。

.ENDM

マクロボディの終了を示します。

.MREPEAT

繰り返しマクロボディの始まりを示します。

.ENDR

繰り返しマクロボディの終了を示します。

..MACPARA

マクロ呼び出しの実引数の個数を値として持ちます。

..MACREP

繰り返しマクロボディの展開回数を値として持ちます。

.LEN

指定した文字列の文字数を値として持ちます。

.INSTR

指定した文字列の中で指定した文字列の始まる位置を値として持ちます。

.SUBSTR

指定した文字列の中で指定した位置から指定した文字数分の文字を切り出します。

.MACRO

マクロ名を定義します。

 

[指定形式]

[マクロ定義]
△<マクロ名>△.MACRO[<仮引数>[,...]]
△ボディ
△.ENDM
[マクロ呼び出し]
△<マクロ名>△[<実引数>[,...]]

[詳細説明]

マクロ名を定義します。

マクロ定義の始まりを示します。

 

例1

[マクロ定義例]

name .MACRO string

.BYTE 'string'

.ENDM

 

[マクロ呼び出し例1]

name "name,address"

 

マクロ展開後コード

.BYTE 'name,address'

 

[マクロ呼び出し例2]

name(name,address)

 

マクロ展開後コード

.BYTE '(name,address)'

 

例2

[マクロ定義例]

mac .MACRO p1,p2,p3

.IF ..MACPARA == 3

.IF 'p1' == 'byte'

MOV.B #p2,[p3]

.ELSE

MOV.W #p2,[p3]

.ENDIF

.ELIF ..MACPARA == 2

.IF 'p1' == 'byte'

MOV.B #p2,[R3]

.ELSE

MOV.W #p2,[R3]

.ENDIF

.ELSE

MOV.W R3,R1

.ENDIF

.ENDM

 

[マクロ呼び出し例]

mac word,10,R3

 

マクロ展開後コード

.IF 3 == 3

.ELSE

MOV.W #10,[R3]

.ENDIF

 

[備考]

マクロ名は必ず記述してください。

マクロ名は、「4.1.2 名前」の「名前の記述規則」に従ってください。

マクロ仮引数の名前は、「4.1.2 名前」の「名前の記述規則」に従ってください。

マクロ仮引数の名前は、ネストしているマクロ定義を含めて、異なる名前で定義してください。

仮引数を複数定義する場合は、仮引数をカンマ(,)で区切って記述してください。

制御命令".MACRO"のオペランドに記述した仮引数は、必ずマクロボディ内に記述してください。

マクロ名と実引数の間には、必ず空白文字またはタブを記述してください。

実引数は、マクロ呼び出しの際に仮引数に対応させて記述してください。

特殊文字を実引数に記述する場合は、ダブルクォーテーションで囲って記述してください。

実引数には、ラベル、グローバルラベルおよびシンボルが記述できます。

実引数には式が記述できます。

仮引数と実引数は、左から記述されている順に置き換えられます。

仮引数が定義されていて、マクロ呼び出しで実引数の記述がない場合は、仮引数にあたる部分のコードは出力されません。

仮引数の数が、実引数の数より多い場合は、対応する実引数がない仮引数にあたる部分のコードは出力されません。

ボディに記述した仮引数をシングルクォーテーション(')で囲った場合は、対応する実引数をシングルクォーテーションで囲って出力されます。

1つの実引数がカンマ(,)を含む場合に、括弧(())で囲った場合は、括弧を含めて変換されます。

実引数の数が、仮引数の数より多い場合は、対応する仮引数がない実引数については処理されません。

ダブルクォーテーションで囲った文字列は、全てその文字列そのものを示します。仮引数をダブルクォーテーションで囲わないでください。

仮引数は80個まで記述できます。

1行に記述できる文字数の範囲内で最大80個まで記述できます。

実引数と仮引数の数が合わない場合は、アセンブラはウォーニングメッセージを出力します。

 

.EXITM

マクロボディの展開を中止し、最も近い".ENDM"に制御を渡します。

 

[指定形式]

.EXITM

[詳細説明]

マクロボディの展開を中止し、最も近い".ENDM"に制御を渡します。

 

[マクロ定義例]

data1 .MACRO value

.IF value == 0

.EXITM

.ELSE

.BLKB value

.ENDIF

.ENDM

 

[マクロ呼び出し例]

data1 0

 

マクロ展開後コード

.IF 0 == 0

.EXITM

.ENDIF

 

[備考]

マクロ定義のボディ内に記述してください。

 

.LOCAL

オペランドに記述されたラベルがマクロローカルラベルであることを宣言します。

 

[指定形式]

.LOCAL△<ラベル名>[,...]

[詳細説明]

オペランドに記述されたラベルがマクロローカルラベルであることを宣言します。

マクロローカルラベルは、異なるマクロ定義およびマクロ定義外であれば、同一の名前を複数個記述できます。

name .MACRO

.LOCAL m1; 'm1' is macro local label

m1:

nop

bra m1

.ENDM

 

[備考]

本制御命令は、必ずマクロボディ内に記述してください。

本制御命令とオペランドの間には、必ず空白文字またはタブを記述してください。

本制御命令によるマクロローカルラベル宣言は、ラベル名を定義するより前に記述してください。

マクロローカルラベル名は、「4.1.2 名前」の「名前の記述規則」に従ってください。

本制御命令のオペランドは、カンマで区切って複数のラベルを記述できます。このときの最大ラベル数は100個までです。

マクロ定義がネストしている場合は、マクロ定義内で定義を行っているマクロ内のマクロローカルラベルは、同一名を使用できません。

インクルードファイルの内容を含む、1つのアセンブリ言語ファイルに記述できるマクロローカルラベルは65535個までです。

 

.ENDM

1つのマクロ定義のボディが終了することを示します。

 

[指定形式]

<マクロ名>△.MACRO
△ボディ
△.ENDM

[詳細説明]

1つのマクロ定義のボディが終了することを示します。

 

[マクロ定義例]

lda .MACRO value

MOV.L #value,R3

.ENDM

 

[マクロ呼び出し例]

lda 0 ; MOV.L #0,R3に展開される

 

.MREPEAT

繰り返しマクロの始まりを示します。

 

[指定形式]

[<ラベル>:]△.MREPEAT△<数値>
△ボディ
△.ENDR

[詳細説明]

繰り返しマクロの始まりを示します。

ボディを指定した数値回、繰り返して展開します。

繰り返し回数は、1から65535の間の数を指定できます。

65535レベルまでのネストができます。

本制御命令を記述した場所に、マクロボディを展開します。

[マクロ定義例]

rep .MACRO num

.MREPEAT num

.IF num > 49

.EXITM

.ENDIF

nop

.ENDR

.ENDM

 

[マクロ呼び出し例]

rep 3

 

マクロ展開後コード

nop

nop

nop

 

[備考]

オペランドは必ず記述してください。

本制御命令とオペランドの間には、必ず空白文字またはタブを記述してください。

本制御命令行の先頭にラベルを記述できます。

オペランドには、シンボルを記述できます。

前方参照となるシンボルは記述できません。

オペランドには、式が記述できます。

ボディには、マクロ定義およびマクロ呼び出しが記述できます。

ボディ内に制御命令".EXITM"を記述できます。

 

.ENDR

繰り返しマクロの終了を示します。

 

[指定形式]

[<ラベル>:]△.MREPEAT△<数値>
△ボディ
△.ENDR

[詳細説明]

繰り返しマクロの終了を示します。

 

[備考]

必ず制御命令".MREPEAT"に対応させて記述してください。

..MACPARA

マクロ呼び出しの実引数の個数を示します。

 

[指定形式]

..MACPARA

[詳細説明]

マクロ呼び出しの実引数の個数を示します。

".MACRO"によるマクロ定義のボディ内に記述できます。

 

マクロ実引数の数を判断して、条件アセンブルを行います。

 

;[マクロ定義例]

.GLB mem

name .MACRO f1,f2

.IF ..MACPARA == 2

ADD f1,f2

.ELSE

ADD f1,R3

.ENDIF

.ENDM

 

;[マクロ呼び出し例]

name #mem

 

;マクロ展開後コード

.IF 1 == 2

.ELSE

ADD #mem,R3

.ENDIF

 

[備考]

本制御命令は式の項として記述できます。

".MACRO"によるマクロボディの外に記述した場合、値は0となります。

.MACREP

繰り返しマクロが展開されている回数を示します。

 

[指定形式]

.MACREP

[詳細説明]

繰り返しマクロが展開されている回数を示します。

".MREPEAT"によるマクロ定義のボディ内に記述できます。

条件アセンブルのオペランドに記述できます。

[マクロ定義例]

mac .MACRO value,reg

.MREPEAT value

MOV.B #0,..MACREP[reg]

.ENDR

.ENDM

 

[マクロ呼び出し例]

mac 3,R3

 

マクロ展開後コード

MOV.B #0,1[R3]

MOV.B #0,2[R3]

MOV.B #0,3[R3]

 

[備考]

本制御命令は式の項として記述できます。

".MACRO"によるマクロボディの外に記述した場合、値は0となります。

 

.LEN

オペランドに記述した文字列の長さを示します。

 

[指定形式]

.LEN△{"<文字列>"}
.LEN△{'<文字列>'}

[詳細説明]

オペランドに記述した文字列の長さを示します。

 

[マクロ定義例]

bufset .MACRO f1

buffer: .BLKB .LEN{'f1'}

.ENDM

 

[マクロ呼び出し例]

bufset Sample

 

マクロ展開後コード

buffer: .BLKB 6

 

[備考]

オペランドは、必ず{}で囲ってください。

本制御命令とオペランドの間に空白文字またはタブが記述できます。

文字列には、空白文字およびタブを含む文字が記述できます。

文字列は、必ずクォーテーションで囲って記述してください。

本制御命令を式の項に記述できます。

マクロの実引数の文字列長を求める場合は、仮引数名をシングルクォーテーションで囲って記述してください。ダブルクォーテーションで囲った場合は、仮引数として指定した文字列の長さを示します。

 

.INSTR

オペランドで指定した文字列のなかで、検出文字列が始まる位置を示します。

 

[詳細説明]

オペランドで指定した文字列のなかで、検出文字列が始まる位置を示します。

文字列の検索を開始する位置を指定できます。

 

指定した文字列(japanese)の先頭(top)からの、"se"文字列の位置(7)を取り出します。

 

[マクロ定義例]

top .EQU 1

point_set .MACRO source,dest,top

point .EQU .INSTR{'source','dest',top}

.ENDM

 

[マクロ呼び出し例]

point_set japanese,se,1

 

マクロ展開後コード

point .EQU 7

 

[備考]

オペランドは、必ず{}で囲ってください。

文字列、検出文字列および検索開始位置は、必ず記述してください。

文字列、検出文字列および検索開始位置は、カンマで区切って記述してください。

カンマの前後には、空白文字およびタブは記述できません。

検索開始位置は、シンボルを記述できます。

検索開始位置を1とした場合は、文字列の先頭を示します。

本制御命令は、式の項に記述できます。

文字列よりも、検索文字列が長い場合の値は0となります。文字列のなかに、検索文字列が含まれていなかった場合の値は0となります。文字列の長さよりも、検索開始位置の値が大きかった場合の値は0となります。

マクロの実引数を検出条件としてマクロを展開したい場合は、仮引数名をシングルクォーテーションで囲って記述してください。ダブルクォーテーションで囲って記述した場合は、その文字列を検出条件としてマクロを展開します。

 

.SUBSTR

文字列の指定した位置から、指定した文字列を取り出します。

 

[指定形式]

.SUBSTR△{ "<文字列>",<切り出し開始位置>,<切り出し文字数> }
.SUBSTR△{ '<文字列>',<切り出し開始位置>,<切り出し文字数> }

[詳細説明]

文字列の指定した位置から、指定した文字列を取り出します。

マクロの実引数として与えられた文字列の長さを、".MREPEAT"のオペランドに与えます。

"..MACREP"は、".BYTE"の行を1回展開するごとに、1→2→3→4と増加します。

したがって、マクロの実引数として与えられた文字列の先頭から順に1文字ずつ、".BYTE"のオペランドに与えることになります。

 

[マクロ定義例]

name .MACRO data

.MREPEAT .LEN{'data'}

.BYTE .SUBSTR{'data',..MACREP,1}

.ENDR

.ENDM

 

[マクロ呼び出し例]

name ABCD

 

マクロ展開後コード

.BYTE "A"

.BYTE "B"

.BYTE "C"

.BYTE "D"

 

[備考]

オペランドは、必ず{}で囲ってください。

文字列、切り出し開始位置および切り出し文字数は、必ず記述してください。

文字列、切り出し開始位置および切り出し文字数は、カンマで区切って記述してください。

切り出し開始位置および切り出し文字数には、シンボルが記述できます。切り出し開始位置を1とした場合は、文字列の先頭を示します。

文字列には、空白文字およびタブを含む文字が記述できます。

文字列は、必ずクォーテーションで囲って記述してください。

文字列の長さよりも切り出し開始位置の値が大きい場合の値は0となります。文字列の長さよりも切り出し文字数の値が大きい場合の値は0となります。切り出し文字数を0とした場合の値は0となります。

マクロの実引数を切り出し条件としてマクロを展開したい場合は、仮引数名をシングルクォーテーションで囲って記述してください。ダブルクォーテーションで囲って記述した場合は、その文字列を切り出し条件としてマクロを展開します。