汇编(4)- 栈

1)栈顶

栈是一种具有特殊访问方式的存储空间,特殊性在于数据的后入先出。

CPU提供指令以栈的形式访问内存,将一段内存空间当作栈来使用,也是编程时的一种安排,CPU提供基本的栈操作指令,入栈PUSH和出栈POP。PUSH和POP的对象可以是寄存器、内存单元(字单元)、段寄存器。

push ax   //将ax中的数据送入栈中
pop ax    //将栈顶数据送入ax

下图表示一个地址范围是10009H~1000FH的地址空间被用作栈,并对该栈进行一系列的操作: 

mov ax, 0123H
push ax
mov bx, 2266H
push bx
mov cx, 1122H
push cx
pop ax //执行后ax = 1122H
pop bx //执行后bx = 2266H
pop cx //执行后cx = 0123H

思考

1、 CPU如何知道一段内存空间是当作栈来使用的呢?

2、 CPU如何确定栈顶内存单元的呢?

就像CS和IP中存放着当前指令的段地址和偏移地址,来确定当前要执行指令的位置。CPU要确定栈顶地址,需要另投外另个寄存器,段寄存器SS和寄存器SP,任意时刻,SS:SP指向栈顶,SS存放栈顶内存单元的段地址,SP存放栈顶内存单元的偏移地址。

push ax的执行过程:SP=SP–2,栈顶向上移一个字的内存空间;将ax中的内容送入到SS:SP指向的内存单元。

pop ax的执行过程:将站定内存单元的数据送入ax;SP=SP+2。注意:出栈后内存单元里的数据依然存在,只是不在栈中了,如果再次执行push,数据将被新的数据覆盖。

思考:将1000FH这段内存空间当作栈来使用,初始状态的栈是空的,那么SS=1000H,SP=?

答案:0010H

2)栈顶越界

栈是内存空间中的一段,在栈空时执行pop,或者栈满时执行push,都会使得栈顶超出这个内存空间范围,这种现象称为栈顶越界。栈顶越界是危险的,因为内存空间已经分配好,栈以外的内存空间有可能存放了用以他途的数据或指令,所以我们希望CPU帮忙解决栈顶越界的问题,但是显然CPU是做不到的,它只能通过寄存器内容知道当前的栈顶地址。

思考:将10000H到1000FH这段内存空间当作栈,初始状态是空的,将ax、bx、ds中的数据压栈。

mov ax,1000H
mov ss,ax
mov sp,0010H //初始化的栈顶位置指向1000FH的下一个内存单元
push ax //压栈
push bx //压栈
push ds //压栈

思考:将10000H到1000FH这段内存空间当作栈,初始状态是空的,设置ax=001AH、bx=001BH,将ax、bx中的数据压栈,然后将ax、bx清零,从栈中恢复ax、bx的内容。

mov ax,1000H
mov ss,ax
mov sp,0010H  //初始化的栈顶位置在10010H
mov ax,001AH
mov bx,001BH
push ax
push bx
sub ax,ax; //mov ax,0也可以,但是需要占用3字节,sub ax,ax占2字节
sub bx,bx;
pop bx //后入先出
pop ax //先入后出

3)栈段

栈段和数据段一样,长度N<=64KB,地址连续,起始地址为16的倍数的内存单元。

思考:10000H到1FFFFH为栈段,初始状态为空,sp=?

将一段64KB的内存空间用做栈段,栈段最底部的字单元地址为1000:FFFE,所以初始栈空的状态下,SP= FFFEH+2= 0, SS= 1000H;

思考:16位8086CPU的可设置栈段的最大空间?

答:64KB,压栈push或出栈pop的时候主要的工作是改变寄存器SP的栈顶偏执地址,SP最大的存储容量是64KB,所以栈空时SP的内容是0000H,栈满时SP的内容是FFFFH,如果继续压栈,SP的内容将变回0,在SS段寄存器内容不变的情况下,栈段的内容将被被循环的覆盖!所以,可设置的最大的栈空间是64KB。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值