2012-11-29 35 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