Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在线组装_C++_Assembly - Fatal编程技术网

C++ 在线组装

C++ 在线组装,c++,assembly,C++,Assembly,对于下面的代码,如果我想将For循环转换为内嵌程序集,将如何实现? (请原谅这个奇怪的密码,我只是编出来的。) 1) 这是针对x86的,使用visual studio 2) 这是一个“如何使用在线组装”的问题,而不是“如何优化此代码”的问题 3) 任何其他例子都可以。我将在abit中想出一些更好的示例代码 好的,我希望这是一个更好的例子: int doSomething(double a, double b, double c) { double d; for(int i=100

对于下面的代码,如果我想将For循环转换为内嵌程序集,将如何实现? (请原谅这个奇怪的密码,我只是编出来的。)

1) 这是针对x86的,使用visual studio

2) 这是一个“如何使用在线组装”的问题,而不是“如何优化此代码”的问题

3) 任何其他例子都可以。我将在abit中想出一些更好的示例代码

好的,我希望这是一个更好的例子:

int doSomething(double a, double b, double c)
{
    double d;
    for(int i=100;i<200;i++)
    {
        d = a*a + b*b + c*c;
        if(d>i)
            return (i-99);
    }
    return -1;
}
int剂量测量(双a、双b、双c)
{
双d;
对于(int i=100;ii)
返回(i-99);
}
返回-1;
}

您可以在不使用汇编程序的情况下对此进行优化:

double doSomething(void)
{
    double a = 1.0, b = 2.0, c = 3.0;
    c = a * a - b * b;
    b = c;
    return a + b + c;
}
或者,如果您提高了优化级别:

double doSomething(void)
{
    return -5.0;
}

完全依赖于编译器和体系结构。您需要在web上搜索编译器的内联asm信息,然后学习您的体系结构的asm操作代码(使用正确的asm方言,取决于编译器)。

它可能会从这样一个不完整且效率较低的示例开始。不过,应该演示语法

double doSomething(void) {
    double a=1,b=2,c=3;
    __asm {
        mov ecx,10
loop:
        fld a // a
        fmul st(0),st(0) // aa
        fld b // b aa
        fmul st(0),st(0) // bb aa
        fsubp // aa-bb
        fstp c // c = a*a-b*b

        // and so on

        dec ecx
        jnz loop
    }
    return a+b+c;
}
使用SSE指令将是另一种选择

此处记录了VC++内联汇编程序:


英特尔处理器参考手册在这里:

这里有一个和另一个。

没有真正的点学习内联汇编。x64(即Visual Studio)不支持它。无论您现在是否正在使用x64,在某一点上,您都将成为历史记录


更好地学习如何使用MASM,因为您在x86上学到的知识对x64仍然有用。

您最好的选择是让编译器打印函数的汇编语言。将此用作内联程序集的基线


通常,应该避免内联汇编,因为它是特定于平台的,尤其是特定于处理器的。更好的解决方案是将函数放入单独的文件中。创建C语言版本和汇编语言版本。在生成过程中,在不同文件之间进行选择。这将允许您为不同的平台和处理器提供不同的汇编语言版本,同时对程序的其余部分产生最小的副作用(这一点非常重要)。

您有什么好的理由这样做吗?一个好的编译器可能比noob汇编程序员做得更好。您的目标是什么CPU?还要注意,您的代码在循环中有一个冗余表达式-第二行是没有意义的,因为b立即被c替换。在试图优化代码之前,您可能需要修复代码。还有一件事——循环本身是冗余的,因为它内部的所有表达式都是循环不变的。你还没有真正想清楚,是吗?关于什么架构?什么编译器?有些在GCC中很容易做到的事情在其他编译器中会变得更加易变。你应该弄清楚你问这个问题是出于好奇,还是你真的认为需要使用汇编语言来完成类似的事情。为什么会投反对票?没有评论?这是对这个问题的一个非常有效的答案(正如最初提出的那样)。如果有人想学习如何计算小数点后5位的pi值,那么回答“3.14159”并没有多大帮助,除非他们在决定需要10位或100位小数点位时可以向您寻求新的答案。教一个人钓鱼…@Dinah:实际上这里有一个严重的问题,这一点经常被忽视,那就是在求助于诸如手工编码汇编程序之类的微观优化之前,你需要在高水平上进行优化(这应该是最后的手段)。此外,最初提出的问题缺乏细节和背景,因此不清楚提问者真正想做什么。我们中间那些喜欢扣动扳机的选民经常会忽略这些微妙的要点。我现在已经看过了原始帖子,但仍然不同意这是一个有用的答案。(为了记录在案,虽然不是我否决了你)@Dinah:好吧,让我们同意不同意见吧,我可能会很快删除这个答案,因为它不再适用于现在的问题。我最近在网上看到了很多“有什么意义”的争论。我赞成你提出一个更好的方法来做事情,以防OP没有意识到它们,但是关于“重点是什么”——谁在乎“重点”是什么?我甚至在开始编程时都没有想到“点”。我这样做是因为它既有趣又有趣。我的大多数爱好项目也没有“意义”,它们只是我想做的事情。我曾经创造了一种深奥的编程语言,但它做得很少。重点是什么?因为我想。虽然Visual Studio中64位不支持内联汇编,但汇编本身是。基本上,你在C++中声明函数,然后在ASM文件中定义ASM函数,并在构建应用程序时链接它们。虽然这不是“内联”的,但它只是做同样事情的另一种方式。它确实很重要——例如,当编写32位和64位版本的VST插件(或将32位VST插件转换为64位)时。这里有一个链接,可以查看这是如何工作的: