MACRO、MEND

MACRO ディレクティブは、マクロ定義の開始位置をマークします。マクロ拡張は、MEND ディレクティブで終了します。

Show/hide構文

マクロの定義には 2 つのディレクティブを使用します。構文は以下のとおりです。

          MACRO
{$label}  macroname{$cond} {$parameter{,$parameter}...}
          ; code
          MEND

各パラメータには以下の意味があります。

$label

マクロが呼び出されたときに、指定されたシンボルが代入されるパラメータを指定します。通常、このシンボルはラベルです。

macroname

マクロの名前を指定します。命令またはディレクティブの名前で始まる名前は付けられません。

$cond

条件コードを含んでいるように設計された特別なパラメータです。有効な条件コード以外の値も許可されます。

$parameter

マクロが呼び出されたときに値が代入されるパラメータを指定します。パラメータのデフォルト値は、以下の形式を使用して設定できます。

$parameter="default value"

デフォルト値にスペースが含まれているか、または値の前後のいずれかにスペースがある場合は、二重引用符を使用する必要があります。

Show/hide使用法

マクロ内で WHILE...WEND ループまたは IF...ENDIF 条件を始める場合は、MEND ディレクティブに到達する前にこのループまたは条件を閉じる必要があります。ループ内からの終了時など、マクロからの早期終了を可能にする必要がある場合は、MEXIT を使用して下さい。

マクロ本体内では、$label$parameter または $cond などのパラメータは他の変数と同じように使用できます。これらのパラメータには、マクロが呼び出されるたびに新しい値が渡されます。パラメータを通常のシンボルと区別するには、先頭に $ を付ける必要があります。パラメータはいくつでも使用できます。

$label は省略可能ですが、マクロによって内部ラベルが定義される場合に役立ちます。このラベルは、マクロへのパラメータとして処理されますが、必ずしも、マクロ拡張の最初の命令を表す必要はありません。マクロでは、すべてのラベルの位置が定義されます。

パラメータのデフォルト値を使用するには、| を引数として使用します。この引数が省略されている場合は、空の文字列が使用されます。

複数の内部ラベルを使用するマクロでは、各内部ラベルを、異なる接尾文字の付いたベースラベルとして定義すると役立ちます。

拡張にスペースが不要な場合には、パラメータとそれに続くテキストの間、またはパラメータとパラメータの間にはドット(.)を使用します。ただし、パラメータとその前のテキストの間にはドットは使用しないで下さい。

条件コードには、$cond パラメータを使用できます。単項演算子 :REVERSE_CC: を使用して、条件コードの逆数を検索し、:CC_ENCODING: を使用して、条件コードの 4 ビットエンコーディングを検索します。

マクロでは、ローカル変数の有効範囲を定義します。

マクロはネストできます。

Show/hide

 ; マクロ定義
                MACRO                 ; マクロ定義開始
$label          xmac    $p1,$p2
                ; コード
$label.loop1    ; コード
                ; コード
                BGE     $label.loop1
$label.loop2    ; コード
                BL      $p1
                BGT     $label.loop2
                ; コード
                ADR     $p2
                ; コード
                MEND                  ; マクロ定義終了
 ; マクロの呼び出し
abc             xmac    subr1,de      ; マクロを呼び出す
                ; コード                ; これが
abcloop1        ; コード                ; xmac マクロの
                ; コード                ; 拡張時に
                BGE     abcloop1      ; 生成される
abcloop2        ; コード
                BL      subr1
                BGT     abcloop2
                ; コード
                ADR     de
                ; コード

マクロを使用したアセンブリ時の診断を以下に示します。

        MACRO                        ; マクロ定義
        diagnose  $param1="default"  ; このマクロにより
        INFO      0,"$param1"        ; 第 2 アセンブリパスで
        MEND                         ; アセンブリ時の診断が生成される
 ; マクロ拡張
        diagnose            ; アセンブリ時に空白行を出力する
        diagnose "hello"    ; アセンブリ時に "hello" を出力する
        diagnose |          ; アセンブリ時にデフォルトを出力する

Note

変数も引数として渡される場合、| を使用すると、一部の変数が代入されないままになる場合があります。この問題を回避するには、|LCLS または GBLS 変数で定義し、この変数を | の代わりに引数として渡します。以下に例を示します。

        MACRO                ; マクロ定義
        m2 $a,$b=r1,$c       ; $b のデフォルト値は r1
        add $a,$b,$c         ; マクロは $b と $c を加算して、結果を $a に代入
        MEND                 ; マクロの終了

        MACRO                ; マクロ定義
        m1 $a,$b             ; このマクロは $b を r1 に加算して、結果を $a に代入
        LCLS def             ;  | のためのローカル文字列変数を宣言
def     SETS "|"             ; | を定義
        m2 $a,$def,$b        ; マクロ m2 を | の代わりに $def で呼び出して
                             ; 2 番目の引数にデフォルト値を使用。
        MEND                 ; マクロの終了

Show/hide条件付きマクロの例

        AREA    codx, CODE, READONLY

; マクロ定義

        MACRO
        Return$cond
        [ {ARCHITECTURE} <> "4"
          BX$cond lr
          |
          MOV$cond pc,lr
        ] 
        MEND

; マクロの呼び出し

fun     PROC
        CMP      r0,#0
        MOVEQ    r0,#1
        ReturnEQ
        MOV      r0,#0
        Return
        ENDP

        END

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0489FJ
Non-ConfidentialID111211