2011-11-16 33 views
0

私はVisual C++ Express経由でMASMを使用してアセンブリを教える本を読んでいます。_mainは既にfile.objで定義されています

私はサンプルを使用していますすでにasm.objで定義されて_main:

本は、私は、エラーエラーLNK2005を取得

.386 
    .model flat, c 
    .stack 100h 
printf PROTO arg1:Ptr Byte, printlist:VARARG 
    .data 
msg1fmt byte "%s%d",0Ah,0 
msg1 byte "The answer is: ",0 
num1 sdword ? 
num2 sdword ? 
    .code 
main proc 
    mov num1,5 
    mov eax,num1 
    mov num2,eax 
    INVOKE printf, ADDR msg1fmt, ADDR msg1, num2 
    ret 
main endp 
    end 

を動作していることMASMをテストするには、以下のプログラム例を示しますアセンブリプログラムは私の本からはうまくいけば間違いではありません。私が得るエラーは、メインが2回リストされていることと関係があると思われますが、解決方法は不明です。

答えて

1

書籍のプログラミング例が誤っていることはまったく知られていません。

エラーは、リンカーであり、アセンブラではありません。です。アセンブラがあなたのファイルに満足していることが既にわかっているという事実は、実際にアセンブリファイルにはmainが1回しか定義されていません。

私はMS開発ツールに精通していません。特に過去10年半のものではありませんが、あなたのプロジェクトにCまたはC++モジュールを追加して、main()またはIDEがデフォルト定義を「有益に」提供していることを示します。リンカーが不快であるのは、この第2の定義mainです。

(リンカのエラーメッセージのシンボルのアンダースコアは、そのプラットフォームでの作業の成果物に過ぎません。すべてのHLLシンボルの先頭にアンダースコアが付きます。.model flat, cがあります。

プロジェクトのC-land部分のmain()の定義を探して、見つけたらプロジェクトから削除するか、プロジェクトから省略することができます。 C-landからことを呼び出して、あなたのアセンブリ関数はasm_main、たとえば、に名前を変更し、それに失敗し、:

int main() { 
    return asm_main(); 
} 

(これはちょうどあなたが軌道に乗ることです。あなたはargcらのホールドを取得したい場合より創造的なものにする必要があります。)

+0

これは本当に私のプロジェクトに含まれているデフォルトのC++ファイルでした。それを除いて私の問題を解決しました。 –

関連する問題