2

在函数 A 调用函数 B 之后,B 中的代码是否可以丢弃所有寄存器(除了那些保存堆栈指针和 B 参数的寄存器)而不影响 A 本地的变量?因此,在函数 B 返回到函数 A 之后,函数 A 是否将其所有局部变量从堆栈中弹出(原因是在函数 B 执行时寄存器状态可能已更改)?

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

(我问这个的主要原因是,我想尝试在运行时将机器代码作为函数B注入,方法是使用mprotect使数组可执行,然后将数组指针转换为函数指针并调用它。我希望有上述问题找出 B 的游乐场的范围。)

4

2 回答 2

4

这是calling convention,它取决于架构、操作系统和编译器。

编辑0:

再给你一个链接:application binary interface。深入了解您的特定硬件/操作系统/编译器组合。您会发现哪些寄存器用于参数/返回值,它们是为特定事物保留的,并且对于任何给定的clobber函数都是免费的。

于 2012-06-11T01:08:39.737 回答
1

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

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

于 2012-06-11T01:01:13.227 回答