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