0
  • 在汇编中,您应该在调用 C 标准库函数之前备份寄存器吗?
  • 标准库是否保证其所有函数都备份调用者的寄存器并最终恢复它们?
  • 我在哪里可以找到有关此问题的官方信息?
4

3 回答 3

3

我认为这里只适用调用约定。http://en.wikipedia.org/wiki/X86_calling_conventions

C 标准库不保证它的函数为调用者备份寄存器。这取决于调用约定以及编译器如何处理它。

假设 C 函数对寄存器一无所知。

你会发现一个函数正在使用哪个调用约定,形成函数的声明/签名。默认应该是 cdecl。

于 2012-06-04T18:12:12.163 回答
2

它是特定于平台的,通常您不需要在调用站点专门保存和恢复寄存器,被调用者通常会这样做。您只需要遵循特定平台的链接约定。C 库不是无状态的,通常在不初始化库的情况下调用一些函数通常不是一个好主意,因为它是在包含 main() 的典型 c 程序对象中完成的。

于 2012-06-04T18:27:36.713 回答
2

这是一个特定于平台的问题,而不仅仅是一个特定于硬件的问题。C 标准库设计为从 C 程序调用,其中调用约定(通常)在编译时处理,并为您完成适当的寄存器和堆栈操作。

请查阅适用于您平台的特定于平台的 ABI 指南,以确定如何调用外部链接函数。

于 2012-06-04T18:15:33.300 回答