在c中,变量是否总是在超出范围之前从寄存器推送到堆栈?

时间:2012-06-11 00:56:22

标签: c assembly callstack cpu-registers

在函数A调用函数B之后,B中的代码是否可以删除所有寄存器(除了那些包含堆栈指针和B参数的寄存器)而不影响A的本地变量?因此,在函数B返回函数A之后,函数A是否将所有本地函数弹回堆栈(推断函数B执行时寄存器状态可能已更改)?

全局变量怎么样?函数B是否需要担心影响全局变量状态的任何寄存器操作?

(我问这个问题的主要原因是,我想通过使用mprotect使数组可执行,然后将数组指针转换为函数指针和调用来尝试在运行时将机器代码注入函数B通过上述问题,我希望弄清楚B的游乐场的范围是什么。)

2 个答案:

答案 0 :(得分:4)

这是calling convention,它是体系结构,操作系统和编译器相关的。

编辑0:

另外一个链接:application binary interface。深入了解您的特定硬件/ OS /编译器组合。您将找到哪些寄存器用于参数/返回值,这些寄存器是为特定事物保留的,并且对于 clobber 的任何给定函数都是免费的。

答案 1 :(得分:1)

这取决于他们如何处理调用其他功能的功能。在分支到另一个函数之前将所有局部变量存储在堆栈中是正常的,但是如果你知道其他函数只使用特定的两个寄存器,并且你在任何地方都避免使用它们,那么你就不需要存储在分支到该函数之前,堆栈上的任何东西(当然除了分支回地址之外)。

它实际上只是一个低级实现设计决策(通常由编译器决定),因此您可能会发现某些函数会信任B当前在寄存器中的内容,而其他函数则不会。