文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1. 宏
以 %macro ... %endmacro
定义多行宏。定义包括名称、参数数量。在内部使用 %1
, %2
... 引用参数。
参数数量是必须的,哪怕是
0
。%define
定义单行宏。
global _start %macro PRINT 2 mov rax, 1 mov rdi, 1 mov rsi, %1 mov rdx, %2 syscall %endmacro %macro EXIT 0 mov rax, 60 xor rdi, rdi syscall %endmacro section .data hello : db `hello, world!\n` length : equ $ - hello section .text _start: PRINT hello, length EXIT
预处理后结果。
$ nasm -E test.s [global _start] [section .data] hello : db `hello, world!\n` length : equ $ - hello [section .text] _start: mov rax, 1 mov rdi, 1 mov rsi, hello mov rdx, length syscall mov rax, 60 xor rdi, rdi syscall
重载
可使用不同参数数量重载。
%macro DEMO 1 mov rax, %1 %endmacro %macro DEMO 2 mov rax, %1 mov rbx, %2 %endmacro section .text _start: ;; DEMO 10 ;; DEMO 10, 20
[section .text] _start: mov rax, 10 mov rax, 10 mov rbx, 20
标签
使用 %%
定义宏本地标签,可跳转。
global _start %macro DEMO 2 mov rax, %1 jmp %%xxx %%xxx: mov rbx, %2 %endmacro section .text _start: DEMO 10, 20
[section .text] _start: mov rax, 10 jmp ..@2.xxx ..@2.xxx: mov rbx, 20
标签也可以使用参数。
%macro DEMO 3 mov rax, %1 jmp %3 %3: mov rbx, %2 %endmacro section .text _start: DEMO 10, 20, .abc
[section .text] _start: mov rax, 10 jmp .abc .abc: mov rbx, 20
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论