Win32ASM学习[21]:宏汇编(1)

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

嗯   上个星期到现在   把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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubunu安装软件的一个错误

http://tonychiu.blog.51cto.com/656605/654776/ 由于ubuntu/debian软件库中有时候不同的库更新速度不一致&#xff0c;apt-get 出出现如下的错误提示 Some packages could not be installed. This may mean that you have requested an impossible situation or if you are us…

常用的基本Windows数据类型

常用的基本Windows数据类型 --------------------------------------------------------------------------------------------------------------------------------------------------------- 类 型 …

删除空文件夹 清除CS扩展名文件 bat

删除空文件夹。删的干净。删的彻底。 将下列代码复制到txt中保存。并把后缀.txt命成.bat。然后运行即可。 方案&#xff11;.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 删除指定目录及其子目录下的空文件夹.bat 代码&#xff1a;…

ios 坐标转换

// 将像素point由point所在视图转换到目标视图view中&#xff0c;返回在目标视图view中的像素值 - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view; // 将像素point从view中转换到当前视图中&#xff0c;返回在当前视图中的像素值 - (CGPoint)convertPoint:(C…

80X86伪指令

8086 伪指令表 一、数据定义伪操作 伪 指 令 名 称 语 句 格 式 功 能 定义字节类型的数据存储区 [变量名] DB 表达式[&#xff0c;…] 定义一个以变量名为首址的字节类型数据存储区&#xff0c;所含数据元素的个数由其后表达式的个数所决定&#xff0c;数据存储单元…

jQuery慢慢啃之选择器(二)

1.$("#myDiv");ID匹配一个元素 <span id"foo[bar]"></span> $("#foo\\[bar\\]);//转义 2.$("div");//元素标签名匹配 3.$(".myClass"); css类名匹配 4.$("*") 匹配所有元素&#xff0c;多用于结合上下文…

iOS学习之基本概念

学习iOS最重要的是态度和兴趣&#xff0c;如果你对于学习始终抱有不断的热情和端正的态度&#xff0c;那么&#xff0c;无论是什么&#xff0c;你总会成功的&#xff01; 有一句话与大家共勉&#xff1a;过程中跌倒多少次都没有关系&#xff0c;重要的是&#xff0c;跌倒后你能…

Win32ASM代码基本模块

;-------------------------------------------------------------------------------- ;程序环境设置 .386 .model flat,stdcall option casemap:none ;-------------------------------------------------------------------------------- ;头文件与库文件导入 include windo…

ORA-16038: log 3 sequence# 103 cannot be archived

[sizelarge]今天在自己机器做了个实验&#xff0c;插入10万条&#xff0c;由于空间少&#xff0c;重启数据库时出现&#xff1a; [sizex-large]SQL> startup ORACLE instance started. Total System Global Area 188743680 bytes Fixed Size 1218460 byte…

Win32ASM学习[23]:RadASM快捷键

RadASM快键操作 一.书签 SHIFTF8为所在行下书签或删除书签(Crtl0-9能定义存于文件中的10个书签)&#xff0c; 可通过编辑\书签\开关书签。&#xff08;CRTLF8为下一书签&#xff0c;F8为上一书签&#xff09; 二、列选择&#xff1a; 拉框时用到&#xff0c;CRTLB为切换行…

SAP MM/FI 自动过账实现 OBYC 接口执行

一. 自动过账原理 在MM模块的许多操作都能实现在FI模块自动过账&#xff0c;如PO收货、发票验证(LIV)、工单发料、向生产车间发料等等。不用说&#xff0c;一定需要在IMG中进行配置才可以实现自动处理。但SAP实现的这种自动配置的机制是怎样的呢&#xff1f;其实也并不复杂&…

JAVA 字符处理

/** * 分割字符串 * * param str String 原始字符串 * param splitsign String 分隔符 * return String[] 分割后的字符串数组 */ SuppressWarnings("unchecked") public static String[] split(String str, String splitsign) { int index; if (str null || …

Win32ASM-进程学习【1】

关于一些进程的概念就不说了。。。 一创建进程GreateProcess (1).当一个进程被创建时: ①.系统为进程创建一个内核对象,并将这个对象的计数设置为1,进程对象只是一个比较小的数据结构,可以通过进程句柄来引用 ②.系统为进程创建一个虚拟地址空间,并将可执行文件装载到这个地…

Object-C,NSArraySortTest,数组排序3种方式

晚上回来&#xff0c;继续写Object-C的例子&#xff0c;今天不打算写iOS可视化界面的程序&#xff0c;太累了。刚刚dady又电话过来&#xff0c;老一套&#xff0c;烦死了。其实&#xff0c;我一直一个观点&#xff0c;无论发生什么事情&#xff0c;不要整天一副不开心的样子。开…

android中listview的一些样式设置

在Android中&#xff0c;ListView是最常用的一个控件&#xff0c;在做UI设计的时候&#xff0c;很多人希望能够改变一下它的背景&#xff0c;使他能够符合整体的UI设计&#xff0c;改变背景背很简单只需要准备一张图片然后指定属性 android:background"drawable/bg"&…

Win32ASM-进程学习【2】

获取运行中的句柄 1.从窗口句柄中获取进程句柄 要对进程进行某种操作,就必须首先知道该进程的句柄或者进程ID 对于自己创建的子进程来说CreateProcess函数返回了子进程句柄和进程的ID 但是如果如果要对系统中运行的某个进程进行操作,那么首先获取他们的句柄才行 如果知道某个…

完美解决IE8有两个进程的问题

完美解决IE8有两个进程的问题&#xff0c;照以下方法设置后就只有一个进程了&#xff0c;没有什么负影响哦&#xff01; 方法&#xff1a; 1、winR&#xff0c;在运行框里输入&#xff1a;gpedit.msc&#xff0c;回车进入组策略设置。 2、依次展开&#xff1a;计算机配置——管…

【转】gvim配置及相关插件安装

0.准备软件及插件。(a)gvim72.exe 地址ftp://ftp.vim.org/pub/vim/pc/gvim72.exe。(b)vimcdoc-1.7.0-setup.exe 地址http://prdownloads.sourceforge.net/vimcdoc/vimcdoc-1.7.0-setup.exe?download(c)ec57w32.zip 地址http://prdownloads.sourceforge.net/ctags/ec57w32.zip(…

Win32ASM-进程学习[3]-读写进程空间

invoke ReadProcessMemory,hProcess,lpBaseAddress,lpBuffer,dwSize,lpNumberOfBytesReadinvoke WriteProcessMemory,hProcess,lpBaseAddress,lpBuffer,dwSize,lpNumberOfBytesWritten hProcess 指定将要被读写的目标进程句柄 lpBaseAddress 目标进程中被读写的起始线性地址. …

MongoDB使用记录

安装服务 使用以下命令将MongoDB安装成为Windows服务。笔者的MongoDB目录为D:\Program Files\mongodb mongod --logpath "D:\Program Files\mongodb\data\logs.txt" --logappend --dbpath "D:\Program Files\mongodb\data" --directoryperdb --serviceName…