我对堆栈段(ss)和堆栈指针(sp)寄存器有点困惑。 当堆栈为空时,sp值是否等于ss值? 我读到当我们将一个字(2字节)推入堆栈时,sp递减2,如果第一个语句为真(sp = ss),那么我可以说堆栈是否为空,堆栈指针的值总是小于或等于堆栈段的值是这样吗? 如果我们影响sp的值,使它大于ss ??会发生什么?即: mov ss,200h mov sp,400h mov ax,1010h 推斧
请提前纠正任何错误
答案 0 :(得分:4)
不,ss
是与cs
或ds
等其他人一样的细分受众群。它们按照通常的实模式规则address = 16 * segment + offset
参与形成物理地址,其中堆栈的偏移来自sp
。因此,在堆栈上推送的最后一项具有地址16 * ss + sp
。您不知道堆栈何时为空,除非您对堆栈末尾有先验知识,并且ss
与sp
相比的数值没有意义一点都不。
答案 1 :(得分:2)
堆栈段(ss)寄存器和堆栈指针(sp)寄存器用于为堆栈创建地址的不同部分:
u
使用的地址是ss aaaaaaaaaaaaaaaa----
sp ----aaaaaaaaaaaaaaaa
。段寄存器选择整个1024 kB存储空间的64 kB段,堆栈指针是该段内的偏移量。
当堆栈为空时,堆栈指针指向为堆栈分配的空间的顶部。
如果ss寄存器包含例如0200h,则堆栈段从02000h变为11fffh。但是,实际堆栈可能小于堆栈段。如果堆栈是例如16kB,那么sp从4000h开始并在堆栈增长时朝向0000h。