%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
以上是定义。
以下是有关其init的问题:
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
答案 0 :(得分:1)
该宏初始化全局描述符表条目(即段描述符)。由于x86架构历史,这些描述符将一些字段分成几个部分:
(图片来自OS Dev wiki)
宏获取base,limit和access值,并将它们放入8字节条目的相应位置。
代码片段将描述符的Base
字段初始化为其运行时值。由于Base
必须是线性地址,因此它首先使用linaddr = segment<<4 + offset
公式计算该地址(对于实模式有效)。
有关详细信息,请参阅操作系统开发维基:Segmentation,GDT。