直观理解
仓库,弹夹,书箱…等等,太多了。总之,FIFO
从内存上理解入栈出栈操作
操作栈最重要的就是操作栈顶的位置:
入栈时把栈顶往上提,再把数据放到栈顶指向的位置上
出站时把数据拿走,再把栈顶往下压一格
8086中,用SS于SP所组成的栈顶内存地址作为栈顶指向,并且确定了出入栈的数据只能是16位数据(字型数据)
Tips:生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,他的生长方向是向下的,是向着内存地址减小的方向增长。
所以入栈时SP减小
push ax ;修改SP指针 SP=SP-2---->ax寄存器内的数据放到栈顶
pop bx ;将栈顶数据搬移到bx寄存器内--->修改SP指针 SP=SP+2
如何决定栈顶标记在哪里 决定栈的大小
我们可以决定 栈开在哪儿(栈顶标记在哪里),栈的大小:
起始地址 + 你所设定的栈的大小字节数
0000 + 16(10H) = 10 H ss:sp所组合出来的栈顶标记
;更换栈的地址
mov ax,2000
mov ss,ax ;把栈底设置到SS 2000上
;设置栈的大小
mov sp,10
栈的大小建议设置成16的倍数
栈的越界问题
栈空间以外的地方可能存放了数据或者指令,栈越界可能会造成破坏
栈的作用:
1.临时性保存数据(函数跳转时保存一些寄存器的值,返回时要把寄存器从栈中恢 复)
2.用栈进行数据交换