NASM中的Preprocessor都以%开头。

单行macro %define

%define与C语言中的#define类似:

%define a(x)    1+b(x)
%define b(x) 2*x
mov ax,a(8) ;展开后是mov ax 1+2*8

%define不会无限expansion,只会expansion一次,比如:

%define a(x)    1+a(x)
mov ax, a(3); 只会展开一次,展开后mov ax 1 + a(3)

%define支持overload,比如:

%define foo(x)   1+x
%define foo(x,y) 1+x*y foo(3)使用单参数版本:1+3
foo(2, 3)使用2参数版本:1+2*3

需要注意的是,如果定义了有参数的macro,就不能在定义没有参数的macro:

%define foo bar;不被允许了

同样,如果定义了无参数的macro,那么就不能在定义有参数的macro。

对于无参数的macro来说,可以被重定义(Redefine):

%define foo bar
%define foo baz;后定义的macro将覆盖前面定义的macro

%define区分大小写:

%define foo bar;只对foo会expansion成bar,foO Foo不起作用

;如果需要会略大小写,使用%idefine

NASM2.15中的新特性:

%define erge(x, ) x*2;逗号后面没有指名参数名,那么调用这个macro是从第2个参数起就会被忽略
erge(1, 2, 3);参数2, 3会被忽略 ;macro参数前有=,expansion的时候会被求值
;macro参数前有&,expansion的时候会变成字符串
;macro参数后有+,表示是一个greedy参数,它将包含后续所有参数
;macro参数前有!,空格和{}不会被移除
%define xyzzy(=expr,&val) expr, str
%define plugh(x) xyzzy(x,x)
db plugh(3+5), ‘\0‘ ; Expands to: db 8, "3+5", ‘\0‘

多行macro %macro

%macro  prologue 1       ;prologue是macro名,1是参数个数
push ebp
mov ebp,esp
sub esp,%1 ;%1表示引用第一个参数,如果有第二个,第三个参数,可以使用%2, %3引用
%endmacro
%macro  silly 2
%2: db %1
%endmacro silly ’a’, letter_a ; letter_a: db ’a’
silly ’ab’, string_ab ; string_ab: db ’ab’
silly {13,10}, crlf ; crlf: db 13,10 参数里面想包含,用{}包围

和单行macro一样,多行macro也可以被overload,不同之处在于,如果之前定义了无参多行macro,同样也可以overload有参多行macro。

NASM中的Preprocessor的更多相关文章

  1. nasm中的表达式

    nasm表达式支持2个特殊的记号 $和$$;前者标识其所在源码行的开始处地址,所以你可以这样写死循环: jmp $ 而后者标识当前段开始处的地址,你可以通过: $-$$ 找出当前代码在段内的偏移. n ...

  2. C,C++宏中#与##的讲解[转]

    MoreWindows 专注于Windows编程 C,C++宏中#与##的讲解 文中__FILE__与示例1可以参见<使用ANSI C and Microsoft C++中常用的预定义宏> ...

  3. NASM编译器的$和$$标记

    NASM中的times相当于MASM中的dup起到重复定义的作用. $表示当前行的偏移地址,$$表示当前段的起始偏移地址, ;------------------------------------- ...

  4. <转载>无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用

    转载http://blog.sina.com.cn/s/blog_6e6c5f230100p92p.html 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引 ...

  5. 初识google多语言通信框架gRPC系列(四)C++中使用gRPC

    我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...

  6. nasm 与 masm语法区别

    看到一篇文章,是介绍nasm语法的:http://blog.csdn.net/hitop0609/article/details/4329454 masm是微软专门为windows下汇编而写的,而na ...

  7. [转]无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用

    刚学WinAPI编译遇到不少问题,LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 MSVCRTD.lib test. 这个问题表明你新建 ...

  8. nasm汇编讲解

    一.什么是nasm汇编 nasm使用在windows.linux等系统下的汇编. 二.语法介绍 2.1 nasm 是区分大小写 例如:符号 foo 与 FOO 是两个不同的标识符. 2.2 内存操作数 ...

  9. 操作系统开发系列—1.HelloWorld ●

    org 07c00h ;伪指令,告诉编译器程序会被加载到7c00处 mov ax, cs mov ds, ax mov es, ax call DispStr ;调用显示字符串例程 jmp $ ;无限 ...

  10. FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS

    上一次,我们简单的测试了FreeRTOS的基于IAR EWARM v6.4和STM32F103VET6平台的Demo,对其有了一个基本认识.接下来我们开始自己移植FreeRTOS的过程. 1.创建一个 ...

随机推荐

  1. KingbaseES V8R6集群运维案例之---自动清理集群主库wal日志

    ​ 案例说明: 在KingbaseES V8R6 主备流复制的集群,配置复制槽(replication slot).复制槽提供了一种自动化的方法来确保主控机在所有的后备机收到 WAL 段 之前不会移除 ...

  2. 内核模块的makefile规则详解

    内核中的Makefile 这里主要对内核源码各子集目录中的Kbulid(内核的编译系统)Makfile进行简单介绍 这部分式内核驱动或设备驱动开发这最长接触到的 Makefile 的语法包括几个方面 ...

  3. MVC架构设计浅析(WEB网页开发)

    MVC架构设计浅析 杨传伟 (石家庄铁道大学信息科学与技术学院,河北省,石家庄市,050043) 摘 要:本文以图书管理系统为案例(当前主流框架SpringMVC的原理来分析MVC的设计理念等),深入 ...

  4. 《梦断代码》(《Dreaming in Code》)读书笔记

    <梦断代码>(<Dreaming in Code>)读书笔记 在看了这本书之后,我在豆瓣看到一段书评:做软件难.软件乃是人类自以为最有把握,实则最难掌控的技术.这本书揭示了好多 ...

  5. HTML实现发送接收串口和TCP数据

    前提 请安装通讯调试工具,所有的网页必须运行在本工具上,在其他浏览器直接打开是不行的. 效果显示 在网页上右键打开,选择其他应用 2.在其他应用中找到通讯调试工具 如果没有这一项,点更多,在计算机中查 ...

  6. 使用OHOS SDK构建zziplib

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从gitee下载源码,当前最新的提交记录ID为6699e0fe8a0307b16dcc055eda04452e13abe63a. 执行如下命令: ...

  7. 解析 Go 编程语言数据类型:bool、整数、浮点数和字符串详细介绍

    数据类型 数据类型是编程中的重要概念.数据类型指定了变量值的大小和类型.Go是静态类型的,这意味着一旦变量类型被定义,它只能存储该类型的数据. 基本数据类型 Go 有三种基本数据类型: bool:表示 ...

  8. Djangorestframework 记录一个报错 -- rest_framework.authentication.ToKenAuthentication

    今天在使用 Djangorestframework 这个框架时,发生报错: ImportError: Could not import 'rest_framework.authentication.T ...

  9. HarmonyOS助力构建“食用菌智慧农场”

     原文:https://mp.weixin.qq.com/s/qK4aRY5UKc3GvpLxhwpqww,点击链接查看更多技术内容.   [开发者说]栏目是为HarmonyOS开发者提供的展示和分享 ...

  10. .NET 9 预览版 3 发布

    我们很高兴地宣布发布 .NET 9 预览版 3,其中包含 .NET 库.运行时和 SDK 的新功能和改进.此预览版带来了旨在提高性能.提高开发人员工作效率以及向 .NET 生态系统引入新功能的增强功能 ...