宏语法格式如下:
%macro 宏名称 参数个数
宏的内容
%endmacro
宏的第一个参数用%1表示,第二个参数用%2表示,依次类推。
最近看orange’s 一个操作系统的实现,发现nasm中的宏汇编不是很清楚,在此详细记录一下
%macro Descriptor 3
dw %1 & 0FFFFh ; 段基址1
dw %2 & 0FFFFh ; 段界限1
db (%1>>16) & 0FFh ; 段基址2
dw ((%2>>8) & 0F00h) | (%3 & 0F0FFh) ; 属性1+段界限2+属 性2
db (%1>>24) & 0FFh ; 段基址3
%endmacro;
共 8 字节 在段[SECTION.gdt]中并列有3个Descriptor,看上去是个结构数
上面的是宏的详细情况,下面是调用宏
LABEL_GDT: Descriptor 0, 0, 0 ; 空描述符
其中Descriptor 0,0,0表示传入的三个参数,这三个参数在宏定义中就是以%1,%2,%3表示,所以将%1用传入的参数替换掉即可
替换后的情况即:
dw 0 & 0FFFFh ; 段基址1
dw 0 & 0FFFFh ; 段界限1
db (0>>16) & 0FFh ; 段基址2
dw ((0>>8) & 0F00h) | (0 & 0F0FFh) ; 属性1+段界限2+属 性2
db (0>>24) & 0FFh ; 段基址3
%endmacro;
共 8 字节 在段[SECTION.gdt]中并列有3个Descriptor,看上去是个结构数
就是这么简单
离线