Content #
栈的线性基地址为0x00007C00,段界限为0xFFFE,粒度为4KB,并设置栈指针寄存器ESP的初始值为0:
mov eax,0x0020 ;0000 0000 0010 0000 加载下标为4的段描述符
mov ss,eax
xor esp,esp ;ESP <- 0
因粒度为4KB,实际使用的段界限为: 0xFFFFE * 0x1000 + 0xFFF = 0xFFFFEFFF ESP的最大值是0xFFFFFFFF,因此,操作该段时,处理器的检查规则是:
0xFFFFF000 <= (ESP - 操作数长度) <= 0xFFFFFFFF
其中,0xFFFFF000 = 0xFFFFEFFF + 1
该栈最低端的有效物理地址是: 0x00007C00 + 0xFFFFF000 = 0x00006C00 最高端的有效物理地址是: 0x00007C00 + 0xFFFFFFFF = 0x00007BFF 栈空间的大小是4KB。
当第一次压栈时: push ecx 先减ESP,再访问栈,此时ESP的值为: 0 - 4 = 0xFFFFFFFC