NASM中的Preprocessor
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的更多相关文章
- nasm中的表达式
nasm表达式支持2个特殊的记号 $和$$;前者标识其所在源码行的开始处地址,所以你可以这样写死循环: jmp $ 而后者标识当前段开始处的地址,你可以通过: $-$$ 找出当前代码在段内的偏移. n ...
- C,C++宏中#与##的讲解[转]
MoreWindows 专注于Windows编程 C,C++宏中#与##的讲解 文中__FILE__与示例1可以参见<使用ANSI C and Microsoft C++中常用的预定义宏> ...
- NASM编译器的$和$$标记
NASM中的times相当于MASM中的dup起到重复定义的作用. $表示当前行的偏移地址,$$表示当前段的起始偏移地址, ;------------------------------------- ...
- <转载>无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
转载http://blog.sina.com.cn/s/blog_6e6c5f230100p92p.html 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引 ...
- 初识google多语言通信框架gRPC系列(四)C++中使用gRPC
我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...
- nasm 与 masm语法区别
看到一篇文章,是介绍nasm语法的:http://blog.csdn.net/hitop0609/article/details/4329454 masm是微软专门为windows下汇编而写的,而na ...
- [转]无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
刚学WinAPI编译遇到不少问题,LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 MSVCRTD.lib test. 这个问题表明你新建 ...
- nasm汇编讲解
一.什么是nasm汇编 nasm使用在windows.linux等系统下的汇编. 二.语法介绍 2.1 nasm 是区分大小写 例如:符号 foo 与 FOO 是两个不同的标识符. 2.2 内存操作数 ...
- 操作系统开发系列—1.HelloWorld ●
org 07c00h ;伪指令,告诉编译器程序会被加载到7c00处 mov ax, cs mov ds, ax mov es, ax call DispStr ;调用显示字符串例程 jmp $ ;无限 ...
- FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS
上一次,我们简单的测试了FreeRTOS的基于IAR EWARM v6.4和STM32F103VET6平台的Demo,对其有了一个基本认识.接下来我们开始自己移植FreeRTOS的过程. 1.创建一个 ...
随机推荐
- wordpress自建博客站,在页脚添加网站总访问次数
wordpress自建博客站,在页脚添加网站总访问次数 笔者使用的主题是 GeneratePress 版本:3.1.3 打开footer.php编辑 <div style="text- ...
- C++设计模式 -中介者模式(Mediator)
接口隔离模式 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案. 典型模式 Facade P ...
- MySQL分组数据和子查询
分组数据 创建分组 mysql> SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id; +---------+ ...
- Windows10基于Visual Studio 2019配置OpenCV4.X
下载OpenCV OpenCV官网 我们是Windows环境所以选择 Windows 配置环境变量 创建一个Visual Studio项目 配置Visual Studio属性 在包含目录中引入路径: ...
- Docker容器编排技术解析与实践
本文全面探索了容器编排技术的核心概念.工具和高级应用,包括Docker Compose.Kubernetes等主要平台及其高级功能如网络和存储管理.监控.安全等.此外,文章还探讨了这些技术在实际应用中 ...
- Python格式化字符串:%、format、f-string
目前Python格式化字符串的方式有三种: 1. % 2.format 3.f-string % 格式化常用方法: # % 格式化字符串 s1 = 'name is %s' % ('zhangsan' ...
- MogDB备机处于standby need-repair(WAL)状态
MogDB 备机处于 standby need-repair(WAL)状态 本文出处:https://www.modb.pro/db/402820 问题现象 Mogdb 主备环境,备机检查发现 Sta ...
- keycloak~RequiredActionProvider的使用
使用场景 RequiredActionProvider,它是在认证过程中,需要当前登录的用户执行个性化的动作:当用户符合条件,就被执行RequiredActionProvider对作,当Require ...
- c# mvc 移除多于的视图引擎
前言 在我们的mvc中,我们又很多视图引擎是不需要的.为什么这么说呢? 我们知道计算机玩的就是遍历. 上图中我们可以看到,首先找的是index.aspx,因为我们都是cshtml,那么去映射的时候呢每 ...
- Lattice Crosslink开发简介
选择lattice的Crosslink器件,大多是因为它功耗比较低.价格便宜,开发也比较简单,相对来说更容易上手.大部分用在手机屏,摄像头模组和平板方面. Crosslink的开发工具是Diamond ...