在orange's一个操作系统的实现,第3章,pmtest1.asm中,有如下代码
GdtPtr dw GdtLen - 1 ; GDT界限
我们知道一个描述符中包含段基址和段界限,那么如果GdtLen是GDT的长度,为什么段界限要-1呢?
因为段界限表达的是段内的最大偏移,而不是段的最大长度。
一个简单的例子,加入一个段有如下内存:
var1 db 0x01 ;偏移0
var2 db 0x02 ;偏移1
那么段界限应该是1还是2呢?答案是1,最大偏移是1。
访问段中数据使用:段基址 +偏移(所以段界限说明的是这个最大偏移)
总之,牢记一点,段界限不是指段的最大长度,而是只段内的最大偏移,所以一定要在段长度的基础上再减1。