Windowsには、アプリケーションの種類に応じてエントリポイントが異なるいくつかの種類のアプリケーションがあります。link.exeオプションによる:
/SUBSYSTEM:CONSOLE-が必要mainで、とリンクしていmsvcrXX.dllます。これらのアプリケーションはコンソールウィンドウで実行されます。cmd.exeのインスタンスを実行していない場合は、インスタンスが開かれます。
/SUBSYSTEM:WINDOWS-WinMain出発点です。ここを参照してください。通常、Cでは、これら#include <windows.h>とはに直接リンクされていkernel32.dllます。これらのGUIアプリは、ほぼ確実にリンクされてuser32.dllおり、おそらくadvapi32.dll同様にリンクされています。
/SUBSYSTEM:NATIVE-ここには2種類のアプリケーションがあります。ドライバーとアプリケーション。ネイティブNTアプリは、Windowsの起動時に実行NtProcessSStartupされ、エントリポイントとして必要です。ネイティブアプリケーションにはlibcはありません。ドライバーもまた違います。
によってサポートされているWindowsサブシステムの完全なリストは、こちらからlink.exe入手できます。
_startシンボルウィンドウは実際にでコードの実行を開始します。通常、libcまたはなどが実際に処理_startして初期設定を行うため、プログラムは実際にはで開始されません_main。libclibcライブラリと競合するシンボルがあるため、リンクしたい場合は問題が発生します。ただし、CまたはC ++標準ライブラリの一部である関数を呼び出す予定がない場合は、を使用しても問題ありません_start。
私がちょうどこれに気づいたyikesを編集してください:
; how to compile: nasm -f elf test.asm
; how to link: ld -o test.exe test.o
私はあなたがそれを使用していないと思います-f elf。ELF(executable and linkable format)は、実行可能ファイル用のLinux形式です。Windowsには、Portable Executable(PE)イメージが必要です。nasmオプションは-f win32、またはdosの場合nasm -f coffです。
確認のために2を編集し、コードをアセンブルして再度アセンブルしました。私もmingwを使いました。とにかく、私は得ました:
SECTION .text align=16 execute ; section number 1, code
Entry_point:; Function begin
; Note: Length-changing prefix causes delay on Intel processors
mov ax, 4 ; 00401000 _ 66: B8, 0004
?_001: jmp ?_001 ; 00401004 _ EB, FE
; Entry_point End of function
; Note: Length-changing prefix causes delay on Intel processors
mov ax, 4 ; 00401006 _ 66: B8, 0004
?_002: jmp ?_002 ; 0040100A _ EB, FE
ヘッダーの残りの部分は、エントリポイントが指定されていない有効なPE形式の実行可能ファイルのようです。したがって、コードは、最初に開始するアセンブリコードに「フォールスルー」しているだけだと思います。特に複数のオブジェクトをリンクする場合は、何が起こるかわからないため、この動作についてはお勧めしません。使用してください-entry。
elfオブジェクトファイルを逆アセンブルすると、次のようになります。
SECTION .data align=4 noexecute ; section number 1, data
SECTION .text align=16 execute ; section number 2, code
_start_here:; Local function
; Note: Length-changing prefix causes delay on Intel processors
mov ax, 4 ; 0000 _ 66: B8, 0004
?_001: jmp ?_001 ; 0004 _ EB, FE
_another_symbol:; Local function
; Note: Length-changing prefix causes delay on Intel processors
mov ax, 4 ; 0006 _ 66: B8, 0004
?_002: jmp ?_002
つまり、特定のELF形式のヘッダーは含まれていません。私はあなたがこれで幸運になっていると信じています。インポートを開始するか、他のコードモジュールとのリンクを試みると、事態はさらに複雑になり始めます。
Windows / mingwの場合、次のようにします。
nasm -f win32 file.asm
アセンブルするファイルごとに。必要に応じて代用win32してwin64ください。ldリンクには問題ありません。
ただの考え-私はその@16部分を説明したことはありません。関数はWindowsでは16バイトにアラインされていますが、ご覧のとおり、データは4バイトにアラインされています。理由については、この説明を参照してください。