我总是阅读有关C编程语言中某些函数如何通过汇编编写来优化的内容.如果那句话听起来有些误导,请告诫我.
所以,我会清楚地说明:当你在UNIX/C系统上调用像strlen这样的函数时,你调用的实际函数是用汇编编写的?你能以某种方式将程序集编写到C程序中,还是外部调用情况?能够做到这一点是C标准的一部分,还是特定于操作系统的东西?
Dav*_*nan 34
C标准规定了每个库函数必须执行的操作,而不是它的实现方式.
几乎所有已知的C实现都被编译成机器语言.C编译器/库的实现者如何选择实现类似的函数strlen.他们可以选择在C中实现它并将其编译为对象,或者他们可以选择在汇编中将其编写并将其组装到对象中.或者他们可以通过其他方式实现它.只要你在打电话时得到正确的效果和结果,这没关系strlen.
现在,实际上,许多C工具集都允许您编写内联汇编,但这绝对不是标准的一部分.任何此类设施都必须作为C标准的扩展.
许多(大多数?)C编译器确实支持内联汇编,尽管它不是标准的一部分.也就是说,没有严格需要编译器来支持任何此类事情.
首先,要认识到程序集主要只是人类(半)可读的机器代码,而C最终仍然是机器代码.
"调用"C函数只是生成一组指令,根据某些已建立的调用约定准备寄存器,堆栈和/或其他一些与机器相关的机制,然后跳转到被调用函数的开头.
汇编代码块可以符合适当的调用约定,从而生成一小撮机器代码,最初用C编写的另一块机器代码能够调用.当然,反过来也是可能的.
调用约定,汇编过程和链接过程(将程序集生成的目标文件与C生成的目标文件链接)的细节可能在平台,编译器和链接器之间变化很大.您选择的平台的良好装配教程可能会涵盖这些细节.
我碰巧喜欢以x86为中心的PC Assembly Tutorial,它专门解决了接口组件和C代码的问题.
| 归档时间: |
|
| 查看次数: |
2468 次 |
| 最近记录: |