怎么在c中写⼊汇编语⾔,在CC中使⽤汇编语⾔
只有在恢复汇编语⾔时才有⽤
> CPU指令在C中没有功能等同(例如单指令多数据指令,BCD或⼗进制算术运算) 要么
储物柜电子锁
>由于⼀些莫名的原因 – 优化器未能使⽤最好的CPU指令…和…解剖小白鼠
cd架
>使⽤那些CPU指令将给瓶颈代码提供⼀些显着和有⽤的性能提升。 简单地使⽤内联汇编来做⼀个操作,可以很容易地⽤C表⽰ – 例如添加两个值或在字符串中搜索 – 积极适得其反,因为:
>以验证这⼀点,查看其汇编输出(例如gcc -S)或反汇编机器代码
>您⼈为地限制其关于寄存器分配,CPU指令等的选择,因此可能需要更长时间来准备具有执⾏硬编码指令所需的值的CPU寄存器,然后更长的时间以获得对未来指令的最佳分配 >编译器优化器可以在指定不同寄存器的等效性能指令之间进⾏选择以最⼩化它们之间的复制,并且可以以这样的⽅式选择寄存器,使得单个核可以在⼀个周期期间处理多个指令,⽽通过特定寄存器强制性地串⾏化
>在公平性上,GCC有办法表达对特定类型的寄存器的需求,⽽不会将CPU限制为精确的寄存器,仍然允许这种优化,但它是我见过的唯⼀的内联汇编
飞轮壳>智能平衡代步车>如果明年新的CPU模型出现的另⼀个指令⽐那个相同的逻辑操作快1000%,那么编译器供应商更有可能更新他们的编译器来使⽤该指令,因此你的程序重新编译后受益,是(或谁维护软件然后是)
>编译器将为⽬标体系结构选择⼀个最佳⽅法,它告诉我们:如果你硬编码⼀个解决⽅案,那么它将需要是⼀个最低的共同分母或#ifdef-ed 为你的平台
吹管系数>汇编语⾔不像C那样具有可移植性,不管是跨CPU还是跨编译器,即使你似乎移植了⼀个指令,也有可能犯错,重新注册是安全的clobber,参数传递约定等。
>其他程序员可能不知道或不熟悉程序集
我认为值得记住的⼀个观点是,当C被介绍了,它必须赢得了许多核⼼的汇编语⾔程序员,谁搞砸了机器代码⽣成。机器有较少的CPU能⼒和RAM,然后,你可以打赌⼈们对最⼩的事情。优化器变得⾮常复杂,并且不断改进,⽽像x86这样的处理器的汇编语⾔变得越来越复杂,因为它们的执⾏管线,缓存和其他涉及其性能的因素。您不能只是从循环每个指令的表中添加值。编译器编写者花费时间考虑所有这些微妙的因素(特别是那些为CPU制造商⼯作,但也增加了对其他编译器的压⼒)。对于汇编程序员来说,对于任何⾮平凡的应⽤程序来说,平均代码效率要好于优化的编译器,这是不切实际的,⽽且它们可能会更糟。因此,组装的使⽤应该限于其真正产⽣可测量和有⽤的差异的时间,值得耦合和维护成本。