栈的两个操作 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 然后再压入数据吧。在作 sp=sp-2 操作后,也压入数据之前,ss:sp 处数据未定,即没有意义,其它时候都是有效的栈顶数据。
------解决方案--------------------
楼主,这么跟你说吧。
栈底一般是预先设定在某一个高地址的,到栈顶预留一定的空间。
你所说的压栈过程,是先将栈指针 -2 以便容纳即将压入的 2 字节数据。
你这里的写入数据的过程,是按地址增加的方式寻址的,因此,将数据写入了刚刚“腾”出来的地方。