c语言中的预处理

  1. 不是程序的一部分 

  2. 占运行时间,不占编译时间 

nasm的预处理

  1. 以%开头的 

  2. ------------------------------------------------------ 

  3. %define 例子: %define count(a,b) a+b 

  4.                mov dl,count(1,2);dl=3

  5. %undef  取消宏定义  

  6.        例子: %undef count(a,b) ;取消宏定义 

  7. --------------------------------------------

  8. %assign 没参数,有变量值。指令被执行时记一次,可以重新定义 

  9.         例子:%assign i 0  

  10.               %assign i i+1 

  11. --------------------------------------------------- 

  12. %ifdef 符号 

  13. %endif 

  14. ------------------------------------------ 

  15. %if expr 

  16.      expr为非0才执行 

  17. %endif 

  18. ----------------------------------------- 

  19. %rep 循环次数 

  20.        指令 

  21. %endrep 

  22. -------------------------------------------------- 

  23. %macro     宏名称 参数个数 

  24.            宏本体 

  25. %endmacro 

  26. 例子:     %macro readchr 1 

  27.                   push ax 

  28.                   mov ah,1 

  29.                   int 21h 

  30.                   mov [%1],al 

  31.                   pop ax 

  32.             %endmacro  

  33. 把此宏保存为mac文件 

  34. ------------------------------------------------------ 

  35. %include ".mac"  ;文件引用宏 

  36. char db ' ' 

  37.        redchr char     ;char位读入的字符 

  38. ------------------------------------------------------

一把情况下定义宏并且引用例如定义一个读取字符长数据的

 

;************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 ''