2012-09-25 14 views
5

Ich verwende nasm, um die folgende Baugruppe zu kompilieren. Der Code stürzt jedoch in der Konsole unter Windows ab.Hallo Welt mit Nasm in Windows-Assembly

C: \> nasm -f win32 test.asm -o test.o

C: \> 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 

Nach dies post. Die Funktion main ist unter Windows nicht verfügbar und muss durch WinMain ersetzt werden.

Mein Arbeitsbeispiel:

section .text  
global [email protected]  

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

Bitte bearbeiten Sie den Titel, so dass es für zukünftige Besucher nützlich sein wird. Sonst kann es als zu lokalisiert geschlossen werden. –

+0

@ RaymondChen zu was? – fuzz

Antwort

21

Die größten

Also, wenn Ihr Einstiegspunkt _start oder main ist, sollte es die ret am Ende des Verfahrens ret 16 geändert [email protected] und ändern wird Problem ist, dass Sie versuchen, Linux interupts auf Windows zu verwenden! Int 80 wird nicht auf Windows arbeiten.

Wir verwenden Assembly, damit Ihr Einstiegspunkt ein beliebiges Label sein kann. Der Standardeintrag Punkt, der ld sucht, ist _start, wenn Sie ein anderes Etikett verwenden möchten, müssen Sie ld sagen, mit der Option -e Also, wenn Sie Ihr Startlabel Haupt sein wollen, dann

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

Wenn Sie NASM unter Windows verwenden, empfehle ich die Verwendung von GoLink als Linker. Hier ist eine einfache Windows-Konsole App:

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 

Make-Datei:

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

Genau das, was ich gesucht habe, danke. – fuzz

+0

@Gunner danke. Eine Frage: Warum empfehlen Sie GoLink gegenüber anderen Linkern? –

+0

@ Boris Persönliche Präferenz, denke ich. Es hat sich als einfacher herausgestellt, mit anderen Linkern unter Windows zu arbeiten. – Gunner

5

Obwohl dieses gleiche Programm wird wahrscheinlich in WINE auf Linux wie ein Zauber auszuführen. :)

WINE verhindert nicht die Verwendung von Linux-Systemaufrufen aus Windows PE-Binärdateien; Die Maschinenanweisungen werden nativ ausgeführt und WINE stellt nur DLL-Funktionen bereit.

+0

Gut zu wissen, danke. – fuzz

+4

@JayBlanchard Dies ist eine Antwort, weil es auf das Betriebssystem zeigt, wo das Programm ordnungsgemäß funktioniert, ohne in der Frage Absturz erwähnt. – johnfound

+0

Oh, du meinst auf einem Linux-Rechner, wo die Systemaufrufe nativ laufen und WINE nichts damit zu tun hat.Ich dachte zuerst, dass du meintest, dass WINE in beide Richtungen ging und dass es die Linux 'int 0x80' ABI auf einer Windows-Maschine emulieren könnte! –