【发布时间】:2011-09-04 15:17:12
【问题描述】:
我经常阅读有关 C 编程语言中的某些函数如何通过用汇编语言编写来优化的内容。如果这句话听起来有点误导,让我道歉。
那么,我会说清楚:当您在 UNIX/C 系统上调用 strlen 之类的函数时,您调用的实际函数是用汇编编写的,这是怎么回事?你能以某种方式将汇编直接写入 C 程序还是外部调用情况?能够做到这一点是 C 标准的一部分,还是操作系统特定的东西?
【问题讨论】:
-
您需要的最重要的信息之一是描述您的 C 编译器如何将参数和返回地址传递给子例程。这称为该机器或处理器的“调用约定”。例如,在 x86 上通常使用堆栈传递参数和返回地址。这仅适用于可变参数函数,如果参数以从右到左的顺序压入堆栈,然后返回地址被压入。如果您编写汇编语言函数以期望这种堆栈布局(“激活记录”),那么唯一重要的......
-
...另外的实现是您的 asm 函数,一旦组装和链接,就会在您的程序代码段中分配一个地址。因此,您的 C 代码可能会将处理器的执行转移到您的 asm 函数的这个地址。那时,只要您的函数使用寄存器做正确的事情(必须为调用者保留一些寄存器,例如 EBP),知道如何在堆栈上查找参数和返回地址,并将其结果返回到正确的位置( 32 位返回值在 x86 上的 EAX 中),那么没有什么会取消它。