汇编语言简易教程(10):宏
汇编语言简易教程(10):宏
汇编语言宏是一组预定义的指令,可以轻松插入到需要的地方。
一旦定义,宏可以根据需要多次使用。当必须多次使用同一组代码时,它非常有用。
宏可用于减少编码量、简化程序并减少重复编码带来的错误.
汇编器包含一个强大的宏处理器,支持条件汇编、多级文件包含和两种形式的宏(单行和多行),以及用于额外宏功能的“上下文堆栈”机制.
在使用宏之前,必须对其进行定义。宏定义应放在源文件中数据和代码部分之前。
该宏用于文本(代码)部分。以下部分将提供详细的示例以及定义和使用。
单行宏
这部分需要您有一些基本的c/c++的基础知识
定义方式
%define mulby4(x) shl x, 2
使用方式
mulby4 (rax)
在源代码中,这会将 rax 寄存器的内容乘以 4(通过移位两位)
多行宏
多行宏可以包含不同数量的行(包括一行)。多行宏更有用,以下部分将主要关注多行宏.
定义
在使用多行宏之前,必须先对其进行定义。一般格式如下:
%macro <name> <number of arguments> ; [body of macro] %endmacro
参数可以在宏中通过 %
引用,其中 %1 是第一个参数,%2 是第二个参数,依此类推 示例
%macro abs 1 cmp %1, 0 jge %%done neg %1 %%done: %endmacro
从此示例中, 可以看到, lable的定义需要在开头增加
%%
使用
为了使用或“调用”宏,必须将其放置在代码段中并通过名称和适当数量的参数进行引用.
例如:
qVar dq 4 mov eax, -3 abs eax abs qword [qVar]
每次使用宏时,宏都会从定义复制到代码中,并在宏主体中替换适当的参数。 <1>表示从宏定义复制的代码。在这两种情况下,%1 参数都被替换为给定的参数;在本例中指的是
eax
使用示例
建议翻看原文 183 页
调试宏
宏的代码不会显示在调试器源窗口中。当宏正常工作时,这是非常方便的。但是,调试宏时,代码必须是可见的.
为了查看宏代码,请显示机器代码窗口(View → MachineCode Window)。在窗口中,显示指令的机器代码。步骤和下一个指令将执行整个宏。为了执行宏指令,必须使用stepi和nexti命令