nasm语言中描述符可以使用宏%macro来赋值
%macro的使用方法如下
%macro为多行宏用法与单行宏%define相对应
%macro宏已%macro符位开始已%endmacro符号结束
%macro 后接宏的名称、名称后面接宏的传入参数个数
例如 %macro demo 2 这一行声明了demo为宏的名称 有两个传入参数
其中每个传入参数使用%加计数索引来表示(从1开始,例如%1表示第一个传入参数)
GDT(Global Descriptor Table)全局描述符表
它由64位2进制码组成
(63-56位)段基址2存放段基址的31-24位
(55位)G位段界限粒度位。G=0时段界限粒度为字节;G=1段界限粒度位4KB
(54位)D/B位分为三种情况
<1>在可执行代码描述符中,这一位叫D位。D=1时在默认情况下指令使用32位地址及32或8位操作数;
D=0时,在默认情况下使用下使用16位地址及16位或8位操作数
<2>在向下扩展数据段的描述符中,这一位叫做B位。B=1时,段的上部界限为4G;B=0时,段的上半部界限为64K
<3>在描述堆栈段(由SS寄存器指向的段)的描述符中,这一位叫做B位。B=1时,隐式的堆栈访问指令(如push、
pop和call)使用32位堆栈指针寄存器esp;B=0时,隐式的堆栈访问指令(如push、pop和call)使用16位堆栈指针寄存器sp
(53位)为0
(52位)AVL为保留为,可以被系统软件使用。
(51-48位)存放段界限的19-16位
(47位)P位存在位。P=1表示段在内存中存在;P=0表示段在内存中不存在。
(46-45位)DPL描述符特权级。特权级可以是0、1、2、3.数字越小特权级越大。
(44位)S位指明描述符是数据段/代码段描述符(S=1)还是系统段/门描述符(S=0)。
(43-40位)TYPE描述符类型
(39-16位)段基址的23-0位
(15-0位)段界限15-0位
这里使用宏Descriptor为GDT赋值
_________________________________________________________________________________________________________________________________________
伪指令dw、db与dd
db 为1字节
dw 为2字节
dd 为4字节
_________________________________________________________________________________________________________________________________________
在为GDT初始化时如 段基址 段界限 属性
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, 92h的初始化过程如下
%macro Descriptor 3
dw %2 & 0ffffh ;设置段界限为0ffffh
dw %1 & 0ffffh ;设置段基址前16位08000h
db (%1 >> 16) & 0ffh ;设置段基址的23-16位为0Bh、即段基址为0B8000h
dw ((%2 >> 8) & 0f00h) | (%3 & 0f0ffh) ;其中前半部分0ffh&0f00h位0h后半部分92h、即结果为0092h 2进制代码为 10010010
段界限粒度为字节、段的上部界限为64k、描述符在段内存中存在、描述符特权级为0(最大)、数据段/代码段描述符、具有读写的权限
db (%1 >> 24) & 0ffh ;设置段基址2部分位00h
%endmacro
LDT(Local Descriptor Table)局部描述符表
而LDT的结构和赋值方式是与GDT相同的
IDT(Interrupt Descriptor Table)中断描述符表
IDT使用门描述符赋值
门描述符同样由64位组成
(63-48位)偏移的31-16位
(47位)P位存在位。P=1表示段在内存中存在;P=0表示段在内存中不存在。
(46-45位)DPL描述符特权级。特权级可以是0、1、2、3.数字越小特权级越大。
(44位)S位指明描述符是数据段/代码段描述符(S=1)还是系统段/门描述符(S=0)。
(43-40位)TYPE描述符类型
(39-37位)永远为0
(36-32位)Dcount的4-0位
(31-16)选择子15-0位
(15-0)偏移的15-0位
IDT的初始化时如
LABEL_IDT:
;门
%rep 255 目标选择子 偏移 DCount 属性
Gate SelectorCode32 SpuriousHandler 0 DA_386IGate
%endrep
%macro Gate 4
dw (%2 & 0ffffh) SpuriousHandler
dw %1 SelectorCode32
dw (%3 & 1fh) | ((%4 << 8) & 0ff00h) 8Eh << 8 & 0ff00h => 08E00h
段在内存中、0优先级最高、门描述符、执行/读、一致码段、DCount=0
dw ((%2 >> 16) & 0ffffh) SpuriousHandler >> 16 & 0ffffh