C代码如何调用汇编代码(例如优化的strlen)?

Joh*_*0te 31 c unix assembly

我总是阅读有关C编程语言中某些函数如何通过汇编编写来优化的内容.如果那句话听起来有些误导,请告诫我.

所以,我会清楚地说明:当你在UNIX/C系统上调用像strlen这样的函数时,你调用的实际函数是用汇编编写的?你能以某种方式将程序集编写到C程序中,还是外部调用情况?能够做到这一点是C标准的一部分,还是特定于操作系统的东西?

Dav*_*nan 34

C标准规定了每个库函数必须执行的操作,而不是它的实现方式.

几乎所有已知的C实现都被编译成机器语言.C编译器/库的实现者如何选择实现类似的函数strlen.他们可以选择在C中实现它并将其编译为对象,或者他们可以选择在汇编中将其编写并将其组装到对象中.或者他们可以通过其他方式实现它.只要你在打电话时得到正确的效果和结果,这没关系strlen.

现在,实际上,许多C工具集都允许您编写内联汇编,但这绝对不是标准的一部分.任何此类设施都必须作为C标准的扩展.

  • 要注意:如果`strlen`之类的函数是用汇编而不是C编写的,那么通常是出于性能原因而写的. (2认同)

fvu*_*fvu 17

在道路的最后,汇编的程序和程序都是机器语言,因此它们可以相互调用.这样做的方法是让汇编代码使用与C编写的程序相同的调用约定(准备调用,准备参数等的方法).可以在此处找到x86处理器的常用调用约定的概述.

  • 对于x86 [Agner Fogs优化指南](http://www.agner.org/optimize/optimizing_assembly.pdf)也是一个有用的参考. (4认同)

Nic*_*ght 8

许多(大多数?)C编译器确实支持内联汇编,尽管它不是标准的一部分.也就是说,没有严格需要编译器来支持任何此类事情.

首先,要认识到程序集主要只是人类(半)可读的机器代码,而C最终仍然是机器代码.

"调用"C函数只是生成一组指令,根据某些已建立的调用约定准备寄存器,堆栈和/或其他一些与机器相关的机制,然后跳转到被调用函数的开头.

汇编代码块可以符合适当的调用约定,从而生成一小撮机器代码,最初用C编写的另一块机器代码能够调用.当然,反过来也是可能的.

调用约定,汇编过程和链接过程(将程序集生成的目标文件与C生成的目标文件链接)的细节可能在平台,编译器和链接器之间变化很大.您选择的平台的良好装配教程可能会涵盖这些细节.

我碰巧喜欢以x86为中心的PC Assembly Tutorial,它专门解决了接口组件和C代码的问题.