1

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

組み込み関数を使用してこのコードを実行するには、どのように変更する必要がありますか? 私はアセンブラが初めてで、その機能のほとんどを知りません。

アップデート:

Hansが提案したように、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。ポインターに何か問題があると思います。どこで間違いをしましたか?

4

1 に答える 1

2

インラインアセンブリは、VCの64ビットターゲットではサポートされていません。

非インラインコードのエラーに関しては、一見するとコードは問題ないようです。C ++から生成されたアセンブリコードを調べて、addIntプロシージャと一致するかどうかを確認します。

編集:注意すべき2つのこと:

  1. extern addInt :procasmコードに追加します。
  2. パラメータを受け入れるプロシージャのアセンブリ構文を知りません。spパラメータは通常、呼び出し規約に従ってスタックポインタ(レジスタ)を介して抽出されます。詳細については、http: //courses.engr.illinois.edu/ece390/books/labmanual/c-prog-mixing.htmlを参照してください。
于 2012-11-30T10:09:07.723 に答える