L.Entisの日記: 【MASM談義】 6. マクロ関数
日記 by
L.Entis
マクロ関数は値(リテラル文字列)を返すマクロです。
これは C 言語の #define ディレクティブに似ています。
基本的に通常のマクロと同じ記述を用いますが、マクロが返す値は EXITM で記述します。
例えば、階乗を計算するマクロ関数は
factorial MACRO num:REQ
IF (num) LE 1
EXITM <1>
ENDIF
EXITM %(factorial( %((num) - 1) ) * (num))
ENDM
と記述することが出来、例えば
mov eax, factorial(4)
は
mov eax, 24
と同じ意味です。
以下のマクロ関数はシステムで定義されています。
@CatStr @InStr @SizeStr @SubStr
例えば
REG_NAME_0 TEXTEQU <eax>
REG_NAME_1 TEXTEQU <ebx>
REG_NAME_2 TEXTEQU <ecx>
REG_NAME_3 TEXTEQU <edx>
@reg MACRO reg_num:REQ
IF ((reg_num) LT 0) OR ((reg_num) GT 3)
.ERR
ENDIF
EXITM @CatStr( <REG_NAME_>, %(reg_num) )
ENDM
mov @reg(0), @reg(1)
は
mov eax, ebx
と展開されます。
(@CatStr マクロは、二つのリテラル文字列を結合します)
▼ 【MASM談義】 0. 導入編
これは C 言語の #define ディレクティブに似ています。
基本的に通常のマクロと同じ記述を用いますが、マクロが返す値は EXITM で記述します。
例えば、階乗を計算するマクロ関数は
factorial MACRO num:REQ
IF (num) LE 1
EXITM <1>
ENDIF
EXITM %(factorial( %((num) - 1) ) * (num))
ENDM
と記述することが出来、例えば
mov eax, factorial(4)
は
mov eax, 24
と同じ意味です。
以下のマクロ関数はシステムで定義されています。
@CatStr @InStr @SizeStr @SubStr
例えば
REG_NAME_0 TEXTEQU <eax>
REG_NAME_1 TEXTEQU <ebx>
REG_NAME_2 TEXTEQU <ecx>
REG_NAME_3 TEXTEQU <edx>
@reg MACRO reg_num:REQ
IF ((reg_num) LT 0) OR ((reg_num) GT 3)
.ERR
ENDIF
EXITM @CatStr( <REG_NAME_>, %(reg_num) )
ENDM
mov @reg(0), @reg(1)
は
mov eax, ebx
と展開されます。
(@CatStr マクロは、二つのリテラル文字列を結合します)
▼ 【MASM談義】 0. 導入編
【MASM談義】 6. マクロ関数 More ログイン