描述符表 由8字节的描述符组成, 高32位为描述符起始地址,低16位为界限值
界限: 最大偏移 == 总字节数-1
描述符内的界限 == 长度单位 根据G位来计算最大偏移,G(0) = 1, G(1) = 4k
由于偏移从0开始计算,因此 (界限+1) == 总长度, 总长度 * (4K或1) == 总字节数
因此最大偏移 : (界限+1)*(4K或1) - 1
比如(代码段/数据段)基址:0 , 界限0x1ff
若G位=0(1字节), 偏移:(0x1ff+1)*1-1 = 0x1ff,占用字节数(0x1ff+1)*1 = 512b,eip 从 [ 0 ~ 1ff ] 为有效偏移地址
若G位=1(4K) , 占用字节数(0x1ff+1)*4k,最大偏移(0x1ff+1)*4k-1 = 1FFFFF,eip从[0~1FFFFF] 为有效偏移
栈段的界限也类似
假设基址:0, 界限:0xffffe , esp:0xffffffff
若G=0, 最大偏移(esp最小值):(0xffffe+1)*1 - 1 + 1 = 0xffffe, 字节:0xffffffff- 0xffffe + 1
若G=1, 最大偏移(esp最小值):(0xffffe+1)*4k - 1 + 1= 0xFFFFF000, 字节数:0xffffffff-0xFFFFF000+1
为什么还要+1 ? 栈顶指向最高地址的下一个内存地址
描述符D/B位
D/B == 1 , 代码段则使用eip, stack段使用esp
D/B ==0 , 代码段用ip , stack用sp
如果代码段使用 push 4字节指令, 但stack段的B位为0,使用 sp - 4, 用sp/esp由stac