c语言中的预处理
不是程序的一部分
占运行时间,不占编译时间
nasm的预处理
以%开头的
------------------------------------------------------
%define 例子: %define count(a,b) a+b
mov dl,count(1,2);dl=3
%undef 取消宏定义
例子: %undef count(a,b) ;取消宏定义
--------------------------------------------
%assign 没参数,有变量值。指令被执行时记一次,可以重新定义
例子:%assign i 0
%assign i i+1
---------------------------------------------------
%ifdef 符号
%endif
------------------------------------------
%if expr
expr为非0才执行
%endif
-----------------------------------------
%rep 循环次数
指令
%endrep
--------------------------------------------------
%macro 宏名称 参数个数
宏本体
%endmacro
例子: %macro readchr 1
push ax
mov ah,1
int 21h
mov [%1],al
pop ax
%endmacro
把此宏保存为mac文件
------------------------------------------------------
%include ".mac" ;文件引用宏
char db ' '
redchr char ;char位读入的字符
------------------------------------------------------
一把情况下定义宏并且引用例如定义一个读取字符长数据的
;************ScanfString.mac********************
;用于输出字符串。
%ifndef SCANFSTRING_MAC
%define SCANFSTRING_MAC
%MACRO SCANFSTRING 3
pusha
mov dx,%1 ;注意这里是地址
mov ah,0x0a
int 21h
xor bx,bx
mov bl,[%2] ;注意这里是数据
mov byte[bx+%3],'$'
;注释掉输出
popa
%ENDMACRO
%endif
---------------------使用--------------------------------------------------
[bits 16]
[org 0x0100]
[section .text]
jmp start
%include "ScanfString.mac"
start:
;输入一个字符串
SCANFSTRING buf,count,s
mov ah,0x4c
int 21h
[section .data]
buf db 80
count db 0
s times 81 db ''
转载于:https://blog.51cto.com/cobbage/982220