Assembly 8086中的堆栈段和堆栈指针

Assembly 8086中的堆栈段和堆栈指针,assembly,stack,x86-16,segment,Assembly,Stack,X86 16,Segment,我对堆栈段(ss)和堆栈指针(sp)寄存器有点困惑。 堆栈为空时,sp值是否等于ss值? 我读到,当我们将一个字(2字节)推送到堆栈时,sp将递减2,如果第一个语句为true(sp=ss),那么我可以说,如果堆栈不是空的,堆栈指针的值总是小于或等于堆栈段的值,这是真的吗??。 如果我们影响sp的值,使其大于ss,会发生什么情况??即: mov-ss,200h mov sp,400小时 mov-ax,1010h 推斧 请纠正任何错误,thanx提前否,ss是一个段寄存器,与其他寄存器一样,如cs或

我对堆栈段(ss)和堆栈指针(sp)寄存器有点困惑。 堆栈为空时,sp值是否等于ss值? 我读到,当我们将一个字(2字节)推送到堆栈时,sp将递减2,如果第一个语句为true(sp=ss),那么我可以说,如果堆栈不是空的,堆栈指针的值总是小于或等于堆栈段的值,这是真的吗??。 如果我们影响sp的值,使其大于ss,会发生什么情况??即: mov-ss,200h mov sp,400小时 mov-ax,1010h 推斧


请纠正任何错误,thanx提前

否,
ss
是一个段寄存器,与其他寄存器一样,如
cs
ds
。它们根据通常的实模式规则参与形成物理地址,如
address=16*段+偏移量
,其中堆栈的偏移量来自
sp
。因此,堆栈上推送的最后一项具有地址
16*ss+sp
。除非事先知道堆栈的末尾,否则您不知道堆栈何时为空,
ss
sp
相比,数值没有任何意义。

堆栈段(ss)寄存器和堆栈指针(sp)寄存器用于创建堆栈地址的不同部分:

ss  aaaaaaaaaaaaaaaa----
sp  ----aaaaaaaaaaaaaaaa
使用的地址是
ss*16+sp
。段寄存器选择整个1024 kB内存空间中的64 kB段,堆栈指针是该段内的偏移量

当堆栈为空时,堆栈指针指向为堆栈分配的空间的顶部


如果ss寄存器包含例如0200h,则堆栈段从02000h变为11fffh。但是,实际堆栈可能小于堆栈段。例如,如果堆栈为16 kB,则sp从4000h开始,并在堆栈增长时朝0000h方向移动。

谢谢@Guffa,但是“堆栈指针指向为堆栈分配的空间顶部”是什么意思?在这种情况下,sp包含什么?在您给出的ss=200h的示例中,当推送数据时,sp如何改变,以使段从020000h变为02ffff h?@OUSSAMAGESOUM:当ss=0200h时,sp中的0000h到FFFFFFH的值可用于到达地址020000h到02FFFH,因为地址是ss*16+sp。如果ss为0200h,sp从4000h开始,则推送一个字节,sp更改为3fffh,字节结束于地址023fffh。好的,图像越来越清晰。非常感谢,如果sp包含0000h,我们尝试推送一个字节,或者sp包含FFFFFFH,我们尝试弹出一个字节,会发生什么情况?这是一个堆栈溢出吗??我从你身上学到了很多,谢谢你的帮助:)@Guffa SS=0200h的例子是错误的!堆栈从02000h到011FFHI读取,sp始终指向堆栈顶部,即最后一个按下的字节。在您的示例中,如果sp从4000h开始,我推送一个字节,则sp递减为3fffh,然后该字节写入ss:[3fffh]。但在我看来,用ss:[4000h]写是不可能的。即使sp从ffffh开始,也无法在ss:[ffffh]中写入任何内容。有什么想法吗?我找不到关于它的任何参考资料。