代码之家  ›  专栏  ›  技术社区  ›  user366312

用C/C++混合汇编程序代码

  •  6
  • user366312  · 技术社区  · 15 年前

    为什么汇编语言代码经常和C/C++一起使用?

    什么是不能在C/C++中完成的,当汇编语言代码混在一起时是可能的?

    我有一些3D电脑游戏的源代码。有很多汇编程序代码在使用中。

    8 回复  |  直到 14 年前
        1
  •  2
  •   rwong    15 年前

    为什么汇编语言代码经常出现 需要与C/C++?

    竞争优势。比如,如果你正在为世界上(即将成为)第一游戏公司编写软件。

    什么是不能在C/C++中完成的,这是 汇编语言代码时可能 是混合的吗?

    没有,除非需要某种绝对性能级别,例如,每秒X帧或每秒Y数十亿个多边形。

    编辑:根据其他回复,似乎一致认为嵌入式系统(iPhone、Android等)有硬件加速器,当然需要使用汇编。

    我有一些3D的源代码 电脑游戏。有很多 汇编程序代码正在使用中。

    它们要么写在80年代到90年代,要么在游戏引擎中少量使用(可能占源代码总数的1%-5%)。

    编辑:到目前为止,编译器的自动矢量化质量仍然很差。因此,您可能会看到包含向量化内部函数的程序,而且由于它与在实际汇编中编写没有太大的区别(大多数内部函数都有一个到汇编指令的映射),一些人可能只是决定在汇编中编写。

    更新:

    据传闻,过山车大亨写在99%的汇编。
    http://www.chrissawyergames.com/faq3.htm

        2
  •  14
  •   RBerteig Keith Adler    15 年前

    不按特定顺序出现在脑海中的事物:

    • 特别说明。在嵌入式应用程序中,在DMA传输填满内存缓冲区后,我需要使缓存失效。在SH-4CPU上实现这一点的唯一方法是执行一条特殊的指令,所以内联汇编(或独立的汇编函数)是唯一的方法。

    • 优化。从前,编译器常常不知道 每一个 这是可能做到的。在某些情况下,用手工制作的版本替换内部循环是值得的。对于小型嵌入式系统中的CPU类型(比如8051、PIC等),将内部循环推到组件中是很有价值的。我将强调,对于具有管道、多问题执行、广泛缓存等功能的现代处理器,手工编码甚至难以接近优化器的功能。

    • 中断处理。在嵌入式应用程序中,通常需要捕获系统事件,如中断和异常。通常情况下,由中断执行的前几条指令具有特殊的职责,并且确保正确发生的唯一方法是在程序集中编写处理程序的外层。例如,在coldfire(或68000的任何后代)上,只有第一条指令才能保证执行。为了防止嵌套中断,该指令必须修改中断优先级以屏蔽当前中断的优先级。

    • 操作系统内核的某些部分。例如,任务切换要求为当前任务和为新任务加载的状态保存执行状态(至少大多数寄存器包括PC和堆栈指针)。调停CPU的执行状态很好地超出了语言的特征集,但是可以以少量的汇编代码包起来,以允许内核的其余部分用C或C++编写。

    编辑: 我已经润色了有关优化的措辞。我要强调的是,对于具有大量用户和良好支持的编译器的目标(具有适当的优化),程序集编码器不太可能超过优化器的性能。

    在尝试之前,先仔细分析以确定瓶颈的真正位置。掌握了这些信息后,仔细检查假设和算法,因为对所有问题的最佳优化通常是找到更好的方法来处理更大的问题。然后,如果所有其他方法都失败了,那么隔离测试用例中的瓶颈,仔细地对其进行基准测试,并开始在组装中进行调整。

        3
  •  3
  •   Michael Petrotta user3140870    15 年前

    在过去,编译器在针对特定体系结构进行优化方面非常差劲,而体系结构则更简单。现在情况正好相反。如今,对于一个深度流水线、分支预测处理器来说,要编写比优化编译器更好的程序集是相当困难的。所以你不会看到太多。有什么短,有什么高的针对性。

    简而言之,你可能不需要这样做。如果您认为您这样做了,请分析您的代码以确保 hotspot -如果你只花了0.1%的执行时间,不要仅仅因为某个东西的速度慢而优化它。看看你是否能改进你的设计或算法。如果您在那里没有发现任何改进,或者如果您需要高级语言没有公开的功能,请查看手工编码组件。

        4
  •  3
  •   doron    15 年前

    有些东西只能在汇编程序中完成,不能在C/C++中完成。

    这些包括:

    1. 生成软件中断(swi或int指令)
    2. 使用诸如swp之类的指令创建互斥体
    3. 专门的coporcessor指令(例如对mmu进行编程和管理RAM缓存所需的指令)
    4. 访问进位和溢出标志。

    在汇编程序中,你也可以比C/C++更好地优化代码(例如Android上的MMECPY是用汇编语言编写的)。

        5
  •  2
  •   James    15 年前

    您的编译器可能还无法生成新的指令,或者编译器执行了错误的工作,或者您可能需要直接控制CPU。

        6
  •  1
  •   nos    15 年前

    为什么汇编语言代码经常出现 需要与C/C++?需要与C/C++?

    它不是

    什么是不能在C/C++中完成的,这是 汇编语言代码时可能 是混合的吗?

    访问CPU上的系统寄存器或IO端口。 访问BIOS功能。 使用不直接映射到编程语言的专用指令, 例如 SIMD 指令。 提供比编译器生成的代码更好的优化代码。

    你通常不需要的前两点,除非你在写操作系统或代码 在没有操作系统的情况下运行。

    现代的CPU非常复杂,要找到真正能够编写程序集的人,比编译器所生产的要困难得多。许多编译器都有库,可以让您访问 到更高级的功能,如simd指令,所以现在你通常不需要回到 为此集合。

        7
  •  1
  •   Chris Becke    15 年前

    还有一件事值得一提:

    • 当需要用脚本语言实现二进制级互操作时,C&AMC++不提供任何方便的方法来设置堆栈帧,或者实现对闭包的某种支持。
        8
  •  -1
  •   Sundar    15 年前

    程序集可以比任何编译器在某些情况下都能生成的程序集都是非常理想的。

    推荐文章