当前位置: 代码迷 >> 汇编语言 >> 对于栈的操作不是很清楚
  详细解决方案

对于栈的操作不是很清楚

热度:327   发布时间:2016-05-02 04:51:04.0
对于栈的操作不是很明白
栈的两个操作 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 字节数据。
你这里的写入数据的过程,是按地址增加的方式寻址的,因此,将数据写入了刚刚“腾”出来的地方。
  相关解决方案