注册 登录
编程论坛 汇编论坛

[masm32]关于宏汇编的学习

bingghost 发布于 2012-04-12 22:53, 814 次点击
昨日把宏汇编的语法给过了一遍  今天开始看了些例子
把学习心得发一发  

还不懂宏语法的朋友可以看看此贴  提供了一些资料
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.....
--------------------------------------------------------------------------------------
只有本站会员才能查看附件,请 登录




2 回复
#2
bingghost2012-04-12 22:54
自己给自己顶一下  呵呵  这个表情太有爱了  
#3
bingghost2012-04-17 10:31
只有本站会员才能查看附件,请 登录

S宏  可以把字符串直接编译到代码段   还可以加入重定位信息  嘿嘿
1