您应该在调用C标准库函数之前备份寄存器吗?

时间:2012-06-04 18:08:03

标签: c assembly x86 standard-library

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

3 个答案:

答案 0 :(得分:3)

我认为只是呼叫惯例适用于此处。 http://en.wikipedia.org/wiki/X86_calling_conventions

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

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

您将找到函数正在使用的调用约定,形成函数的声明/签名。默认值应为cdecl。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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