C和汇编它如何运作?

时间:2016-10-02 03:34:03

标签: c assembly

我想知道混合C和汇编是如何可能的,因为编译器以不同的方式生成代码,例如,许多C编译器将使用寄存器而不是在进行函数调用时推送到堆栈。这些函数然后将这些寄存器移入适当的内存位置,因为这样,如果您编写汇编代码或链接到由不同的编译器创建的目标文件,该编译器将调用C函数,而是将参数推送到堆栈而不是设置寄存器。

我的猜测是C编译器程序集输出以一种巧妙的方式完成它,它没有起作用,它仍然可以工作,但我不能确定它看到的汇编代码是什么&看起来它会起作用。

任何人都可以回答我的问题,因为我正在编写编译器并且需要知道这一点,所以如果我想在将来与C模块建立链接,我就不会犯任何错误。

1 个答案:

答案 0 :(得分:1)

用于调用函数的约定是所谓的“应用程序二进制接口”(ABI)的一部分。如果此接口是指定的,那么遵循规范的所有代码都可以链接在一起。

C没有标准的ABI。但是,大多数流行的平台都有一个主流的C编译器可以有效地生成事实上的标准ABI(例如,一个用于Windows,一个用于Linux on x86(32和64位),一个适用于Linux上的Linux等)。 ABI可以指定大量单独的“调用约定”,并且您的C编译器通常允许您使用某个供应商扩展在函数声明时指定所需的约定。

相反,如果您的C编译器或现有的目标代码没有记录的ABI,那么您通常无法成功链接(或以其他方式与其交互)。