我经常读到有关C编程语言中某些函数通过用汇编语言编写来进行优化的内容。如果这句话听起来有点误导人,那么我表示歉意。
因此,我将明确表达:当您在UNIX / C系统上调用一些函数(如strlen)时,实际调用的函数是用汇编语言编写的吗?您是否可以将汇编语言直接写入C程序中,还是需要进行外部调用?这是否是C标准的一部分,还是特定于操作系统?
我经常读到有关C编程语言中某些函数通过用汇编语言编写来进行优化的内容。如果这句话听起来有点误导人,那么我表示歉意。
因此,我将明确表达:当您在UNIX / C系统上调用一些函数(如strlen)时,实际调用的函数是用汇编语言编写的吗?您是否可以将汇编语言直接写入C程序中,还是需要进行外部调用?这是否是C标准的一部分,还是特定于操作系统?
C标准规定每个库函数必须做什么而不是如何实现。
几乎所有已知的C实现都被编译成机器语言。对于C编译器/库的实现者来说,他们可以选择如何实现strlen
等函数。他们可以选择用C实现并将其编译为对象,或者他们可以选择用汇编语言编写并将其汇编为对象。或者他们可以以其他方式实现它。只要在调用strlen
时得到正确的效果和结果就可以了。
现在,许多C工具集确实允许你编写内联汇编,但这绝对不是标准的一部分。任何此类设施都必须作为C标准的扩展包括进去。
strlen
这样的函数是用汇编语言而不是 C 语言编写的,通常是出于性能考虑。 - user142019在最终编译的程序和汇编程序中,它们都是机器语言,因此它们可以互相调用。实现这一点的方式是通过汇编代码使用与C语言编写的程序相同的调用约定(准备调用、准备参数等方式)。有关x86处理器流行的调用约定的概述可以在这里找到。
当C代码通过gcc编译时,首先被编译成汇编指令,然后再编译成二进制的可执行文件。您可以通过指定-S
来查看生成的汇编指令,如:gcc file.c -S
。
汇编代码只是经过C到汇编编译的第一阶段,然后与从C编译的代码无法区分。
你可以在C代码中编写内联汇编。这种语法高度依赖于编译器,但通常使用asm
关键字。请查阅有关内联汇编的更多信息。