3

Microsoft Visual Studio Pro 2008 C ++は、純粋なアセンブリ言語プログラムを作成、アセンブル、およびリンクするための優れたIDEになります。Win32 API(コンソール入力および出力用)とリンクするasmプログラムを構築することはできますが、Cランタイムライブラリにリンクすることはできません。まあ、実際にはリンクは問題ありませんが、実行時にr6032エラーが発生します-ライブラリが正しく初期化/ロードされていませんエラー。Cライブラリ関数を呼び出すようにIDE(およびコード)を設定する方法を教えてもらえますか?以下は、printfを呼び出す例です。ちなみに、私はmsvcrt.libを使用しています。libcmt.libも試しました。

前もって感謝します。

        .586
        .model flat                             

        extern printf:near

        .data

msgTestClib db'Cライブラリからこんにちは。'、0

        .code

メインPROC

        push    ebp

        mov ebp, esp

        push offset msgTestClib

        call printf

        add esp, 4

        pop ebp

        ret

メインENDP

        END
4

1 に答える 1

4

わかりました、私は答えを見つけました。実際には 2 つのソリューションが存在します。しかし、まず、エラーの理由は、VS 2005 以降に変更が加えられ、アセンブリの組み立て方法が変更され、VS の基盤を扱う技術情報につながることです。ここでは「方法」がはるかに重要です。まずサンプルコードを載せますが、基本的にはどの方法を使っても同じコードです。

コード:

;sh3.asm - test using c run-time library functions

.586
.model flat

EXTRN   _printf:PROC

        .data

msgHello DB 'C ライブラリからこんにちは!', 0ah, 00h

.code

_main PROC

push OFFSET msgHello

call _printf

add esp, 4

ret 0

_main ENDP

END

さて、方法1:

  1. 空のプロジェクトから始めます。拡張子が .asm のソース ファイルを追加し、コードを入力します。コードのエントリ ポイントには _main という名前を付けてください。別の名前の使用に対処する方法 2。

  2. 次に、ソリューション エクスプローラーでプロジェクト名を右クリックし、カスタム ビルド規則を選択して、MASM を使用するためのプロジェクトを設定します。[Microsoft マクロ アセンブラー] ボックスをオンにします。

  3. 次に、プロジェクト -> プロパティ -> リンカー -> 追加の依存関係に移動し、C ランタイム ライブラリ名を入力します。たとえば、リリース コードの場合は msvcrt.lib、デバッグ フェーズの場合は msvcrtd.lib です。重要な注意: エントリ ポイントまたはサブシステムのエントリを作成しないでください。

  4. コードを組み立てて実行します。

方法 2:

  1. 空のプロジェクトから始めます。拡張子が .asm のソース ファイルを追加し、コードを入力します。選択したラベルを使用して、コードのエントリ ポイントに名前を付けます。たとえば、開始します。

  2. 次に、ソリューション エクスプローラーでプロジェクト名を右クリックし、カスタム ビルド規則を選択して、MASM を使用するためのプロジェクトを設定します。[Microsoft マクロ アセンブラー] ボックスをオンにします。

  3. 次に、プロジェクト -> プロパティ -> リンカー -> 追加の依存関係に移動し、C ランタイム ライブラリ名を入力します。たとえば、リリース コードの場合は msvcrt.lib、デバッグ フェーズの場合は msvcrtd.lib です。

  4. 次に、リンカ ページでシステムを選択し、コンソールに変更してから、高度なページに移動し、エントリ ポイント ボックスにエントリ ラベルを入力します (たとえば、start など)。

  5. 次に、リンカー ページでマニフェスト ファイルを選択し、追加のマニフェストの依存関係を選択して、次のように入力します。 1fc8b3b9a1e18e3b' はすべて 1 行です。

  6. コードをアセンブルして実行します。

この情報は VS と Windows のバージョンに依存している可能性が高いため、追加の依存関係に関する情報がどこにあるのか疑問に思われるかもしれません。方法 1 を使用して簡単なプロジェクトを作成し、そのマニフェスト ファイルを見つけてテキスト エディターで読み取ります。情報を含む依存関係の行が表示されます。

個人的には、方法 1 が最も簡単な方法だと思います。エントリ ポイントに _main という名前を付けざるを得なくなったことは、C ランタイム ライブラリ コードを柔軟に使用できることに対して支払う代償としては非常に小さいものです。また、サブシステムを設定する必要がないという利点もあります。ここで、特記事項として、C ランタイム ライブラリを使用していない場合は、方法 2 を使用し、マニフェストの依存関係を追加する手順を省略します。それは必要ありません!

ちなみに、Win32 API と C ランタイム ライブラリへの呼び出しを使用して方法 1 もテストしましたが、コードは正常に動作しました。つまり、Windows API 呼び出しと C ランタイム ライブラリ呼び出しの両方を同じコードで使用できます。

この情報が、Visual Studio を使用して Windows でアセンブリ コードを記述するのに役立つことを願っています。頑張って楽しんでね!

〜江石

于 2012-04-18T14:38:19.493 に答える