对于栈的基本理解

对于栈的基本理解
目录
一.栈顶的设置
二.栈操作操作字节数问题
三.栈的越界问题
在这里插入图片描述
一. 在设置一个栈的时候,有以下几个步骤:
1.将栈指针SS:IP设置好;
2.初始化栈。

其中值得注意的是:
(1)SS:SP设置的栈顶地址,也就是高位地址。而不是传统思维的低位。

在进行push操作的时候,SP-2 指针向上移动两个内存单元,也就是两个字节,一个字。

二.栈的操作字节数问题
为什么PUSH操作之后SP-2呢?它不能-1吗?
指令PUSH AX; AX为16位寄存器,所以一次性必须压栈一个字
8086CPU不支持 PUSH AL;//AL为AX的低字段,可以看做半个AX,可以认为是一个8位寄存器

二.栈顶越界问题
什么是栈顶越界?
我们先得理解栈的内存大小,实际上在栈没有明确的内存大小,在设置栈的时候,我们第一步找到一段安全的内存空间(修改不会影响其他程序的内存),再在这段内存空间的最高地址处设置SS:SP

栈是一个段内存空间,实际上它和其他任何内存空间没有区别,区别仅在于它执行的方式:push的添加一个元素到ss:sp上面的一个位置,然后SP-2,向低地址单元移动一个字的长度。
但是这里就有一个问题,因为在内存中,栈其实只是一段没有做任何限制的内存空间,所以当你存储的数据大小总量超过了栈的内存大小会怎么样呢?
CPU并不会检测这个,实际上我们没有也不能真正意义上设置栈的大小。使用PUSH就是 SP-2,并在SS:SP-2处存放一个数据。当存放的数据超过了栈的理想内存时,PUSH指令依旧可以执行,但是这个时候执行存放的数据就不在安全区域内了。这可能会严重影响程序的运行,因为新的数据可能毁坏了其他程序的指令或者数据。

8086不支持设置保护

三.实例 栈的极限大小
一个栈的最大空间是多少?
SP偏移量 决定了栈的大小是一个段的大小,因为SP只能在一个段进行位移,偏移能达到的最大大小决定了栈的最大大小。SP的变化范围 0~FFFFH

现在假设SS是2000,那我想设置栈的大小为一个段,也就是栈所能达到的最大空间,SP应该是多少?
解: 首先假设你想设置一个内存为一个段的栈空间,我们得理解内存的分布:、
在这里插入图片描述
由于栈PUSH 或者POP的过程中,栈的段指针是不会变的(这也是造成了栈的最大空间是一个段的原因),所以SS仍旧可以等于2000,我们只需要设置SP为0000即可。

补充:
PUSH [偏移量]默认段寄存器为 ds 因为是将数据压进去 数据是未知的 而压入位置一定是SS:SP-2的位置,所以要补充ds:[] 的数据信息
POP []同理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值