2011-06-23 13 views
1

I、2.09.08 NASM組み立ておよびWindows XP 32ビット上で正常に動作次のコードを持っている:プログラミング

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

section .data 

section .text 

;global [email protected] 
;[email protected]: 

;global _start 
_start: 
    mov ax,4   

    jmp $ 

はNASMに多くのチュートリアルによるASMファイルは、以下のを必要としますそれ:

global [email protected] 
[email protected]: 
... 

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

この

アセンブルするためのコマンドです:NASM -fエルフTEST.ASM
これはリンクのコマンドです:LD -o TEST.EXE test.o

答えて

2

異なるとWindows上のアプリケーションのいくつかの種類があります。エントリーポイントはどのタイプであるかによって異なります。 LINK.EXEオプションによって:

  • /SUBSYSTEM:CONSOLEは - mainmsvcrXX.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.exehereです。

_startシンボルであるwindowsは実際にあなたのコードを実行し始めます。通常、libcなどは実際に_startを処理して初期設定を行いますので、プログラムは実際にはかなり開始されません_mainlibcとリンクしたいのであれば、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を参照してください。

+0

link.exeを使用してプログラムをリンクしていません。私はldを使用しています。私は新しい出発点をテストしました:_startHerePlease:...これも組み立て、リンクして問題なく実行します。私が(C、C++または他のライブラリなしの)素骨アセンブリを使用している場合、私は私の開始シンボルを何でも作ることができますか? – TheFuzz

+0

いいえ私はそれをアセンブルするためにこのコマンドを使用しています:nasm -f elf test.asm。また、リンクコマンドを使用しています:ld -o test.exe test.o.それは私の窓の箱のためにうまく動作します – TheFuzz

+0

@TheFuzzはいできます、 'ld --entry = _startHerePlease'で。 –