%macro Descriptor宏定义解析

本文解析了《一个操作系统的实现》中nasm汇编的段描述符宏定义,介绍了段描述符的结构,包括Base、Limit和Attr字段,并探讨了段寄存器如何根据段选择子获取段描述符。

1.《一个操作系统的实现》中有一个nasm汇编关于段描述符的宏定义,如下:

; 描述符
; useage: Descriptor Base, Limit, Atrr
;         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
        dw      %1 & 0FFFFh             ; 段基址1
        db      (%1 >> 16) & 0FFh       ; 段基址2
        dw      ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh)     ; 属性1 + 段界符2 + 属性2
        db      (%1 >> 24) & 0FFh       ; 段基址3
%endmacro ;共 8 字节

2.为了偏于理解这个段描述符宏定义的含义,先了解一下相关背景。

  • 通用段描述符的格式如下:

即一个段描述符总共8字节,64位,其中

Base字段(32位):高4字节的24-31位和0-7位,还有低4字节的16-31位,这三部分构成了一个32位的地址

Limit字段(32位):对应的有高4字节的16-19位,低4字节的0-15位,共计20位,剩余12位(实际如果G=0,在limit前面补000,最大可以表示0x000FFFFF;如果G=1,在limit后面补FFF,最大可以表示0xFFFFFFFF)

Attr(16位):段描述符高4字节的8-23位组成。

现在再回看宏定义其实就是将Base、Limit、Atrr三个数值拆成段描述符这样的结构。

 

3.相关知识扩展

常用的段寄存器ES、CS、SS、DS、FS、GS、LDTR、TR其实是个96位的寄存器,如下图

总共有96位,只有16位段选择子可见,其余80位不可见。实际过程会根据段选择子到GDT或者LDT中获取段描述符,不可见部分的Base、Litmit、Attribute其实分别对应段描述符相应字段。

参考链接:

https://www.cnblogs.com/jadeshu/p/10663712.html

https://www.cnblogs.com/longintchar/p/5224405.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值