憨逸邪张 發表於 2024-4-12 21:59:00

汇编语言简易教程(10):宏

<h1 id="汇编语言简易教程10宏">汇编语言简易教程(10):宏</h1>
<blockquote>
<p>汇编语言宏是一组预定义的指令,可以轻松插入到需要的地方。</p>
<p>一旦定义,宏可以根据需要多次使用。当必须多次使用同一组代码时,它非常有用。</p>
<p>宏可用于减少编码量、简化程序并减少重复编码带来的错误.</p>
<p>汇编器包含一个强大的宏处理器,支持条件汇编、多级文件包含和两种形式的宏(单行和多行),以及用于额外宏功能的“上下文堆栈”机制.</p>
<p>在使用宏之前,必须对其进行定义。宏定义应放在源文件中数据和代码部分之前。</p>
<p>该宏用于文本(代码)部分。以下部分将提供详细的示例以及定义和使用。</p>
<h1 id="单行宏">单行宏</h1>
<blockquote>
<p>这部分需要您有一些基本的c/c++的基础知识</p>
</blockquote>
<h2 id="定义方式">定义方式</h2>
<p>​<code>%define   mulby4(x)   shl x, 2</code>​</p>
<h2 id="使用方式">使用方式</h2>
<p>​<code>mulby4        (rax)</code>​</p>
<p>在源代码中,这会将 rax 寄存器的内容乘以 4(通过移位两位)</p>
<h1 id="多行宏">多行宏</h1>
<p>多行宏可以包含不同数量的行(包括一行)。多行宏更有用,以下部分将主要关注多行宏.</p>
<h2 id="定义">定义</h2>
<p>在使用多行宏之前,必须先对其进行定义。一般格式如下:</p>
<pre><code class="language-c">%macro&lt;name&gt;&lt;number of arguments&gt;
        ;
%endmacro
</code></pre>
<p>参数可以在宏中通过 %<number> 引用,其中 %1 是第一个参数,%2 是第二个参数,依此类推</number></p>
<h2 id="示例">示例</h2>
<pre><code class="language-c">%macroabs1   
      cmp%1, 0
      jge%%done
      neg%1
%%done:

%endmacro
</code></pre>
<p>从此示例中, 可以看到, lable的定义需要在开头增加 <code>%%</code>​</p>
<h2 id="使用">使用</h2>
<p>为了使用或“调用”宏,必须将其放置在代码段中并通过名称和适当数量的参数进行引用.</p>
<p>例如:</p>
<pre><code class="language-c">qVar    dq    4
mov                eax, -3   
abs                eax   
abs                qword
</code></pre>
<p>每次使用宏时,宏都会从定义复制到代码中,并在宏主体中替换适当的参数。 &lt;1&gt;表示从宏定义复制的代码。在这两种情况下,%1 参数都被替换为给定的参数;在本例中指的是<code>eax</code>​</p>
<h1 id="使用示例">使用示例</h1>
<p>建议翻看原文 183 页</p>
<p>​<img src="https://img2023.cnblogs.com/blog/3407132/202404/3407132-20240412215925343-1481854077.png">​</p>
<p>​<img src="https://img2023.cnblogs.com/blog/3407132/202404/3407132-20240412215926362-129592435.png">​</p>
<p>​<img src="https://img2023.cnblogs.com/blog/3407132/202404/3407132-20240412215927169-1269845165.png">​</p>
<h1 id="调试宏">调试宏</h1>
<p>宏的代码不会显示在调试器源窗口中。当宏正常工作时,这是非常方便的。但是,调试宏时,代码必须是可见的.</p>
<p>为了查看宏代码,请显示机器代码窗口(View → MachineCode Window)。在窗口中,显示指令的机器代码。步骤和下一个指令将执行整个宏。为了执行宏指令,必须使用stepi和nexti命令</p>
</blockquote>
<p>‍</p><br><br>
来源:https://www.cnblogs.com/pDJJq/p/18132216/simple-tutorial-of-assembly-language-10-macro-1tbnma
頁: [1]
查看完整版本: 汇编语言简易教程(10):宏