2010-12-30 23 views
2

アセンブリコードをコンパイルして実行するためにセットアップされたMSVC++プロジェクトがあります。 main.cのでAssemblyからprintfをどのように使用しますか?

:go.asmで

#include <stdio.h> 

void go() ; 

int main() 
{ 
    go() ; // call the asm routine 
} 

.586 
.model flat, c 
.code 

go PROC 
    invoke puts,"hi" 
    RET 
go ENDP 

end 

しかし、私はコンパイルして実行したとき、私はgo.asmでエラーが出る:

エラーをA2006:未定義シンボル:puts

012でシンボルを定義する方法プロジェクトの.asmファイル用の?

+0

。 –

答えて

1

ここに私のものがあります。

これは機能します。あなたは何とか自分のC標準ライブラリにリンクする必要があり

 
.586 
.model flat,c 

printf PROTO C :VARARG ; The secret sauce.. a prototype of printf 

.data 
msgHello1 BYTE "GREETINGS AND WELCOME TO EARTH!",0 

.code 

go PROC 
    push OFFSET msgHello1 
    call printf 
    add esp, 4 ; Stack cleaning 
    RET 
go ENDP 

end 
+0

ここでprintfの定義は何ですか? Cライブラリを使用している場合は、externとして定義する必要があります。私はクラッシュがコール・コンベンションと関係があると推測しています。 ollydbgを使ってデバッグする... –

0

私はこれがarticleと私ができるよりも優れていると思います。

大まかに言えば、アセンブラはgo.asmにシンボル(関数)を見つけることができません。あなたはそれにそれを伝える必要があります。

リンクされた記事は、mainルーチンの実行を含むアセンブリ言語を主言語として使用する観点から、混合コードアプリケーションを構築する方法に取り組んでいます。あなたはC基づいて、メインルーチンを使用している場合は、行われているものの多くは不要で、あなただけの必要なはずです。

は非ローカル 名の大文字と小文字を維持するために/ MX アセンブリモジュールを組み立て。 MASMバージョン6.0または を後で使用する場合は、/ Cxを使用して、 の非ローカル名の大文字小文字を保持します。

とは:

は、Cの命名を確保し、 規則が使用され、 モジュールが同じデフォルトのセグメントを使用することを呼び出す にアセンブリモジュール内のステートメントの.MODEL、Cを含めます。 小型、中型、 小型、または大型です。

およびEXTERNディレクティブは、呼び出す関数ごとにEXTERN printf:procの形式で指定します。

+0

実際には、これは動作しません。 – bobobobo

関連する問題