2016-07-06 19 views
0

nasmalinkの組み合わせでkernel32.libとuser32.libをリンクするにはどうすればよいですか?私は、アセンブリプログラミング上のいくつかのチュートリアルを以下だし、ガイドは、私は、以下のコマンドを実行したい`nasm`と` alink`の組み合わせを使ってkernel32.libとuser32.libをリンクするには?

:予想通り

nasm -fobj hello.asm          
alink -oPE hello \lib\kernel32.lib \lib\user32.lib 

最初のコマンドが実行される、しかし、2番目のコマンドは失敗します。 .libファイルをリンクし

、私は私の現在のフォルダに

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib 

からそれらをコピーしました。

2番目のコマンドを実行するときに私が取得エラーメッセージは次のとおりです。

1)てKernel32.libとuser32.libを配置されています。

Loading file hello.obj 
Loading file Kernel32.lib 
2327 symbols 
Loaded first linker member 
Loading file User32.lib 
1385 symbols 
Loaded first linker member 
matched Externs 
matched ComDefs 
Unresolved external MessageBoxA 
Unresolved external ExitProcess 

、私は2つの質問をしましたか?

2)これらのライブラリファイルを正しくリンクするにはどうすればよいですか?

オペレーティングシステムはWindows 10(64ビット)です。

更新:

; Coded for NASM           ; 
; nasm -fobj hello.asm         ; 
; alink -oPE hello \lib\kernel32.lib \lib\user32.lib  ; 
                  ; 
extern MessageBoxA    ; APIs used    ; 
extern ExitProcess    ; in this file    ; 
                  ; 
[SECTION CODE USE32 CLASS=CODE] ; code section    ; 
..start:      ; for the linker   ; 
                  ; 
    push byte 0     ; only the buttons 'OK' ; 
    push dword caption   ; caption of the BOX  ; 
    push dword text    ; text in the BOX   ; 
    push byte 0     ; handle of the Box  ; 
     call MessageBoxA   ; print BOX on screen  ; 
                  ; 
    push byte 0     ;       ; 
     call ExitProcess   ; EXIT      ; 
                  ; 
    caption db "Your first WIN32 programm",0    ; 
    text db "HELLO",0          ; 
                  ; 
end        ; for the linker 
+1

正しいフォルダからLIBファイルを取得していますが、本当に別の場所にコピーしないでください。リンカーにパスを渡すだけでそれを見つけることができます。そうでなければ、私はあなたの問題は、ALINKが64ビットの実行可能ファイルの生成をサポートしていないことを推測します。 32ビットオブジェクトコードを生成するか、別のリンカーを使用する必要があります。 –

+0

32ビットまたは64ビットのコードをコンパイル/リンクしますか? MessageBoxAとExitProcessをasmファイルで宣言する方法は? – RbMm

+0

私の意図は、32ビットコードをコンパイル/リンクすることです。私は上記の完全なサンプルを追加しました。 – Shuzheng

答えて

1

私の避難所は」ALINKで使用することができますkernel.libまたはuser.libを見つけました。これは、必要な.objファイルの形式が原因である可能性があります。ほとんどのWindows .objは、COFFでフォーマットされていますが、ALINKはOMFでフィードされたいと考えています。

A適切なWIN32.LIBhereです。それにはMessageBoxAが含まれますが、ExitProcessは含まれません。純粋なWindowsプログラムを単純な0​​で終了することはお勧めしません。

しかし、NASMは同様でない場合は、より良い仕事をすることができます。

; Import the needed Win32 API functions.- http://www.nasm.us/doc/nasmdoc7.html#section-7.4.4 
IMPORT ExitProcess kernel32.dll 
IMPORT MessageBoxA user32.dll 

; Still needed to be declared as external 
EXTERN ExitProcess, MessageBoxA 

[SECTION CODE USE32 CLASS=CODE] ; code section 
..start: 
    push 0     ; only the buttons 'OK' 
    push dword caption  ; caption of the BOX 
    push dword text   ; text in the BOX 
    push 0     ; handle of the Box 
    call [MessageBoxA]  ; print BOX on screen 

    push 0 
    call [ExitProcess] 

    caption db "Your first WIN32 programm",0 
    text db "HELLO",0 

呼び出されたときの機能は、ブラケットが飾られていますのでご注意ください。さらに、別のDATAセクションに変数を配置する方がよいでしょう。

大量のプロジェクトを予定している場合は、.DLLの束からIMPORTの束を1つ探して、NASMX Projectを見てください。

+0

OSDevによると、ALINKはPECOFF objsをサポートするはずですが、私の推測では、ALINKは最近Microsoftで使用されている新しい短いインポートレコード形式をサポートしていないと思います。 'kernel32.lib'と' user32。MinGW、より具体的にはw32apiの「lib」は、古いインポートレコード形式を使用する必要があります。 –

関連する問題