--------------------------------------------------------------------------------------------------------------------

嗯   上个星期到现在   把Win32ASM基础汇编复习了下   在网上找到了  这个不错系列

于是就转载过来了   其中  根据我自己的水平  删减了一些内容 或者增加了一些内容

如果要看原来的内容的   请访问原创:http://www.cnblogs.com/del/category/121079.html

--------------------------------------------------------------------------------------------------------------------

宏可定义在源程序的任意位置, 但一般放在 .data 前面.
有些简单的宏可以用 equ、textequ 或 = 来代替, 但宏有更复杂的功能.

"宏" 的本质是 "替换", 但又像极了 "子过程";
所以即有宏过程(macro procedure)、也有宏函数(macro function).
它既以有参数(可以是: 常数、变量、寄存器、指令、表达式), 有时也需要像子过程一样声明.
宏可以指定哪些参数是必须的, 还可以给参数默认值.

宏可以包含数据(.data)和代码(.code)、还可以嵌套.
宏中的注释使用 ;; 如果只用 ; 将会被一起替换到代码中.

宏的功能很强大, 现在常用的 PrintDec、PrintHex、PrintString、PrintText 等等都是宏.
再强大它也只是 "文本替换".

"宏" 和 "子程序" 相比:
1、宏展开后顺序执行, 不像调用子程序跳来跳去, 这样程序会更 "快";
2、宏展开后会让代码量增大, 导致程序变 "大".
--------------------------------------------------------------------------------------------------------------------
一个简单的宏:
--------------------------------------------------------------------------------------------------------------------
; Test34_1.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;定义一个 mExit 宏
mExit macro
    PrintLine
    ret
endm

.code
sum proc v1, v2, v3
    mov eax, v1
    add eax, v2
    add eax, v3
    ret
sum endp
;
main proc
    invoke sum, 11, 22, 33
    PrintDec eax ;66
    ;PrintLine
    ;ret
    mExit ;mExit 将被替换为上面两行代码
main endp
end main
--------------------------------------------------------------------------------------------------------------------
一个代替求和函数的宏:
--------------------------------------------------------------------------------------------------------------------
; Test34_2.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

mSum macro v1, v2, v3
    mov eax, v1
    add eax, v2
    add eax, v3
endm

.code
main proc
    mSum 11, 22, 33
    PrintDec eax ;66
    PrintLine
    mSum 11, 22, 33, 44, 55 ;多余的参数会被忽略
    PrintDec eax ;66
    PrintLine
    ret
main endp
end main
--------------------------------------------------------------------------------------------------------------------
宏参数的默认值:
--------------------------------------------------------------------------------------------------------------------
; Test34_3.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;参数 v1、v2 通过 REQ 标识说明是必备参数
;参数 v3、v4 给出了默认值
mSum macro v1:req, v2:req, v3:=<33>, v4:=<44>
    mov eax, v1
    add eax, v2
    add eax, v3
    add eax, v4
endm

.code
main proc
    mSum 11, 22
    PrintDec eax ;110
    PrintLine
    ret
main endp
end main
--------------------------------------------------------------------------------------------------------------------
EXITM: 退出宏
--------------------------------------------------------------------------------------------------------------------
; Test34_4.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

mPrint macro
    PrintText '第一行'
    PrintText '第二行'
    exitm
    PrintText '第三行'
endm

.code
main proc
    mPrint ;只会输出前两行
    ret
main endp
end main
--------------------------------------------------------------------------------------------------------------------
PURGE: 取消宏
--------------------------------------------------------------------------------------------------------------------
; Test34_5.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

mPrint macro
    PrintText '第一行'
    PrintText '第二行'
    PrintText '第三行'
    PrintLine
endm

.code
main proc
    mPrint
    mPrint
    purge mPrint ;可用逗号隔开取消多个宏
    mPrint       ;这个宏不会展开了
    ret
