【发布时间】:2015-11-10 16:48:34
【问题描述】:
在这种情况下,“保留”究竟是什么意思?递减堆栈指针如何保留堆栈上的空间?调整堆栈指针寄存器有副作用吗?
“保留空间”听起来像内存分配,但堆栈的内存通常是固定的并预先分配,所以我不认为这就是它的意思。
我认为这只是意味着我们告诉其他人不要使用我们的堆栈空间,而其他人只是读取堆栈指针寄存器并且按照惯例知道它不应该破坏任何高于此的内容。如果是这样,那另一个人又是谁?后续函数调用?操作系统?
【问题讨论】:
-
你的第三段是对的。按照惯例,任何低于堆栈指针(假设它向下增长)都是公平的游戏。
-
@SevaAlekseyev 公平游戏适合谁使用?职能?操作系统?还有谁?如果您想充实您的答案评论,请继续发布答案。 ;)
-
您的函数正在调用的函数。请注意,您的函数不应该像进入时那样破坏堆栈指针下方的任何内容。您的函数将调用的函数将遵循相同的约定。此外,中断处理程序。
-
了解 push 和 pop 的确切作用 stackoverflow.com/a/33583134/895245 以及 C 函数编译成的内容。然后就清楚了。
-
@SevaAlekseyev:在现代操作系统中,IRQ 处理程序使用单独的内核堆栈(出于安全原因:用户进程的另一个线程可以修改内核函数正在使用的堆栈内存!!)。但是,signal 处理程序可以随时异步使用堆栈指针下方的空间。 (在 Linux/Mac (SysV) 64 位 ABI 中,
rsp下面有一个 128B 的“红色区域”,可以防止信号处理程序或其他任何东西的异步破坏,因此不需要更多的叶子函数可以避免不得不调整堆栈指针,节省几条指令。)
标签: assembly x86 x86-64 cpu-registers stack-frame