![]() |
#2
bingghost2012-04-12 22:54
|
把学习心得发一发
还不懂宏语法的朋友可以看看此贴 提供了一些资料
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.....
--------------------------------------------------------------------------------------
只有本站会员才能查看附件,请 登录