Assembly 递减堆栈指针会在堆栈上保留空间,这意味着什么?

Assembly 递减堆栈指针会在堆栈上保留空间,这意味着什么?,assembly,x86,x86-64,cpu-registers,stack-frame,Assembly,X86,X86 64,Cpu Registers,Stack Frame,“reserve”在本文中的确切含义是什么?递减堆栈指针如何在堆栈上保留空间?调整堆栈指针寄存器是否有副作用 “保留空间”听起来像内存分配,但堆栈的内存通常是固定的,预先分配的,所以我认为这不是它的意思 我认为这只是意味着我们告诉其他人不要使用我们的堆栈空间,其他人只是读取堆栈指针寄存器,按照惯例,他们知道它不应该破坏上面的任何内容。如果是这样的话,那是谁?后续函数调用?操作系统?仅仅是堆栈指针现在稍微低了一点,就保留了空间。递归调用的函数(希望如此)不会以这种方式写入保留的内存,从而尊重保留(

“reserve”在本文中的确切含义是什么?递减堆栈指针如何在堆栈上保留空间?调整堆栈指针寄存器是否有副作用

“保留空间”听起来像内存分配,但堆栈的内存通常是固定的,预先分配的,所以我认为这不是它的意思


我认为这只是意味着我们告诉其他人不要使用我们的堆栈空间,其他人只是读取堆栈指针寄存器,按照惯例,他们知道它不应该破坏上面的任何内容。如果是这样的话,那是谁?后续函数调用?操作系统?

仅仅是堆栈指针现在稍微低了一点,就保留了空间。递归调用的函数(希望如此)不会以这种方式写入保留的内存,从而尊重保留(没有任何东西真正阻止它们,但如果它们这样做,那么它们就被破坏了)

原则上,不以这种方式分配的堆栈空间可以写入,但由于它是一个免费的空间,通常不会这样做(特别是它可能不会,也可能不会在函数调用中生存,函数调用可以很容易地分配它并写入它,如果它不是红色区域的一部分,信号处理程序会使用这个空间),最大的例外是叶函数中x64(而不是Windows)上的红色区域


这是一种分配,它是在一个固定大小的缓冲区内分配的,但是所有的事情都是这样,最终你只能分配这么多内存。它只是更加有限。

你的第三段是对的。按照惯例,堆栈指针以下的任何内容(假设它变小)都是公平游戏。@SevaAlekseyev公平游戏供谁使用?功能?操作系统?还有其他人吗?如果你想充实你的答案,请发表一个答案。;)函数正在调用的函数。请注意,您的函数不应该像在输入时那样重击堆栈指针下面的任何内容。函数将调用的函数将遵循相同的约定。此外,还要学习中断处理程序。了解push和pop的确切功能,以及C函数的编译目的。那么就很清楚了。@SevaAlekseyev:在现代操作系统中,IRQ处理程序使用单独的内核堆栈(出于安全原因:用户进程的另一个线程可以修改内核函数使用的堆栈内存!!)。但是,信号处理程序可以随时异步使用堆栈指针下的空间。(在Linux/Mac(SysV)64位ABI中,
rsp下方有一个128B的“红色区域”,可以避免信号处理程序或任何东西的异步重击,因此不需要更多的叶函数可以避免调整堆栈指针,从而节省一些指令。)这一点很好。我应该指定动态内存分配。@Praxelitic很好,它也是动态的,在调用函数时在运行时完成,而不是在编译时固定。堆栈大小可能不会预先固定,操作系统可能会根据需要进行扩展。问题不在于函数调用。这是信号处理程序的异步碰撞,使得堆栈指针下方(或红色区域下方)的空间不安全,无法用于任何用途。甚至叶函数也需要保留它们使用的任何空间。(红色区域计为已保留。)还请注意,只有SysV ABI具有红色区域。64位的Windows ABI没有。@harold:对,我在评论中所说的并没有真正反映我的想法。不过,我认为,信号处理器可以随时异步地修改
rsp
下面的内存,这一点很重要。否则叶函数就不必保留内存。OP的最后一段是询问什么东西可以出现并使用堆栈指针下的内存,因此是的,答案是进一步的函数调用和“操作系统”(以信号处理程序的形式)。