欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

对于栈的操作不是很清楚

更新时间: 2014-01-05 03:17:20 责任编辑: Author_N1

 

对于栈的操作不是很明白
栈的两个操作 push 和pop

  push ax的执行过程:

1)        SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶
        2)        将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶


 
对于压入第一个数据的时候之前,sp = sp,压入是sp = sp -2, 也就是说 第一个数据是放在
sp = sp -2 这个位置上的, 那么 空的两个字节地址为什么呢?



--参考方法--
push ax
等于 
mov [sp],ax
sub sp,2
--参考方法--
空出来的两字节,就是用来存放压栈的 ax 的
--参考方法--
8086中地址是由高向低的,假设偏移地址0到15是栈地址的话,栈为空时,sp指向偏移地址为16的位置。

执行push ax操作时,sp先减去2,指向14偏移位置,
然后ax的高字节入15位置,低字节入14位置。
--参考方法--
sp 减 2 ,这里的 sp 是 push 指令前的 sp ;将 ax 放在 ss:sp 处 的 sp 是“sp减2” 后的 sp,所以不存在你说的空的 2 字节的问题。
还是看书吧,书上应该有示意图的,那样会更直观明白些;还是不明白,就暂时放下吧,你已经是进入死胡同了。
--参考方法--
栈有四种方式,一般说栈的方式都是指压栈的方式,都是从压栈的角度来说的,弹栈是相反。
1.满递减堆栈:压栈时,先SP减,然后压入数据。栈的增长方向是往下,所以是减。
2.满递增堆栈:压栈时,先SP加,然后压入数据。栈的增长方向是往上,所以是增。
3.空递减堆栈:压栈时,先压入数据,然后SP减。栈的增长方向是往下,所以是减。
4.空递增堆栈:压栈时,先压入数据,然后SP增。栈的增长方向是往上,所以是增。

LZ,你对着看看,你这里说的是哪种栈。
--参考方法--
引用
按你的意思 是先把数据压入栈中, 然后再做 sp= sp -2 这个操作的么? 也就是 ss:sp不会有存放数据的
先做 sp=sp-2 然后再压入数据吧。在作 sp=sp-2 操作后,也压入数据之前,ss:sp 处数据未定,即没有意义,其它时候都是有效的栈顶数据。
--参考方法--
楼主,这么跟你说吧。

栈底一般是预先设定在某一个高地址的,到栈顶预留一定的空间。

你所说的压栈过程,是先将栈指针 -2 以便容纳即将压入的 2 字节数据。
你这里的写入数据的过程,是按地址增加的方式寻址的,因此,将数据写入了刚刚“腾”出来的地方。
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:17:20
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20413/
本文WWW.DOC100.NET DOC100.NET版权所有。