首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

《自己动手写操作系统》开篇杂问解决方案

2012-02-28 
《自己动手写操作系统》开篇杂问在《自己动手写操作系统》中,有这样描述描述符usage:DescriptorBase,Limit,A

《自己动手写操作系统》开篇杂问
在《自己动手写操作系统》中,有这样描述


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


我想问一下,为什么不换成下面一段,我自己看着这么别扭,上面还要进行计算,

struc   gdtdisc
        LIMITL:         resw           1   ;段界限低16位
                  alignb   2
        BASEL:           resw           1   ;基地址低16位
        BASEM:           resb           1   ;基地址中间8位
                  alignb   1
        ATTYPE:         resb           1   ;段属性(含segment   type)
        ATLIMI:         resb           1   ;段属性(含segment   limit)
        BASEH:           resb           1   ;基地址的高8位
endstruc
;数据结构

下面是实例化
gdtdisc:
      istruc   gdttype
          at   LIMITL,DW   0
          at   BASEL,   DW   0
          at   BASEM,   DB   0
          at   ATTYPE,DB   0
          at   ATLIMI,DB   0
          at   BASEH,   DB   0
      iend

书上用宏来实现,方便是方便,但是要进行多余的计算,另外谁能不能告诉我我的这个alignb用的对不对??
我想知道如果在宏内部最后用了alignb   1那么,后面的程序是不是都对齐一个字节,还是出了个结构,或者宏,
就会启用默认的4字节对齐。

[解决办法]
事实上我认为书上的做法更方便并且易于理解。描述符确定某个段的基地址,界限与属性,而这3个参数不连续的分散在8个字节中,书上的做法使你在定义描述符时给出3个正确值就行了,然后由宏来确定哪些数值放在8字节中的哪些位。而你的做法无法直接的给出那3个参数,虽然表面上你好像避免了一些计算,但是你不得不自己去把那3个参数拆散然后放入相应的位中

热点排行