マクロ (2)

%assign
%assign は、数値のみを持つ単一行マクロを定義します。
引数は指定できません。

定義部分は式の形で指定でき、%assign が処理された時に一度だけ評価され、結果の数値が値となります。

%assign test1 (1+2)
%define test2 (1+2)

test1 ; 3
test2 ; (1+2)
文字列のマクロ
以下は、文字列に関する処理を行った上で、生成された値を、単一行マクロとして定義します。

文字列が生成される場合、囲む引用符 (" ' `) は、内容に応じて変更される場合があります。

これらは、複数行マクロを呼び出す時と同じで、引数は () で囲まず、カンマで区切って渡します。
%strcat
引用符で囲まれた複数の文字列を連結して、単一行マクロとして定義します。

%strcat test1 "abcd", "1234", '"'
test1 ; 'abcd1234"'
%strlen
文字列の長さを、数値としてマクロに定義します。

%strlen test1 "123456"
test1 ; 6
%substr
文字列内から部分文字列を取り出し、マクロに定義します。

引数は、「文字列」「開始位置」「長さ」の順です。

開始位置は 1〜です。範囲外の部分は空の文字列になります。
長さは、正か負の値です。負の場合、-1 で文字列の終端までになります。省略した場合、1 になります。

%substr test1 "123456", 3
%substr test2 "123456", 4,2
%substr test3 "123456", 2,-2
%substr test4 "123456", 6,2

test1 ; '3'
test2 ; '45'
test3 ; '2345'
test4 ; '6' (終端まで)
標準マクロ
NASM によって、標準で定義されているマクロがいくつかあります。

ver 2.15 より前は __FOO__ という形式でしたが、現在は __?FOO?__ という形式になっています。
以前のバージョンとの互換性を保つため、以前の形式でのエイリアスも定義されています。

標準マクロのうち、よく使用しそうなものだけ紹介します。

__?NASM_MAJOR?__NASM のメジャーバージョン
__?NASM_MINOR?__マイナーバージョン
__?NASM_SUBMINOR?__サブマイナーバージョン
__?NASM_PATCHLEVEL?__パッチレベル
__?NASM_VER?__NASM バージョンを示す文字列
__?NASM_VERSION_ID?__NASM のバージョンを示す 32bit 整数。
__?NASM_MAJOR?__
__?NASM_MINOR?__
__?NASM_SUBMINOR?__
__?NASM_PATCHLEVEL?__
上記の4つのバイト値を、上位バイトから順に連結する。
__?FILE?__現在の入力ファイル名の文字列
__?LINE?__現在位置の行番号
__?OUTPUT_FORMAT?__出力フォーマット (文字列ではない)

__?NASM_MAJOR?__       ; 2
__?NASM_MINOR?__       ; 16
__?NASM_SUBMINOR?__    ; 1
__?NASM_PATCHLEVEL?__  ; 0
__?NASM_VER?__         ; "2.16.01"
__?NASM_VERSION_ID?__  ; 002100100h
__?FILE?__             ; 'test.asm'
__?LINE?__             ; 8
__?OUTPUT_FORMAT?__    ; elf64