在C程序中使用汇编语言的目的是什么?

san*_*086 11 c assembly inline-assembly

在C程序中使用汇编语言的目的是什么?编译器已经能够生成汇编语言.在什么情况下编写汇编比C更好?性能是否考虑?

Sev*_*yev 14

除了大家所说的:并非所有CPU功能都暴露给C.有时,特别是在驱动程序和操作系统编程中,需要明确使用特殊寄存器和/或其他方式不可用的命令.

矢量扩展.

在编译器内在函数出现之前尤其如此.这些在某种程度上减轻了对内联组装的需求.

内联汇编的另一个用例与C与反射语言的接口有关.具体来说,如果您需要在编译时不知道其原型时调用函数,则必须进行汇编.换句话说,当该函数的参数的数量和数据类型是运行时变量时.stdarg在这种情况下,C变量函数和机器将无法帮助您 - 它们可以帮助您解析堆栈帧,但不能构建堆栈帧.另一方面,在装配中,这是非常可行的.

这不是操作系统/驱动程序方案.至少有两种技术--JNI和COM自动化 - 这是必须的.在自动化的情况下,我在谈论COM运行时使用类型库封送双接口的方式.

可以想到一个非常粗略的C替代装配,但它会像罪一样难看.无论如何,调用约定会妨碍你.

我一直只涉及需要组装的案例.其他答案涵盖了手工优化性能.

编辑:只是想到了另一个用例:崩溃/运行时错误报告.对于事后调试,您希望尽可能多地捕获崩溃点的程序状态(即所有CPU寄存器),并且汇编是比C更好的工具.


Jon*_*ood 6

有一些(尽管不是很多)可以使手工优化的汇编语言比C源代码的C编译器生成的汇编语言更有效地运行.此外,对于习惯于汇编语言的开发人员来说,在汇编程序中编写一些东西似乎更容易.

对于这些情况,许多C编译器允许内联汇编.

然而,随着C编译器变得越来越好并生成高效代码,这种情况变得越来越少,并且大多数平台对某些低级软件设置了限制,这些软件通常是用汇编程序编写的最有益的软件类型.


Ken*_*Kin 3

用 C 编写内联程序集的原因有多种。我们可以简单地将原因分为必要的不必要的

由于不必要的原因,可能是:

  • 平台兼容性
  • 表现有关
  • 代码优化
  • ETC。

我认为上述内容是不必要的,因为有时它们可​​以被丢弃或通过纯 C 实现。例如,平台兼容性,您完全可以为每个平台实现特定版本,但是,使用内联程序集可能会减少工作量。这里我们不过多谈论不必要的原因。

出于必要的原因,它们可能是:

  • 标准库的某些功能不足以做到这一点
  • 编译器不支持某些指令集
  • 目标代码生成不正确
  • 编写堆栈敏感代码
  • ETC。

这些理由被认为是必要的,因为它们几乎不可能用纯C语言完成。例如,在旧的DOSes 中,软件中断INT21不可重入的。如果你想写一个完全使用编译器支持的Virtual Dirve ,那是不可能做到的。INT21在这种情况下,您需要挂钩原始的INT21,并使其可重入。但是,编译后的代码会用 prolog/epilog 包装您的每个调用。因此,你永远无法破坏某些限制,或者你只是使代码崩溃。您可以通过使用带有库的纯 C 语言来尝试任何技巧;但即使你能成功找到一个技巧,这也意味着你找到了编译器生成机器代码的特定顺序;这意味着:您试图让编译器将您的代码编译为准确的机器代码。那么,为什么不直接编写内联程序集呢?

这个例子解释了除了 之外的所有必要原因instruction set not supported,但我认为这很容易思考。事实上,编写内联程序集还有更多理由,但现在您对它们有了一些想法,等等。