我对堆栈段(ss)和堆栈指针(sp)寄存器有点困惑。
当堆栈为空时,sp的值是否等于ss的值?
我了解到,当我们将一个字(2字节)推入堆栈时,sp会减少2个单位。如果第一个陈述是真的(sp=ss),那么我可以说,如果堆栈不为空,堆栈指针的值始终小于或等于堆栈段的值,这是真的吗?
如果我们将一个值赋给sp,使其大于ss会发生什么?例如:
mov ss,200h
mov sp,400h
mov ax,1010h
push ax
请纠正任何错误,提前感谢。
请纠正任何错误,提前感谢。
ss
就像其他段寄存器一样,例如 cs
或 ds
。它们按照通常的实模式规则参与形成物理地址,如 address = 16 * segment + offset
,其中堆栈的偏移量来自 sp
。因此,最后一个推入堆栈的项目地址为 16 * ss + sp
。除非您事先知道堆栈末尾的位置,否则无法确定堆栈是否为空,而且 ss
和 sp
的数值比较根本没有意义。ss aaaaaaaaaaaaaaaa----
sp ----aaaaaaaaaaaaaaaa
使用的地址为ss * 16 + sp
。段寄存器选择整个1024 kB内存空间中的64 kB段,而堆栈指针是该段内的偏移量。
当堆栈为空时,堆栈指针指向为堆栈分配的空间顶部。
例如,如果ss寄存器包含0200h,则堆栈段从02000h到11fffh。然而,实际堆栈可能比堆栈段小。如果堆栈大小为16 kB,则sp从4000h开始,并在堆栈增长时向0000h移动。