《自己动手写操作系统》开篇杂问
在《自己动手写操作系统》中,有这样描述
; 描述符
; 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个参数拆散然后放入相应的位中