2012-11-29 33 views
1

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

#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); 
} 

我该如何更改此代码使用intrinsics来运行它?我是汇编新手,不了解其大部分功能。

UPDATE:

我所做的更改编译组件,ml64.exe像汉斯建议。

; add.asm 

; ASM function called from C++ 

.code 
;--------------------------------------------- 
AddInt PROC, 
    a:DWORD, ; receives an integer 
    b:DWORD  ; receives an integer 
; Returns: sum of a and b, in EAX. 
;---------------------------------------------- 
    mov eax,a 
    add eax,b 
    ret 
AddInt ENDP 
END 

的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); 
} 

但结果是不正确的5 + 3 = -1717986920。我猜,指针有问题。我在哪里犯了一个错误?

+2

这是典型的例子您的问题或只是一个很简单的例子,你的问题吗?我会尽我所能删除汇编程序并用C/C++替换它。对于几乎所有的例子来说,性能都是可比的(可能现代C编译器比人类更聪明) – Elemental

+0

在我的项目中有很多组装部件,所以这是一个普遍的问题 – alex555

+0

Intrinsics不包括简单的说明,任何C编译器都可以生成的类型。只有SSEx中的特殊说明才会设置。您将需要此代码的汇编程序,ml64.exe –

回答

2

VC中的64位目标不支持行内汇编。

关于您的非内联代码中的错误,首先看代码似乎很好。我会查看从C++生成的汇编代码 - 以查看它是否与addInt过程匹配。

编辑:2件事情需要注意:

  1. 添加extern addInt :proc到您的汇编代码。
  2. 我不知道程序接受参数的程序集语法。该参数是通过堆栈指针根据您的调用约定(sp寄存器)正常提取,多看看这里:http://courses.engr.illinois.edu/ece390/books/labmanual/c-prog-mixing.html
+0

在调试时,我发现两个变量在设置为注册之前都有相同的错误值 – alex555

+0

尝试将'extern addInt:proc'添加到您的asm代码 – SomeWittyUsername

+0

那么,我的汇编程序函数的两个参数可以使用关键字ecx和edx来调用。一切都很好。有关更多信息,请参阅[链接](http://www.youtube.com/watch?v=0tpOEdxtRkA)。感谢您的帮助! – alex555