1

Windows XP 32ビット、2.09.08NASMで正常にアセンブルおよび実行される次のコードがあります。

; how to compile: nasm -f elf test.asm
; how to link: ld -o test.exe test.o

section .data

section .text

;global _WinMain@16
;_WinMain@16:

;global _start
_start:
    mov ax,4           

    jmp $

NASMの多くのチュートリアルによると、asmファイルには次のものが必要です。

global _WinMain@16
_WinMain@16:
...

ご覧のとおり、私のasmファイルにはそれが含まれていません。(コメントアウトされています。持っているのは_startだけです)。では、これらのチュートリアルのすべてで、アセンブリプログラムにグローバルな_WinMain @ 16がなくても機能する場合に、グローバルな_WinMain@16のものが必要であることに言及しているのは何でしょうか。

これはアセンブルするコマンドです:nasm -f elf test.asm
これはリンクするコマンドです:ld -o test.exe test.o

4

1 に答える 1

2

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して初期設定を行うため、プログラムは実際にはで開始されません_mainlibclibcライブラリと競合するシンボルがあるため、リンクしたい場合は問題が発生します。ただし、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バイトにアラインされています。理由については、この説明を参照してください。

于 2011-06-23T23:01:30.803 に答える