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

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

时间:2024-04-12 22:14:38浏览次数:19  
标签:多行 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 页

image

image

image

调试宏

宏的代码不会显示在调试器源窗口中。当宏正常工作时,这是非常方便的。但是,调试宏时,代码必须是可见的.

为了查看宏代码,请显示机器代码窗口(View → MachineCode Window)。在窗口中,显示指令的机器代码。步骤和下一个指令将执行整个宏。为了执行宏指令,必须使用stepi和nexti命令

标签:多行,10,教程,定义,示例,汇编语言,代码,参数,使用
From: https://www.cnblogs.com/pDJJq/p/18132216/simple-tutorial-of-assembly-language-10-macro-1tb

相关文章

  • 汇编语言简易教程(11):函数与栈帧
    汇编语言简易教程(11):函数与栈帧需要注意.这里的函数指的是汇编语言(yasm)的函数,但对理解其他高级语言的函数在汇编中的实现会有很大的帮助.函数和过程(即空函数)有助于将程序分解为更小的部分,从而更容易编码、调试和维护。函数调用涉及两个主要操作:函数链接由于可以......
  • C语言10-指针(多级指针、空指针、野指针),自定义数据类型(枚举enum、结构体struct)
    第12章指针pointer12.6多级指针指向指针的指针称为多级指针eg:int*ptr1=&num; int**ptr2=&ptr1; int***ptr3=&ptr2;12.7空指针应用场景:1.暂时不确定指向的指针,可以在定义的时候先赋值为NULL2.有些指针函数,如果内部出现异常无法成功实现功能,可以返回NUL......
  • Intel MacBook Pro+macOS 14配置Games101实验环境
    参考:求一个games101图形学课程的环境配置教程,最好能够简单易懂,CSDN教程根本看不懂什么意思?-不泊的回答-知乎https://www.zhihu.com/question/459126051/answer/3420947842macos现在怎么装homebrew?-MyloZ的回答-知乎https://www.zhihu.com/question/340411846/answe......
  • 2024.4.10华为暑期实习笔试题解尝试1~2
    题目在4.10华为暑期实习笔试题解努力开摆的小鱼2024-04-10T1简单难度,按照题意顺着写就可以n=int(input())#表示计费日志的条数lst=[]#去重后的日志ss=set()#为了去重foriinrange(n):s=tuple(input().split(","))t=s[0]+s[1]+s[2]#......
  • SQL SERVER 从入门到精通 第5版 第三篇 高级应用 第10章 存储过程 读书笔记
    第10章存储过程 >.存储过程概述存储过程(storedprocedure)是预编译SQL语句的集合,这些语句存储在一个名称下并作为一个单元来处理.存储过程取代了传统的逐条执行SQL语句的方式.一个存储过程中可以包含增删改查等一系列SQL语句,当这个存储过程被调用时,这些操作也......
  • 题解:P10320 勇气(Courage)
    P10320勇气(Courage)推导过程本题是一道数学题,重点是如何推导出正确式子。首先,先特判几个特殊点:当\(n>=2\)且\(x=2\)时,是不存在解的,战斗力无论何时都不会超过\(2^{n}\)。当\(x\)不强化就以大于\(2^{n}\)。当\(x\)第一次强化达到\(x^{2}\)时,大于\(2^{n}\)......
  • 实验2 C语言分支与循环基础应用编程 王刚202383310053
    1#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#defineN55intmain()6{7intnumber,i;8srand(time(0));9for(i=0;i<N;i++)10{number=rand()%65+1;11printf("20238331%04d\n",number);12}13sy......
  • P10064 [SNOI2024] 公交线路
    显然只需要考虑叶子结点的连边情况,设一个结点\(u\)仅经过一条路径能到达的点的集合为\(S_x\),则条件等价于对于任意两个叶子结点\(x,y\),\(S_x\)与\(S_y\)有交.由树的性质,所有\(S_x\)的交集非空(否则存在环),于是交集为一个连通块,上点边容斥.于是问题转化为两部分:求所有\(......
  • 分享10款实用的办公软件,个个都是效率神器,好用到爆!
    在这个信息化、数字化的时代,办公软件已经成为了我们日常工作中不可或缺的一部分。它们不仅可以帮助我们更高效地完成工作任务,还能提升我们的工作效率和团队协作能力。今天,我将为大家分享10款实用的办公软件,个个都是效率神器,好用到爆! 01、Everything Everything是一款极速文......
  • Rust教程 – 学习天文图像的多尺度处理
    最近,人们投入了大量精力开发新颖的图像处理技术。其中许多技术都源自于傅里叶和小波变换等数字信号处理方法。这些技术不仅使得各种图像处理技术如降噪、锐化和动态范围扩展成为可能,而且还使得计算机视觉中使用的许多技术如边缘检测、目标检测等成为可能。多尺度分析是相对较新......