2012-09-25 4 views
5

私はnasmを使用して、次のアセンブリをコンパイルしています。しかし、Windowsではコンソールのコードがクラッシュします。こんにちは、Windowsアセンブリでnasmを使用している世界

C:\>のnasm -fのWin32 TEST.ASM test.o

C -o:\>のld test.o -o TEST.EXE

section .data 
    msg db 'Hello world!', 0AH 
    len equ $-msg 

section .text 
    global [email protected] 

[email protected]: 
    mov edx, len 
    mov ecx, msg 
    mov ebx, 1 
    mov eax, 4 
    int 80h 

    mov ebx, 0 
    mov eax, 1 
    int 80h 

によると、このpostmain機能はWindowsでは使用できません。したがって、WinMainに置き換える必要があります。

あなたのエントリポイントが_startmainであれば、それは[email protected]に変更し、ret 16への手順の最後にretを変更する必要があります。

私の作業例:

section .text  
global [email protected]  

[email protected]:  
mov eax, 0  
ret 16 
+3

将来の訪問者に役立つようにタイトルを編集してください。さもなければ、ローカライズされすぎる可能性があります。 –

+0

@ RaymondChenに何を? – fuzz

答えて

21

最大問題は、あなたがWindows上でLinuxの相互作用を使用しようとしていることです! int 80はウィンドウでは機能しません。

私たちはAssemblyを使用しているので、あなたのエントリーポイントはあなたが望む任意のラベルにすることができます。 ldが探し標準のエントリポイントを使用すると、別のラベルを使用したい場合、あなたはあなたの開始ラベルをメインにしたいのであれば、あなたが必要とする -eオプションでLDを伝える必要があり、_startである

global main 
ld -e main test.o -o test.exe 

WindowsでNASMを使用する場合は、リンカーとしてGoLinkの使用をお勧めします。

STD_OUTPUT_HANDLE equ -11 
NULL    equ 0 

global GobleyGook 
extern ExitProcess, GetStdHandle, WriteConsoleA 

section .data 
msg     db "Hello World!", 13, 10, 0 
msg.len    equ $ - msg 

section .bss 
dummy    resd 1 

section .text 
GobleyGook: 
    push STD_OUTPUT_HANDLE 
    call GetStdHandle 

    push NULL 
    push dummy 
    push msg.len 
    push msg 
    push eax 
    call WriteConsoleA 

    push NULL 
    call ExitProcess 

メイク:ものの

hello: hello.obj 
    GoLink.exe /console /entry GobleyGook hello.obj kernel32.dll 

hello.obj: hello.asm 
    nasm -f win32 hello.asm -o hello.obj 
+0

私が何をしたか正確に、ありがとう。 – fuzz

+0

@Gunnerありがとうございます。 1つの質問 - 他のリンカーよりもGoLinkを推奨する理由は何ですか? –

+0

@Boris個人的な好みだと思います。 Windows上の他のリンカーよりも操作が簡単です。 – Gunner

5

、おそらく魅力のようにLinux上WINEで実行されます。この同じプログラム は、ここで簡単なWindowsコンソールアプリです。 :)

ワインは、Windows PEバイナリの中からLinuxシステムコールを使用することを妨げません。マシン命令はネイティブで実行され、WINEはDLL機能のみを提供します。

+0

お分かりいただきありがとうございます。 – fuzz

+4

@JayBlanchardこれは答えです。なぜなら、プログラムが正常に動作するOSを、質問のクラッシュに言及せずに指しているからです。 – johnfound

+0

ああ、Linuxマシンでは、システムコールがネイティブに実行され、WINEはそれらと関係がありません。最初はWINEが双方向に行き渡ったことを意味し、Windowsマシン上でLinuxの 'int 0x80' ABIをエミュレートできると思ったのです! –

関連する問題