彙編在做c標頭檔移植的時候,總覺得db dw dd dq的類型有些生硬,不具可讀性,並且對於win32,win64的結構需要維護兩份。於是寫了個fasm的typedef宏(與c的寫法相同),可用於結構體定義,資料定義,函數的局部變數local 定義中。
;---===---;---===---fasm typedef macro by G-Spider @2013;---===---macro macro@typedef base,[type] { forward struc type [v] \{ \common match any, v \\{ . base v \\} match , v \\{ . base ? \\} \} macro type [v] \{ \common match any, v \\{ base v \\} match , v \\{ base ? \\} \} virtual at 0 base ? sizeof.#type=$ end virtual} macro typedef [statement] { common match gs@base gs@type,statement \{ macro@typedef gs@base,gs@type \}}for example:;聲明typedef dd SDWORDtypedef SDWORD DWORD,INT32,LONGtypedef db CHAR,BYTE_WIN64 equ FALSEmatch =TRUE ,_WIN64{typedef dq PVOID}match =FALSE,_WIN64{typedef dd PVOID} typedef PVOID HANDLE,PSTR,PWSTR;....................;結構定義struc point x,y{ .: .x SDWORD x .y INT32 y .size = $ - .}struct SIZE cx LONG ? cy LONG ?ends;....................;資料定義m1 SDWORD 12,13,14,sizeof.DWORDm2 INT32 12,13,14,sizeof.INT32my point 7,my.sizeINT32m3 INT32 ;....................;函數的局部資料定義proc WindowProc uses ebx esi edi,hwnd,wmsg,wparam,lparam local hDC:HANDLE local mySize:SIZE
注意到:
version 1.70 (Apr 17, 2012):
[+] Macroinstruction argument now can have default value, defined with "="
symbol followed by value after the argument name in definition.
所以對於1.7及以上版本,可以簡寫成:
macro typedef [statement*] { common match gs@base gs@type,statement \{ irp type,gs@type \\{ struc type [v=?] \\\{ \\\common . gs@base v \\\} macro type [v=?] \\\{ \\\common gs@base v \\\} virtual at 0 gs@base ? sizeof.\\#type=$ end virtual \\} \} }