多行宏 %macro:

%macro foo 2
    push rax
    push rbx
    mov rax,%1
    mov rbx,%2
    pop rbx
    pop rax
%endmacro

宏名称后的数字代表宏参数的个数,宏主体中的%1和%2分别代表实际的参数。使用如下方式调用:

foo 0x11,0x22

如果宏参数中包含,号,可以将参数用{}包围起来。

%macro foo 2
    %2:db %1
%endmacro

foo {13,10},crlf
;实际生成的代码为:
crlf: db 13,10

类似单行宏,多行宏也可以通过定义不同参数个数来重载,对于不带参数的宏也不像单行宏那样有特例了。

在宏中可以定义宏内局部标签(macro local labels),对于宏的每一次展开都会生成不同的标签,宏内标签需要用%%开头:

%macro foo 0
    jnz %%skip
    ret
%%skip:
%endmacro

nasm允许将宏的最后一个参数定义为贪婪参数,如果传递多余的参数,则多出来的参数连同其中的逗号都会被传给宏中定义的最后一个实参:

%macro foo 2+

%endmacro

nasm多行宏可以定义一个允许参数的个数范围,如果这样做了,可以为参数指定缺省值:

;0或1个参数,如果未传递参数则默认%1为"hello"
%macro foo 0-1 "hello"
...
%endmacro
;至少一个参数,另外2个若不指定则使用默认值eax和[eax+2]
%macro foo 1-3 eax,[eax+2]

如果在宏定义时漏掉定义缺省值,则缺省值被赋为空;而且记号%0可以让你确定有实际传递参数的个数。最大参数个数可以为无限,用*表示。

使用%rotate可以循环移动宏参数,但它和unix的shift命令略有不同,他不会丢弃移出的参数,当一个参数被移到最左边时再次移动会回到最右边,则也是rotate单词的含义。%rotate可以带一个数值参数,如果是正数表示左移的次数,如果是负数表示右移的次数。可以以此来写一个保存和恢复寄存器的宏:

%macro save 1-*
    %rep %0
        push %1
        %rotate 1
    %endrep

    nop
    add rax,rax

    %rep %0
        %rotate -1
        pop %1
    %endrep
%endmacro

nasm预处理器(2)的更多相关文章

  1. nasm预处理器(4)

    nasm定义了一套标准宏,当开始处理源文件时,这些宏都已经被定义了,如果希望程序在执行前没有预定义的宏存在,可以使用%clear清空预处理器的一切宏. __NASM_MAJOR__ 主版本号 __NA ...

  2. nasm预处理器(3)

    nasm提供一个限定符.nolist,可以包含它到一个宏定义中,这样该宏就不会在列表文件中被展开:限定符 .nolist直接放到参数后面: %macro foo 1.nolist 条件汇编 和C预处理 ...

  3. nasm预处理器(1)

    与处理器将所有以反斜杠结尾的连续行合并为一行. 单行的宏以%define来定义:当单行的宏被扩展后还含有其他宏时,会在执行时而不是定义时展开. %define a(x) 1+b(x) %define ...

  4. 前端CSS预处理器Sass

    前面的话   "CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工 ...

  5. css预处理器sass使用教程(多图预警)

    css预处理器赋予了css动态语言的特性,如变量.函数.运算.继承.嵌套等,有助于更好地组织管理样式文件,以及更高效地开发项目.css预处理器可以更方便的维护和管理css代码,让整个网页变得更加灵活可 ...

  6. C和指针 第十四章 预处理器 头文件

    编写一个C程序,第一个步骤称为预处理,预处理在代码编译之前,进行一些文本性质的操作,删除注释.插入被include的文件.定义替换由#define定义的符号,以及确定代码的部分内容是否应该按照条件编译 ...

  7. 关于前端CSS预处理器Sass的小知识!

    前面的话   "CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工 ...

  8. CSS预处理器Sass、LESS 和 Stylus

    CSS 预处理器技术已经非常的成熟,而且也涌现出了越来越多的 CSS 的预处理器框架.本文向你介绍使用最为普遍的三款 CSS 预处理器框架,分别是 Sass.Less CSS.Stylus. 首先我们 ...

  9. C#预处理器指令 ,你造吗??? (●'◡'●)

    什么是c#预处理指令?? 用于在 C# 源代码中嵌入的编译器命令. C#预处理器指令有哪些?? ↓↓↓这些就是预处理器指令啦 下面我们一一道来(●'◡'●) 1.#if ,#elif,#else,en ...

随机推荐

  1. cocos2d-x 3.11 游戏开发环境搭建流程

    cocos2d-x 3.11.1 游戏开发环境搭建流程 1. 准备下面的软件 1) Windows7 64Bit+ VS2013 (VC++) 这个不用多说. 2) cocos2d-x-3.11.1. ...

  2. UNIX网络编程——epoll 系列函数简介、与select、poll 的区别

    前面博客<<UNIX环境高级编程--epoll函数使用详解>>有关于epoll函数的讲解. 一.epoll 系列函数简介 #include <sys/epoll.h> ...

  3. Android初级教程:单击事件的传递机制初谈

    以上仅是小试牛刀,后续有很多事件传递机制,继续探讨.

  4. SSH深度历险(八) 剖析SSH核心原理+Spring依赖注入的三种方式

           在java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依 ...

  5. UNIX网络编程——客户/服务器程序设计示范(三)

    TCP预先派生子进程服务器程序,accept无上锁保护 我们的第一个"增强"型服务器程序使用称为预先派生子进程的技术.使用该技术的服务器不像传统意义的并发服务器那样为每个客户现场派 ...

  6. Andriod Studio科普篇——3.关于gradle插件的常见问题

    1.andriod gradle插件版本过低. 出错位置: dependencies{ classpath 'com.android.tools.build:gradle:0.10.2' } 提示信息 ...

  7. HDFS HA: 高可靠性分布式存储系统解决方案的历史演进

    1. HDFS 简介 HDFS,为Hadoop这个分布式计算框架提供高性能.高可靠.高可扩展的存储服务.HDFS的系统架构是典型的主/从架构,早期的架构包括一个主节点NameNode和多个从节点Da ...

  8. mysql5.6升级到5.7后Sequel Pro无法连接解决

    因为装ntop,brew自动升级了本地的Mysql,结果升级完成之后,使用Sequel Pro连接总是报错,使用mysql 命令行工具就没有问题. OSX版本 10.11.5 Mysql版本 5.6 ...

  9. java设计模式---合成模式3

    实例 下面以一个逻辑树为例子,以上面的原理图为蓝本,看看如何实现并如何使用这个树,这个结构很简单,但是如何去使用树,遍历树.为我所用还是有一定难度的.   这里主要用到树的递归遍历,如何递归.如何控制 ...

  10. 04_Weblogic之受管服务器:配置受管服务器,启动受管服务器,解决因为强制关闭Weblogic之后导致启动有问题的问题,配置boot.properties

     配置受管服务器, 先启动WebLogic服务器,启动方式如下: 在WebLogic控制台中的"开发模式"---"锁定并编辑"模式下,点击"Ser ...