[masm32]关于宏汇编的学习
昨日把宏汇编的语法给过了一遍 今天开始看了些例子把学习心得发一发
还不懂宏语法的朋友可以看看此贴 提供了一些资料
https://bbs.bccn.net/thread-365657-1-1.html
程序代码:
;L宏 定义字符串 用法举例 mov eax,L("123456",0ah,0) 把字符串的地址 送到eax中 L macro @var:VARARG LOCAL @lbl .const @lbl db @var,0 .code exitm <offset @lbl> endm 返回值 默认缺省值0 return MACRO arg:=<0> IFIDNI <&arg>,<0> xor eax,eax ;; ELSEIFIDNI <&arg>,<1> ;; xor eax,eax ;; inc eax ELSE mov eax,arg ENDIF ret ;; exitm ENDM 和L宏一样 不过加了判断 可以定义空字符串 ^ _ ^俺稍稍修改的 CTEXT MACRO y:VARARG LOCAL @lbl .const IFIDNI <&y>,<""> @lbl db 0 ELSEIFIDNI <&y>,<"",0ah> @lbl db 0 ELSE @lbl db y,0 ENDIF .code EXITM <offset @lbl> ENDM 宏函数 返回24位色颜色值 $RGB MACRO red:REQ, green:REQ, blue:REQ EXITM %(red + 256 * (green + (256 * blue))) ENDM 方便压栈的 一次可压多个值 pushm Macro args:VARARG IFNB <args> FOR par,<%args> push par ENDM ELSE .ERR ENDIF EndM 方便出栈的 一次可以出栈多个 popm Macro args:VARARG IFNB <args> FOR arg,<%args> pop eax ENDM ELSE .ERR ENDIF EndM 参数反转 抄袭罗云彬的书 reverseArgs macro arglist:VARARG LOCAL txt,count txt textequ <> count = 0 for i,<arglist> count = count + 1 txt textequ @CatStr(i,<!,>,<%txt>) endm if count GT 0 txt SUBSTR txt,1,@SizeStr(%txt) - 1 endif exitm txt endm 需要调用上面的 参数反转宏 其实可以不必这么复杂 如果是c调用约定 按此方法 堆栈会不平衡 突然发现invoke伪指令还自带堆栈平衡的功能 sinvoke Macro fun:REQ,args:VARARG LOCAL count count = 0 ifnb <args> %for i,<reverseArgs(args)> count = count + 1 push i endm call dword ptr fun else invoke fun endif exitm <eax> ENDM 群里问了大神们 才得知这个宏 和上面那个宏的用法 - -! 开始我有点异想天开了 ^ _ ^ $invoke MACRO vars:VARARG invoke vars EXITM <eax> ENDM rb定义字节数组的 按照同样的写法 可以写出rw rd..... rb Macro label:REQ,count IFNB <count> label db &count dup(?) ELSE label db ? ENDIF EndM 还有几个宏 比较复杂 今天就不研究 还是zk大的帖子 传送门 http://www.1498&extra=page%3D1 嗯 大多是上面的例子 我按照自己的猜测给修改了一下
下面我把我测试的工程发出来吧
环境Radasm.....
--------------------------------------------------------------------------------------
TestMacro.zip
(24.29 KB)