; 图示二 ; 高地址………………………………………………………………………低地址 ; | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ; |7654321076543210765432107654321076543210765432107654321076543210| <- 共 8 字节 ; |--------========--------========--------========--------========| ; ┏━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┓ ; ┃31..24┃ (见下图) ┃ 段基址(23..0) ┃ 段界限(15..0)┃ ; ┃ ┃ ┃ ┃ ┃ ; ┃ 基址2┃③ │ ②│ ① ┃基址1b│ 基址1a ┃ 段界限1 ┃ ; ┣━━━╋━━━┳━━━╋━━━━━━━━━━━╋━━━━━━━┫ ; ┃ %6 ┃ %5 ┃ %4 ┃ %3 ┃ %2 ┃ %1 ┃ ; ┗━━━┻━━━┻━━━┻━━━┻━━━━━━━┻━━━━━━━┛ ; │ \_________ ; │ \__________________ ; │ \________________________________________________ ; │ \ ; ┏━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┓ ; ┃ 7 ┃ 6 ┃ 5 ┃ 4 ┃ 3 ┃ 2 ┃ 1 ┃ 0 ┃ 7 ┃ 6 ┃ 5 ┃ 4 ┃ 3 ┃ 2 ┃ 1 ┃ 0 ┃ ; ┣━━╋━━╋━━╋━━╋━━┻━━┻━━┻━━╋━━╋━━┻━━╋━━╋━━┻━━┻━━┻━━┫ ; ┃ G ┃ D ┃ 0 ┃ AVL┃ 段界限 2 (19..16) ┃ P ┃ DPL ┃ S ┃ TYPE ┃ ; ┣━━┻━━┻━━┻━━╋━━━━━━━━━━━╋━━┻━━━━━┻━━┻━━━━━━━━━━━┫ ; ┃ ③: 属性 2 ┃ ②: 段界限 2 ┃ ①: 属性1 ┃ ; ┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━┛ ; 高地址 低地址 ; 初始化 32 位代码段描述符 ===================================================================================== ; xor eax, eax ; mov ax, cs ; shl eax, 4 ; EAX = CS*16 ; add eax, LABEL_SEG_CODE32 ; EAX = CS*16+偏移 ; mov word [LABEL_DESC_CODE32 + 2], ax ; 段基址1a = 0-15位 ; shr eax, 16 ; mov byte [LABEL_DESC_CODE32 + 4], al ; 段基址1b = 16-23位 ; mov byte [LABEL_DESC_CODE32 + 7], ah ; 段基址2 = 24-31位 ; %macro Descriptor 3 =================================================================== ; +00 dw %2 & 0FFFFh ; 段界限1 ; +02 dw %1 & 0FFFFh ; 段基址1 ; +04 db (%1 >> 16) & 0FFh ; 段基址2 ; +05 dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) ; 属性1 + 段界限2 + 属性2 ; +07 db (%1 >> 24) & 0FFh ; 段基址3 ; %endmacro ; 共 8 字节 ; GDT =================================================================================== ; 段基址, 段界限 , 属性 ; LABEL_GDT: Descriptor 0, 0, 0; 空描述符 ; LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C + DA_32; 非一致代码段 ; LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ; 显存首地址 ; GDT 结束 ; 说明: ; ; (1) P: 存在(Present)位。 ; P=1 表示描述符对地址转换是有效的,或者说该描述符所描述的段存在,即在内存中; ; P=0 表示描述符对地址转换无效,即该段不存在。使用该描述符进行内存访问时会引起异常。 ; ; (2) DPL: 表示描述符特权级(Descriptor Privilege level),共2位。它规定了所描述段的特权级,用于特权检查,以决定对该段能否访问。 ; ; (3) S: 说明描述符的类型。 ; 对于存储段描述符而言,S=1,以区别与系统段描述符和门描述符(S=0)。 ; ; (4) TYPE: 说明存储段描述符所描述的存储段的具体属性。 ; ; ; 数据段类型 类型值 说明 ; ---------------------------------- ; 0 只读 ; 1 只读、已访问 ; 2 读/写 ; 3 读/写、已访问 ; 4 只读、向下扩展 ; 5 只读、向下扩展、已访问 ; 6 读/写、向下扩展 ; 7 读/写、向下扩展、已访问 ; ; ; 类型值 说明 ; 代码段类型 ---------------------------------- ; 8 只执行 ; 9 只执行、已访问 ; A 执行/读 ; B 执行/读、已访问 ; C 只执行、一致码段 ; D 只执行、一致码段、已访问 ; E 执行/读、一致码段 ; F 执行/读、一致码段、已访问 ; ; ; 系统段类型 类型编码 说明 ; ---------------------------------- ; 0 <未定义> ; 1 可用286TSS ; 2 LDT ; 3 忙的286TSS ; 4 286调用门 ; 5 任务门 ; 6 286中断门 ; 7 286陷阱门 ; 8 未定义 ; 9 可用386TSS ; A <未定义> ; B 忙的386TSS ; C 386调用门 ; D <未定义> ; E 386中断门 ; F 386陷阱门 ; ; (5) G: 段界限粒度(Granularity)位。 ; G=0 表示界限粒度为字节; ; G=1 表示界限粒度为4K 字节。 ; 注意,界限粒度只对段界限有效,对段基地址无效,段基地址总是以字节为单位。 ; ; (6) D: D位是一个很特殊的位,在描述可执行段、向下扩展数据段或由SS寄存器寻址的段(通常是堆栈段)的三种描述符中的意义各不相同。 ; ⑴ 在描述[可执行段]的描述符中,D位决定了指令使用的地址及操作数所默认的大小。 ; ① D=1表示默认情况下指令使用32位地址及32位或8位操作数,这样的代码段也称为32位代码段; ; ② D=0 表示默认情况下,使用16位地址及16位或8位操作数,这样的代码段也称为16位代码段,它与80286兼容。可以使用地址大小前缀和操作数大小前缀分别改变默认的地址或操作数的大小。 ; ⑵ 在向下扩展[数据段]的描述符中,D位决定段的上部边界。 ; ① D=1表示段的上部界限为4G; ; ② D=0表示段的上部界限为64K,这是为了与80286兼容。 ; ⑶ 在描述由SS寄存器[寻址的段]描述符中,D位决定隐式的堆栈访问指令(如PUSH和POP指令)使用何种堆栈指针寄存器。 ; ① D=1表示使用32位堆栈指针寄存器ESP; ; ② D=0表示使用16位堆栈指针寄存器SP,这与80286兼容。 ; ; (7) AVL: 软件可利用位。80386对该位的使用未左规定,Intel公司也保证今后开发生产的处理器只要与80386兼容,就不会对该位的使用做任何定义或规定。 ; ;---------------------------------------------------------------------------- ; 在下列类型值命名中: ; DA_ : Descriptor Attribute ; D : 数据段 ; C : 代码段 ; S : 系统段 ; R : 只读 ; RW : 读写 ; A : 已访问 ; 其它 : 可按照字面意思理解 ;----------------------------------------------------------------------------
时间: 2024-11-07 14:14:33