我正在编写一个性能关键、数字运算的C++项目,其中70%的时间用于200行核心模块。我想使用内联汇编优化核心,但我对此完全陌生。不过,我知道一些x86汇编语言,包括GCC和NASM使用的语言。我所知道的:我必须将汇编程序指令放在_asm{}我希望它们所在的位置。问题:我不知道从哪里开始。当我的内联汇编发挥作用时,哪个寄存器中有什么? 最佳答案 您可以通过名称访问变量并将它们复制到寄存器中。这是来自MSDN的示例:intpower2(intnum,intpower){__asm{moveax,num;Getfirstargumentm
我正在尝试使用gcc编译器在Code::Blocks中编译一个旧的C++软件项目,在修复了一些其他问题后,我遇到了困难:该项目有一个文件,其中包含Intel风格的内联ASM作为_asm{codehere}并且编译器拒绝编译它并显示“错误:‘_asm’未在此范围内声明”。我花了一段时间在谷歌上搜索解决方案,但我唯一能找到的是将-masm=intel添加到构建选项(我已经尝试过但不能开始工作),或者将代码转换为asm("codehere");(这是不可行的,因为ASM的数量巨大)。有谁知道如何让gcc按原样编译这段代码,还是我应该放弃并使用不同的编译器? 最佳答
这两个代码片段做同样的事情:将两个float组相加并将结果存储回其中。内联汇编器:voidvecAdd_SSE(float*v1,float*v2){_asm{movesi,v1movedi,v2movupsxmm0,[esi]movupsxmm1,[edi]addpsxmm0,xmm1movups[esi],xmm0movups[edi],xmm0}}纯C++代码:voidvecAdd_Std(float*v1,float*v2){v1[0]=v1[0]+v2[0];v1[1]=v1[1]+v2[1];v1[2]=v1[2]+v2[2];v1[3]=v1[3]+v2[3];v2[0]
所以,我有这个代码:constexprunsignedN=1000;voidf1(char*sum,char*a,char*b){for(inti=0;i我想看看GCC4.7.2会生成的代码。所以我跑了g++-march=native-O3-masm=intel-Sa.c++-std=c++11并得到以下输出:.file"a.c++".intel_syntaxnoprefix.text.p2align4,,15.globl_Z2f1PcS_S_.type_Z2f1PcS_S_,@function_Z2f1PcS_S_:.LFB0:.cfi_startproclearcx,[rdx+16