%macro Descriptor 3
dw %2 & 0FFFFh ; 段界限 1 (2 字节)
dw %1 & 0FFFFh ; 段基址 1 (2 字节)
db (%1 >> 16) & 0FFh ; 段基址 2 (1 字节)
dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) ; 属性 1 + 段界限 2 + 属性 2 (2 字节)
db (%1 >> 24) & 0FFh ; 段基址 3 (1 字节)
%endmacro ;
这个宏看了很长时间才看懂,首先它有三个参数:段基址1% 段界限2% 属性3%,共有8个字节长。
现在开始填充这个宏(8个字节初始全为0):
1.取第二个参数的低16位(2个字节大小)作为宏第一、二个字节
2.取第一个参数的低16位(2个字节大小)作为宏第三、四个字节
3.取第一个参数的第17-24位(1个字节大小)作为宏第五个字节
4.1.取第三个参数的第1-8位(1个字节大小)作为宏第六个字节
4.2取第二个参数的第17-20位(半个字节大小)
4.3取第三个参数的第12-15位(半个字节大小)并上作为宏第七个字节
5.取第一个参数的第24-32位(1个字节大小)作为宏第八个字节
填充完毕
段基址范围:0-0xFFFFFFFF
段界限范围:0-0x000FFFFF
不对的地方欢迎指正!