《自己动手写操作系统》于渊跟我们开了个玩笑
看过的朋友不知道还记不记得下面这两个宏
Descriptor
Gate
如果不记得,那么我可以提示一下
; 宏 ------------------------------------------------------------------;; 描述符; usage: Descriptor Base, Limit, Attr; Base: dd; Limit: dd (low 20 bits available); Attr: dw (lower 4 bits of higher byte are always 0)%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 ; 共 8 字节;; 门; usage: Gate Selector, Offset, DCount, Attr; Selector: dw; Offset: dd; DCount: db; Attr: db%macro Gate 4 dw (%2 & 0FFFFh) ; 偏移 1 (2 字节) dw %1 ; 选择子 (2 字节) dw (%3 & 1Fh) | ((%4 << 8) & 0FF00h) ; 属性 (2 字节) dw ((%2 >> 16) & 0FFFFh) ; 偏移 2 (2 字节)%endmacro ; 共 8 字节; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; 门 目标选择子, 偏移, DCount, 属性LABEL_CALL_GATE_TEST: Gate SelectorCodeDest, 0, 0, DA_386CGate + DA_DPL3
dw (%3 & 1Fh) | ((%4 << 8) & 0FF00h) ; 属性 (2 字节)
dw (0 & 0FFFFh) dw SelectorCodeDest dw (0 & 1Fh) | ((DA_386CGate + DA_DPL3 << 8) & 0FF00h) dw ((0 >> 16) & 0FFFFh)
dw (0 & 0FFFFh) dw SelectorCodeDest dw (0 & 1Fh) | ((DA_386CGate | DA_DPL3 << 8) & 0FF00h) dw ((0 >> 16) & 0FFFFh)
; 宏 ------------------------------------------------------------------;; 描述符; usage: Descriptor Base, Limit, Attr; Base: dd; Limit: dd (low 20 bits available); Attr: dw (lower 4 bits of higher byte are always 0)%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 ; 共 8 字节;; 门; usage: Gate Selector, Offset, DCount, Attr; Selector: dw; Offset: dd; DCount: db; Attr: db%macro Gate 4 dw ((%2) & 0FFFFh) ; 偏移 1 (2 字节) dw (%1) ; 选择子 (2 字节) dw ((%3) & 1Fh) | (((%4) << 8) & 0FF00h) ; 属性 (2 字节) dw (((%2) >> 16) & 0FFFFh) ; 偏移 2 (2 字节)%endmacro ; 共 8 字节