日期:2014-05-16  浏览次数:20851 次

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


;   描述符
;   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个参数拆散然后放入相应的位中