2
%macro Descriptor 3
dw  %2 & 0FFFFh             
dw  %1 & 0FFFFh             
db  (%1 >> 16) & 0FFh           
dw  ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) 
db  (%1 >> 24) & 0FFh           
%endmacro ; 

LABEL_DESC_DATA:   Descriptor    0,   DataLen-1, 92h 

以上是定义。

以下是有关其初始化的问题:

xor eax, eax                           
mov ax, ds                              
shl eax, 4                              
add eax, LABEL_DATA                     
mov word [LABEL_DESC_DATA + 2], ax      ;what happens in this instruction?
shr eax, 16
mov byte [LABEL_DESC_DATA + 4], al
mov byte [LABEL_DESC_DATA + 7], ah
4

1 回答 1

1

该宏初始化全局描述符表条目(即段描述符)。由于 x86 架构历史,这些描述符有一些字段分为几个部分:

在此处输入图像描述
(图片来自OS Dev wiki

宏获取基值、限制值和访问值并将它们放入 8 字节条目的相应位置。

代码片段将描述符的字段初始化Base为其运行时值。因为Base必须是线性地址,所以它首先使用linaddr = segment<<4 + offset公式计算该地址(对实模式有效)。

有关详细信息,请参阅 OS 开发 wiki:分段GDT

于 2013-06-18T15:30:07.747 回答