这是否意味着基本指针或堆栈指针实际上是在向下移动内存地址而不是向上移动?这是为什么?
是的,这些push
指令会递减堆栈指针并写入堆栈,pop
反之则从堆栈中读取并递增堆栈指针。
这在某种程度上是历史性的,因为对于内存有限的机器,堆栈放置在较高的位置并向下生长,而堆放置在较低的位置并向上生长。堆与栈之间只有一个“空闲内存”缺口,并且这个缺口是共享的,任何一个缺口都可以根据需要单独增长。因此,仅当堆栈与堆冲突时程序才会用完内存,而不会留下可用内存。
如果堆栈和堆都沿相同的方向增长,则存在两个间隙,并且堆栈不能真正进入堆的间隙(反之亦然,这也是有问题的)。
最初,处理器没有专用的堆栈处理指令。但是,随着堆栈支持被添加到硬件中,它采用了这种向下增长的模式,而今天的处理器仍然遵循这种模式。
有人可能会争辩说,在64位计算机上,有足够的地址空间来允许多个间隙-并且作为一个证据,当一个进程具有多个线程时,多个间隙必然是这种情况。尽管这不足以改变周围环境,但由于存在多个缺口系统,因此增长方向可以任意决定,因此传统/兼容性会扩大规模。
你不得不改变,以改变堆栈的方向,否则放弃使用专用的推动和弹出指令(例如CPU的协议栈处理的指令push
,pop
,call
,ret
,其他)。
请注意,MIPS指令集体系结构没有专用的push
&pop
,因此在任一方向上增加堆栈都是可行的-您可能仍希望单线程进程使用一个间隙的内存布局,但可以向上和向上增大堆栈向下。但是,如果执行此操作,则可能需要对某些C varargs代码进行源代码或底层参数传递中的调整。
(实际上,由于MIPS上没有专门的堆栈处理程序,我们可以使用pre或post增量或pre或post递减值推入堆栈,只要我们使用完全相反的方式弹出堆栈,并且还假设操作系统尊重所选的堆栈使用模型。实际上,在某些嵌入式系统和某些教育系统中,MIPS堆栈是向上增长的。)
-4(%rbp)
它根本不会移动基本指针,并且+4(%rbp)
可能无法工作。