1/向下扩展的栈段

实际使用的段界限就是段内不允许访问的最低端偏移地址, (基地址+0)~(基地址+段界限)这段空间是不属于栈段.

举例画图说明:

例1, 基地址为0x00000010,段界限为0x10的栈段

12、(12.4.2)保护模式下数据段和栈段保护_操作数

段界限可以理解为栈向下扩展时的一个红线,不能碰, 所以压栈时​​ESP - 操作数的长度​​​后的值必须大于这个边界值.(这里这么理解与书中​​ESP - 操作数的长度​​​>=​​(实际使用的段界限+1)​​是一个意思)

例2 , 基地址为0x7c00 , 段界限为0x10

12、(12.4.2)保护模式下数据段和栈段保护_汇编语言_02

例3,基地址为0x00007C00, 段界限为0xFFFFEFFF的栈段,粒度为4KB

12、(12.4.2)保护模式下数据段和栈段保护_压栈_03

基地址为 0x00007C00, 段界限为 0xFFFFE(0x0~0xFFFE,共0xFFFFE+1个粒度的内存) ,粒度为4KB

栈的最小地址 
= 基地址+段界限 +1

栈的最大地址
= 基地址+ESP/SP的最大值

// 计算段界限
段界限
= (0xFFFFE+1)*4K -1
= (0xFFFFE*4k)+(4K-1)
= (0xFFFFE*0x1000)+(0x1000-1)
= 0xFFFFE*0x1000+0xFFFF
= 0xFFFFEFFF
段界限(0x00000000 ~ 0xFFFFEFFF ),共0xFFFFF000个内存单元(字节)
// 计算栈的最小地址
栈的最小地址
= 基地址+段界限 +1
= 0x00007C00 + 0xFFFFEFFF + 1
= 0x100006BFF + 1
= 0x100006C00
= 0x00006C00(保留32位)
栈的最大地址
= 基地址+ESP的最大值
= 0x00007C00 + 0xFFFFFFFF
= 0x00007BFF