gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:42:47 25 4
gpt4 key购买 nike

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

最佳答案

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

还有 vector 扩展。

在编译器内在函数出现之前尤其如此。这些在一定程度上减轻了对内联汇编的需求。


内联汇编的另一个用例与将 C 语言与反射(reflect)语言连接起来有关。具体来说,如果您需要在编译时不知道其原型(prototype)的情况下调用函数,则汇编几乎是必需的。换句话说,当该函数参数的数量和数据类型只是运行时变量时。 C 可变参数函数和 stdarg 机制在这种情况下不会帮助您 - 它们会帮助您解析一个堆栈框架,但不能构建一个.另一方面,在汇编中,这是完全可行的。

这不是操作系统/驱动程序场景。至少有两种技术——Java 的 JNI 和 COM 自动化——这是必须的。在自动化的情况下,我谈论的是 COM 运行时使用其类型库编码双重接口(interface)的方式。

可以为此想到一个非常粗糙的 C 替代程序集,但它会很丑陋。在带有模板的 C++ 中稍微不那么难看。


另一个用例:崩溃/运行时错误报告。对于事后调试,您希望在崩溃时尽可能多地捕获程序状态(即所有 CPU 寄存器),而汇编是比 C 更好的工具。崩溃 native 代码的事后调试通常涉及无论如何都盯着 assembly 。


又一个用例 - 代码旨在在另一个进程中执行,而无需该进程的合作或知识。这通常被称为“shellcode”,但它不一定与 shell 相关。像这样的代码需要非常小心地编写,并且它不能依赖通常被认为是理所当然的高级语言(如运行时库或具有数据部分)的便利。当一个人在向目标进程中注入(inject)重要功能后,他们通常会加载一个动态库,但加载库并将控制权传递给它的初始蹦床代码往往是在汇编中。


我只介绍了需要组装的情况。其他答案涵盖了手动优化性能。

关于c - 在 C 程序中使用汇编语言的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14132095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com