nasm预处理器(2)

简介:

多行宏 %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多行宏可以定义一个允许参数的个数范围,如果这样做了,可以为参数指定缺省值:

;01个参数,如果未传递参数则默认%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
相关文章
|
人工智能 异构计算
基于PAI-DSW使用SD WebUI实现AI扩图功能
在本教程中,您将学习如何在阿里云交互式建模(PAI-DSW)中,使用Stable-Diffusion-WebUI实现AI扩图功能。
基于PAI-DSW使用SD WebUI实现AI扩图功能
|
前端开发 JavaScript 安全
小红书前端架构
小红书前端架构
|
数据采集 JSON 算法
Python爬虫——模拟登录
Python爬虫——模拟登录
746 3
|
10月前
|
机器学习/深度学习 存储
RT-DETR改进策略【模型轻量化】| PP-LCNet:轻量级的CPU卷积神经网络
RT-DETR改进策略【模型轻量化】| PP-LCNet:轻量级的CPU卷积神经网络
372 0
RT-DETR改进策略【模型轻量化】| PP-LCNet:轻量级的CPU卷积神经网络
|
JSON Java fastjson
简单实现_实体类与Json字符串互相转换
简单实现_实体类与Json字符串互相转换
390 1
|
Linux 编译器 数据处理
探索Linux中的`ld`命令:链接器的奥秘
`ld`是Linux中的链接器,将编译后的目标文件链接成可执行或共享库。作为GNU Binutils的一部分,它处理符号引用、重定位,支持多种文件格式和库类型。常用参数包括`-o`指定输出文件,`-l`链接库,`-L`指定搜索路径。编译器驱动程序常用于简化链接过程。理解符号解析、选择静态/动态链接及管理库版本是使用`ld`的关键。使用`--verbose`调试链接问题,并考虑优化选项。
|
存储 安全 程序员
【C++篇】深入内存迷宫:C/C++ 高效内存管理全揭秘
【C++篇】深入内存迷宫:C/C++ 高效内存管理全揭秘
750 3
|
存储 监控 Linux
stdbuf命令在Linux中的深度解析
`stdbuf`是Linux工具,用于控制命令的stdin、stdout和stderr的缓冲模式。它可以设置为无缓冲、行缓冲或块缓冲,以优化数据处理和实时性。例如,`stdbuf -o0 cmd`禁用cmd的输出缓冲,`-oL`则按行缓冲。在需要实时监控或高效处理大量数据时,选择合适的缓冲模式至关重要。注意,过度使用无缓冲可能影响性能,并非所有系统都支持`stdbuf`。
|
程序员
汇编语言中的不等条件跳转(jne/jnz)
汇编语言中的不等条件跳转(jne/jnz)
1160 0