| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 814 人关注过本帖, 1 人收藏
标题:[masm32]关于宏汇编的学习
只看楼主 加入收藏
bingghost
Rank: 2
等 级:论坛游民
帖 子:70
专家分:85
注 册:2012-1-4
结帖率:100%
收藏(1)
 问题点数:0 回复次数:2 
[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)




搜索更多相关主题的帖子: 学习心得 朋友 今天开始 资料 
2012-04-12 22:53
bingghost
Rank: 2
等 级:论坛游民
帖 子:70
专家分:85
注 册:2012-1-4
收藏
得分:0 
自己给自己顶一下  呵呵  这个表情太有爱了  

我的头像就是我的女神 可惜我的女神已经死了 所以我的心也死了
2012-04-12 22:54
bingghost
Rank: 2
等 级:论坛游民
帖 子:70
专家分:85
注 册:2012-1-4
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

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

我的头像就是我的女神 可惜我的女神已经死了 所以我的心也死了
2012-04-17 10:31
快速回复:[masm32]关于宏汇编的学习
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020193 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved