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. 【Java】请写出你最常见到的 5 个 runtime exception

    请写出你最常见到的 5 个 runtime exception. ​ 参考:https://blog.csdn.net/qq_20417499/article/details/80222820 Cla ...

  2. #阶梯NIM#Poj 1704 Georgia and Bob

    题目 有\(n\)个棋子摆放在x轴的正半轴上, 每次将棋子最多向左移动至上一个棋子之后(不能不移动), 不能操作为败,问先手是不是必胜 分析 这个模型可以转换成阶梯NIM的形式, 那么将奇数位置做NI ...

  3. Wasm软件生态系统安全分析

    演讲嘉宾 | 王浩宇 回顾整理 | 廖   涛 排版校对 | 李萍萍 嘉宾简介 王浩宇,华中科技大学教授,博士生导师,华中科技大学OpenHarmony技术俱乐部主任.研究关注于新兴软件系统中的安全. ...

  4. tkinter属性--转载Tynam Yang

    一.主要控件 1.Button 按钮.类似标签,但提供额外的功能,例如鼠标掠过.按下.释放以及键盘操作事件 2.Canvas 画布.提供绘图功能(直线.椭圆.多边形.矩形) 可以包含图形或位图 3.C ...

  5. Ansible 学习笔记 - 批量巡检站点 URL 状态

    前言 不拖泥带水,不东拉西扯. 速战速决,五分钟学到一个工作用得上的技巧. 通过一个个具体的实战案例,来生动演示 Ansible 的用法. 需求 我需要定期巡检或定时监控我公司的所有站点的首页的可用性 ...

  6. 全新适配鸿蒙生态,Cocos引擎助力3D应用开发

    原文链接:https://mp.weixin.qq.com/s/rCACesJ4QxRuU2NRjIvbDQ,点击链接查看更多技术内容: 一.适配HarmonyOS背景 HarmonyOS 3.1版本 ...

  7. 【直播回顾】Hello HarmonyOS应用篇第六课——短视频应用开发

    由HDE夏德旺老师主讲的Hello HarmonyOS进阶系列应用篇第六课<短视频应用开发>, 已于6月8日晚上 19 点在HarmonyOS社群内成功举行. 本节课夏德旺老师带领大家了解 ...

  8. Spring Cloud Stream 源码解析

    Spring Cloud Stream 是一个消息驱动微服务的框架.   应用程序通过inputs 或者outputs 来与 Spring Cloud Stream 中binder 交互,通过我们配置 ...

  9. redis 简单整理——HyperLogLog[十三]

    前言 简单介绍一下HyperLogLog. 正文 HyperLogLog并不是一种新的数据结构(实际类型为字符串类型),而 是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数 ...

  10. VulnHub-ical打靶记录

    这绝对是最简单的一个题目了. 目标发现 netdiscover -r 192.168.0.10/24 根据靶场和本地系统的网段进行扫描. 信息收集 nmap -sV -Pn -sT -sC -A 19 ...