異なるとWindows上のアプリケーションのいくつかの種類があります。エントリーポイントはどのタイプであるかによって異なります。 LINK.EXEオプションによって:
/SUBSYSTEM:CONSOLE
は - main
とmsvcrXX.dll
との連携が必要です。これらのアプリケーションはコンソールウィンドウで実行されます。 cmd.exeのインスタンスを実行していない場合は、そのインスタンスが開かれます。
/SUBSYSTEM:WINDOWS
-WinMain
が出発点です。 hereを参照してください。通常Cでは、これらは#include <windows.h>
であり、直接kernel32.dll
にリンクされています。これらのGUIアプリケーションはuser32.dll
とおそらくはadvapi32.dll
とリンクされています。
/SUBSYSTEM:NATIVE
- ここには2種類のアプリケーションがあります。ドライバとアプリケーション。 Windows NT起動時にネイティブのNTアプリケーションが起動し、エントリポイントとしてNtProcessSStartup
が必要です。ネイティブアプリケーションにはlibcはありません。運転手はまた違う。
サポートされているウィンドウサブシステムの一覧は、link.exe
hereです。
_start
シンボルであるwindowsは実際にあなたのコードを実行し始めます。通常、libc
などは実際に_start
を処理して初期設定を行いますので、プログラムは実際にはかなり開始されません_main
。 libc
とリンクしたいのであれば、libcライブラリと矛盾するシンボルがあるので、問題があります。しかし、CまたはC++の標準ライブラリの一部である関数を呼び出すつもりがない場合は、_start
を使用しても問題ありません。私はあなたが-f elf
1を使用していないと仮定し
; how to compile: nasm -f elf test.asm
; how to link: ld -o test.exe test.o
:私はちょうどこれを気づいた
編集む〜。 ELF(実行可能でリンク可能な形式)は、実行形式のためのLinux形式です。 WindowsにはPortable Executable(PE)イメージが必要です。 nasmオプションは-f win32
、またはnasm -f coff
です。
を編集するだけで、コードを組み立てて再分解しました。私も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
。必要に応じてwin64
の代わりにwin32
を置き換えてください。 ld
はリンクに問題ありません。
ちょっと考えました - 私は@16
の部分を説明しませんでした。関数はWindowsでは16バイトに整列されていますが、見ての通り、データは4バイトで整列しています。理由はthis explanationを参照してください。
link.exeを使用してプログラムをリンクしていません。私はldを使用しています。私は新しい出発点をテストしました:_startHerePlease:...これも組み立て、リンクして問題なく実行します。私が(C、C++または他のライブラリなしの)素骨アセンブリを使用している場合、私は私の開始シンボルを何でも作ることができますか? – TheFuzz
いいえ私はそれをアセンブルするためにこのコマンドを使用しています:nasm -f elf test.asm。また、リンクコマンドを使用しています:ld -o test.exe test.o.それは私の窓の箱のためにうまく動作します – TheFuzz
@TheFuzzはいできます、 'ld --entry = _startHerePlease'で。 –