(aka Jin X) !RTFM!
Форумчанин
Регистрация: 14.12.2014
Сообщений: 296
|
Полезные макросы для MASM и TASM
Не претендую на создание чего-то нового и гениального, но макросы довольно полезные. Часть из того, что я сделал, уже делали другие. Тем не менее, большинство макросов придумано и сделано мною с нуля, остальной код переписан по-своему
Вот эти макросы (полный вариант, только заголовки):
Код:
;############################################
;## ##
;## -= EXTRA MACROSES (FULL EDITION) =- ##
;## МАКРОСЫ ДЛЯ MASM/TASM (16/32) ##
;## Полный вариант ##
;## [ v1.00 :: 09.01.2017 ] ##
;## ##
;## (c) 2017 by Jin X (jin.x@sources.ru) ##
;## xk7.ru/p/a/i ##
;## ##
;############################################
xmacro_ver = 100h ; версия данного файла (word: старший байт - целая часть, младший - дробная)
;-------------------------------------------------------------------------------
@ equ <offset>
$b equ <byte ptr>
$w equ <word ptr>
$d equ <dword ptr>
$f equ <fword ptr>
$q equ <qword ptr>
$t equ <tbyte ptr>
$s equ <short>
$n equ <near>
$f equ <far>
; Выполнение инструкций/директив/макросов, заданных одной строкой
_ macro p1, p2, p3, p4, p5, p6, p7, p8, p9, p10
;-------------------------------------------------------------------------------
;-- УСЛОВНЫЕ МАКРОСЫ -----------------------------------------------------------
;-------------------------------------------------------------------------------
; Если cond, исполнить do1; иначе do0
ifel macro cond:req, do1, do0
ifdo equ <ifel>
ifn equ <ife>
; Если НЕ cond, исполнить do1; иначе do0
ifnel macro cond:req, do1, do0
ifeel equ <ifnel>
; Если cond1, исполнить do1; иначе если cond2, исполнить do2; иначе do0
ifelif macro cond1:req, do1, cond2:req, do2, do0
; ifdef id (если идентификатор определён), исполнить do1; иначе do0
ifdefel macro id:req, do1, do0
; ifndef id (если идентификатор НЕ определён), исполнить do1; иначе do0
ifndefel macro id:req, do1, do0
; ifb exp (если выражение пустое), исполнить do1; иначе do0
ifbel macro exp, do1, do0
; Если выражение exp пустое или состоит из пробелов, исполнить do1; иначе do0
ifbbel macro exp, do1, do0
; ifnb exp (если выражение НЕпустое), исполнить do1; иначе do0
ifnbel macro exp, do1, do0
; Если выражение exp НЕпустое и НЕ состоит из пробелов, исполнить do1; иначе do0
ifnbbel macro exp, do1, do0
; ifidn exp1, exp2 (если значения совпадают С учётом регистра символов), исполнить do1; иначе do0
ifidnel macro exp1:req, exp2:req, do1, do0
; ifidni cond (если значения совпадают БЕЗ учёта регистра символов), исполнить do1; иначе do0
ifidniel macro exp1:req, exp2:req, do1, do0
; ifidn exp1, exp2 (если значения различаются С учётом регистра символов), исполнить do1; иначе do0
ifdifel macro exp1:req, exp2:req, do1, do0
; ifidni cond (если значения различаются БЕЗ учёта регистра символов), исполнить do1; иначе do0
ifdifiel macro exp1:req, exp2:req, do1, do0
; Если cond1 или cond2 (условие cond2 проверяется только в том случае, если cond1 не выполнилось), исполнить do1; иначе do0
iforel macro cond1:req, cond2:req, do1, do0
; Если cond1 и cond2 (условие cond2 проверяется только в том случае, если cond1 выполнилось), исполнить do1; иначе do0
ifandel macro cond1:req, cond2:req, do1, do0
; Аналогично ifel, но условие подставляется слитно с if, например: ifelx <def debug>, <int 3>, nop
ifelx macro cond:req, do1, do0
ifx equ <ifelx>
; Аналогично ifnel, но условие подставляется слитно с if, например: ifnelx <def debug>, nop, <int 3>
ifnelx macro cond:req, do1, do0
ifeelx equ <ifnelx>
; Аналогично ifelif, но условия подставляются слитно с if, например: ifelifx <def debug>, <int 3>, <idn <spec>, <stosb>>, stosb, nop
ifelifx macro cond1:req, do1, cond2:req, do2, do0
; Аналогично iforel, но условия подставляются слитно с if
iforelx macro cond1:req, cond2:req, do1, do0
; Аналогично ifandel, но условия подставляются слитно с if
ifandelx macro cond1:req, cond2:req, do1, do0
;-------------------------------------------------------------------------------
; Установить значение var = true, если выполняется хотя бы одно из условий cX; иначе установить var = false
setifor macro var:req, c1:req, c2:req, c3, c4, c5, c6, c7, c8
; Установить значение var = true, если выполняются все условия cX; иначе установить var = false
setifand macro var:req, c1:req, c2:req, c3, c4, c5, c6, c7, c8
; Установить значение var1 = true, а var2 = false, если выполняется условие cond (которые подставляются слитно с if); иначе установить var1 = false, а var2 = true
setifelx macro cond:req, var1, var2
; Установить значение var = true, если выполняется хотя бы одно из условий cX (которые подставляются слитно с if); иначе установить var = false
setiforx macro var:req, c1:req, c2:req, c3, c4, c5, c6, c7, c8
; Установить значение var = true, если выполняются все условия cX (которые подставляются слитно с if); иначе установить var = false
setifandx macro var:req, c1:req, c2:req, c3, c4, c5, c6, c7, c8
;-------------------------------------------------------------------------------
; Если идентификатор value определён, установить значение const = value, иначе установить значение _const = defval
defdef macro const:req, value:req, defval:req
; Если константа const определена, установить значение _const = const, иначе установить значение _const = defval
_defdef macro const:req, defval:req
;-------------------------------------------------------------------------------
; Вывод сообщения txt об ошибке (одинаковый синтаксис для MASM и TASM)
?err macro txt
; Вывод сообщения txt об ошибке при выполнении условия cond
?errif macro cond:req, txt
; Аналогично ?errif, но условие подставляется слитно с if, например: ?errifx <ndef ok>, <Error message>
?errifx macro cond:req, txt
;-------------------------------------------------------------------------------
; Следующие идентификаторы определены для более удобного использования вложенных условных директив компиляции, например:
; if abc
; ?if def
; ??if ghi
; ...
; ??endif
; ?endif
; endif
?if equ <if>
?ifdef equ <ifdef>
?ifndef equ <ifndef>
?ifb equ <ifb>
?ifnb equ <ifnb>
?ifidn equ <ifidn>
?ifidni equ <ifidni>
?ifdif equ <ifdif>
?ifdifi equ <ifdifi>
?if1 equ <if1>
?if2 equ <if2>
?else equ <else>
?elseif equ <elseif>
?elseifdef equ <elseifdef>
?elseifndef equ <elseifndef>
?elseifb equ <elseifb>
?elseifnb equ <elseifnb>
?elseifidn equ <elseifidn>
?elseifidni equ <elseifidni>
?elseifdif equ <elseifdif>
?elseifdifi equ <elseifdifi>
?elseif1 equ <elseif1>
?elseif2 equ <elseif2>
?endif equ <endif>
??if equ <if>
??ifdef equ <ifdef>
??ifndef equ <ifndef>
??ifb equ <ifb>
??ifnb equ <ifnb>
??ifidn equ <ifidn>
??ifidni equ <ifidni>
??ifdif equ <ifdif>
??ifdifi equ <ifdifi>
??if1 equ <if1>
??if2 equ <if2>
??else equ <else>
??elseif equ <elseif>
??elseifdef equ <elseifdef>
??elseifndef equ <elseifndef>
??elseifb equ <elseifb>
??elseifnb equ <elseifnb>
??elseifidn equ <elseifidn>
??elseifidni equ <elseifidni>
??elseifdif equ <elseifdif>
??elseifdifi equ <elseifdifi>
??elseif1 equ <elseif1>
??elseif2 equ <elseif2>
??endif equ <endif>
Продолжение следует (весь код не помещается в одно сообщение)...
Полный код см. в аттаче
asm7x
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
|