Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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+中使用内部汇编+;?_C++_Visual C++_64 Bit_Inline Assembly_Intrinsics - Fatal编程技术网

C++ 如何在C+中使用内部汇编+;?

C++ 如何在C+中使用内部汇编+;?,c++,visual-c++,64-bit,inline-assembly,intrinsics,C++,Visual C++,64 Bit,Inline Assembly,Intrinsics,我尝试在VS2005中将C++工具移植到X64。问题是,代码包含内联程序集,64位编译器不支持内联程序集。我的问题是,如果有更多的努力来用C++来编码它,或者使用内含函数。但在这种情况下,并非所有汇编函数都可用于x64,对吗?比方说,我有一个简单的程序 #include <stdio.h> void main() { int a = 5; int b = 3; int res = 0; _asm { mov eax,a

我尝试在VS2005中将C++工具移植到X64。问题是,代码包含内联程序集,64位编译器不支持内联程序集。我的问题是,如果有更多的努力来用C++来编码它,或者使用内含函数。但在这种情况下,并非所有汇编函数都可用于x64,对吗?比方说,我有一个简单的程序

#include <stdio.h>

void main()
{
   int a = 5;
   int b = 3;
   int res = 0;

    _asm
    {
       mov eax,a
       add eax,b
       mov res,eax
    }

    printf("%d + %d = %d\n", a, b, res);
}
main.cpp

#include <stdio.h>

extern "C" int AddInt(int a, int b);

void main()
{
    int a = 5;
    int b = 3;
    int res = AddInt(a,b);

    printf("%d + %d = %d\n", a, b, res);
}
#包括
外部“C”内部加法器(内部a、内部b);
void main()
{
INTA=5;
int b=3;
int res=加法(a,b);
printf(“%d+%d=%d\n”,a、b、res);
}

但是结果不正确
5+3=-1717986920
。我想,指针出了问题。哪里出错了?

VC中64位目标不支持内联汇编

关于非内联代码中的错误,乍一看代码似乎很好。我将从C++中查看生成的汇编代码,看看它是否匹配<代码> Addit< /Cudio>过程。 编辑:需要注意的两件事:

  • extern addInt:proc
    添加到asm代码中
  • 我不知道接受参数的过程的汇编语法。根据您的调用约定,参数通常通过堆栈指针(
    sp
    register)提取,请参阅此处的详细信息:

  • 这个例子是你问题的典型例子还是你问题的一个非常简单的例子?我会尽最大努力删除汇编程序并用C/C++替换它。对于几乎所有的例子来说,性能都是可比的(可能更好,因为现代C编译器比人类聪明得多)。在我的项目中,有很多组装部件,所以这是一个一般性的问题。本质不包括任何C编译器都能生成的普通指令。仅SSEx集合中的特殊说明。这段代码需要一个汇编器ml64.exe来链接汇编器生成的.obj文件。不,它将不再内联。@HansPassant将您的评论作为答案。在调试时,我发现两个变量都有相同的错误值,在设置为registerWell之前,可以使用关键字ecx和edx调用我的汇编函数的两个参数。一切都很好。有关更多信息,请参阅。谢谢你的帮助!
    #include <stdio.h>
    
    extern "C" int AddInt(int a, int b);
    
    void main()
    {
        int a = 5;
        int b = 3;
        int res = AddInt(a,b);
    
        printf("%d + %d = %d\n", a, b, res);
    }