main endp
end main
--------------------------------------------------------------------------------------------------------------------
宏中 local 的使用:
--------------------------------------------------------------------------------------------------------------------
; Test34_6.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;从三个数中求最大数的宏
mMax macro v1, v2, v3
    LOCAL L1, L2 ;;如没有这句, 宏在多次展开时会让 L1、L2 重名, 这样宏会把标号名称协调好
    mov eax, v1
    cmp eax, v2
    jge L1
    mov eax, v2
L1: cmp eax, v3
    jge L2
    mov eax, v3
L2:
endm

.code
main proc
    mMax 11, 22, 33
    PrintDec eax  ;33
    ret
main endp
end main
--------------------------------------------------------------------------------------------------------------------
灵活的参数, 用到 & 操作符:
--------------------------------------------------------------------------------------------------------------------
; Test34_7.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;求最数中的最大值:
mMax macro v1, v2
    LOCAL L1
    mov eax, v1
    cmp eax, v2
    jge L1
    mov eax, v2
L1:
endm

;求最数中的最小值:
mMin macro v1, v2
    LOCAL L1
    mov eax, v1
    cmp eax, v2
    jle L1
    mov eax, v2
L1:
endm

;能把 JGE 或 JLE 做参数:
mCom1 macro XX, v1, v2
    LOCAL L1
    mov eax, v1
    cmp eax, v2
    XX L1
    mov eax, v2
L1:
endm

;能通过参数让 J*E 变为 JGE 或 JLE:
mCom2 macro X, v1, v2
    LOCAL L1
    mov eax, v1
    cmp eax, v2
    J&X&E L1    ;;这里用到特殊操作符 &
    mov eax, v2
L1:
endm

.code
main proc
    mMax 11, 22
    PrintDec eax ;22
   
    mMin 11, 22
    PrintDec eax ;11
   
    mCom1 JGE, 11, 22
    PrintDec eax ;22
   
    mCom1 JLE, 11, 22
    PrintDec eax ;11
   
    mCom2 G, 11, 22
    PrintDec eax ;22
   
    mCom2 L, 11, 22
    PrintDec eax ;11
    ret
main endp
end main
--------------------------------------------------------------------------------------------------------------------
特殊操作符: &、<>、%、!
--------------------------------------------------------------------------------------------------------------------
&  ;替换操作符
<> ;字符串传递操作符
%  ;表达式操作符, 也用于得到一个变量或常量的值
!  ;转义操作符
--------------------------------------------------------------------------------------------------------------------
; Test34_8.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;自定义的宏
mPrint macro Text
    PrintText '* &Text& *'
endm

.code
main proc
    ;该宏会把参数直接替换过去
    mPrint 1234    ;* 1234 *
   
    ;要保证参数的完整应该使用 <>
    mPrint 12,34   ;* 12 *
    mPrint <12,34> ;* 12,34 *
   
    ;需要计算结果应该使用 %()
    mPrint 34+12   ;* 34+12 *
    mPrint %(34+12)   ;* 46 *
   
    ;用到 &、<、>、%、! 应该使用 ! 转义
    mPrint 10 !% 2 = %(10/2)!! ;* 10 % 2 = 5! *
    ret
main endp
end main

Win32ASM学习[21]:宏汇编(1)相关推荐

  1. 汇编达人视频学习6(汇编眼中的函数、CALL指令执行函数、堆栈传参、堆栈平衡、外平栈、内平栈)

    title: 汇编达人视频学习6 date: 2021年8月4日 15点15分 tags: 汇编达人 categories: 汇编达人 21.汇编眼中的函数 1.什么是函数 函数就是一系列指令的集合, ...

  2. 深度学习21天——卷积神经网络(CNN):实现mnist手写数字识别(第1天)

    目录 一.前期准备 1.1 环境配置 1.2 CPU和GPU 1.2.1 CPU 1.2.2 GPU 1.2.3 CPU和GPU的区别 第一步:设置GPU 1.3 MNIST 手写数字数据集 第二步: ...

  3. 飞桨PaddlePaddle-百度架构师手把手带你零基础实践深度学习——21日学习总结

    飞桨PaddlePaddle-百度架构师手把手带你零基础实践深度学习--21日学习总结 写在前面的话 纯新手小白,第一次接触深度学习方面的应用.感谢飞桨提供的这次学习机会.之前有学习到深度学习的理论方 ...

  4. 树梅派学习 21. 串口连接

    树梅派学习 21. 串口连接 接线: 其中6.8.10 是串口的引脚. 1. 执行命令 sudo apt-get update sudo apt-get upgrade sudo reboot 2. ...

  5. linux arm 汇编学习,如何在LINUX平台上学习GNU ARM汇编

    本例说明如何在LINUX平台上学习GNU ARM汇编. 1.软件环境 vmware 5.0 + redhat 9.0 + skyeye 1.2.4 + arm-elf 工具 2. 源文件 a.s -- ...

  6. python爬虫学习21

    python爬虫学习21 这是关于match未完下半部分,本来是想昨天-哎不说了 上半部分的传送门 目录 python爬虫学习21 三.正则表达式 2.match 2-3 贪婪与非贪婪 2-4 修饰符 ...

  7. Bioinformatics:吉林大学刘富组-深度学习从宏基因组序列中识别短病毒序列Virtifier...

    Virtifier: 基于深度学习方法的宏基因组病毒序列分类方法 Virtifier: a deep learning-based identifier for viral sequences fro ...

  8. v8学习笔记(六) 汇编过程

    v8汇编过程 根据抽象语法树FunctionLiteral创建Code对象(内含机器指令),返回JSFunction对象. MakeCode(): 1.增加返回语句:  Rewriter::Proce ...

  9. Win32ASM学习[2]:运算符

    算术运算符 名称 优先级 () 圆括号 1 +,- 正.负 2 *,/ 乘.除 3 MOD 取模 3 +,- 加.减 4 --------------------------------------- ...

最新文章

  1. 今天有了自己得博客,心情不错。
  2. php 5.3 construct_PHP 5.3新增魔术方法__invoke概述
  3. 信息学奥赛一本通(2060:【例1.1】计算机输出)
  4. Codeforces976E Well played! 【贪心】
  5. HTML把表格链接进下拉菜单,excel表格下拉菜单怎么做
  6. jetson nano 相关设置(开机自动登录、取消休眠和屏保、开机自启动程序)
  7. Oracle的sp,Oracle的X$表系列介绍之-X$KSMSP
  8. 【1、雅思听力】何琼雅思听力最新版必考词汇
  9. eclipse中文版设置字体大小
  10. Linux下安装jre
  11. java 汽车租赁系统
  12. element ui的upload上传视频内容
  13. Android 拍摄(横 \ 竖屏)视频的懒人之路
  14. 【报告分享】2022快手磁力金牛家居百货行业营销洞察报告-磁力引擎(附下载)
  15. PowerMockito Mock私有方法
  16. sys_guid()函数解析
  17. 进制之间的相互转换(超详细)
  18. linux socket错误提示errno分析
  19. 数字图像处理之频域滤波
  20. Lexical Simplification with Pretrained Encoders 论文精读

热门文章

  1. 摄像头分辨率怎么调整_亿联CAM50 - 智能话机专属高清摄像头
  2. 给你的执行力马上充值
  3. centos8如何安装yum源(详细步骤)
  4. vscode修改python终端_panda3d是python的一个高级的3D 渲染和游戏开发框架
  5. php-cli下载,php-cli-color
  6. 小程序左右标签滑块排行榜
  7. 移动端 fixed 固定按钮在屏幕下方,然后按钮被键盘顶上来...顶上来了有没有~
  8. 使用html css js实现计算器
  9. 解读阿里巴巴集团的“大中台、小前台”组织战略
  10. 网络基础之 Nmap 命令