2016-05-24 20 views
3

Ich bin in Assemblersprache mit NASM ein Hallo Welt Programm mache auf 32-Bit-Windows 7 . Mein Code ist:erstellen mit NASM eine exe-Datei in der Montage auf 32-Bit-Windows-

section .text 
global main ;must be declared for linker (ld) 
main: ;tells linker entry point 
    mov edx,len ;message length 
    mov ecx,msg ;message to write 
    mov ebx,1 ;file descriptor (stdout) 
    mov eax,4 ;system call number (sys_write) 
    int 0x80 ;call kernel 
    mov eax,1 ;system call number (sys_exit) 
    int 0x80 ;call kernel 

section .data 
    msg db 'Hello, world!', 0xa ;our dear string 
    len equ $ - msg ;length of our dear string 

ich dieses Programm speichern als hello.asm. Als nächstes habe ich hello.o mit:

ld -s -o hello hello.o 

Aber jetzt werde diesen Fehler I:

nasm -f elf hello.asm 

Nun Ich versuche, die exe ​​ Datei mit diesem Befehl erstellen

ld is not recognized as an internal or external command, operable program or batch

Warum bekomme ich diesen Fehler, und wie kann ich es beheben?

+0

_LD_ ist ein Teil des _NASM_ nicht erwähnt hat. Wenn Sie _LD_ verwenden möchten, können Sie eine GNU-Werkzeugkette herunterladen, die binutils enthält (_LD_ ist Teil von Binutils). Das TDM-GCC-Produkt (Open Source) hat ein Installationsprogramm mit einer kompletten GCC/Binutils-Werkzeugkette: https://sourceforge.net/projects/tdm-gcc/ –

+0

Ich möchte eine EXE-Datei mit nasm in Windows 32bit –

+0

erstellen Befehl muss ich verwenden. –

Antwort

2

Das OP gab einen Code, den er von einem Tutorial bekommen hatte, und er assemblierte es mit NASM. Als er die Ausgabe in eine ausführbare Datei von Windows einbinden wollte, konnte er sie nicht zum Laufen bringen.

@Michael Petch bemerkte, dass die Tutorial-Quelle für Linux entwickelt wurde - der angegebene Code konnte nie für Windows funktionieren. Er fuhr fort zu erwähnen, dass der Linker nicht von NASM zur Verfügung gestellt wird: das OP benötigt, um es von Microsoft zu bekommen.

3

Downloaden und installieren Sie Mingw. Dann setze nasm in den Mingw bin-Ordner. Erstellen Sie einen Ordner im Ordner "Hallo". In diesem Ordner erstellen eine Datei mit dem Namen main.asm mit dem folgenden Code:

extern _printf 
global _main 

section .data 
msg: db "Hello, world!",10,0 

section .text 
_main: 
    push msg 
    call _printf 
    add esp,4 
    ret 

öffnen Sie das Terminal aus dem Innern des Ordners und kompilieren, erstes, Code-Objekt mit nasm:

D:\MinGW\bin\Hello> ..\nasm -fwin32 main.asm 

Zweitens rufen gcc Link:

D:\MinGW\bin\Hello> ..\gcc main.obj -o main.exe 

Schließlich testen:

D:\MinGW\bin\Hello> main.exe 
Hello, world! 
1

Es ist eine alte Frage, aber ich frage mich, warum niemand die Lösung mit der Standard-Windows-link /subsystem:console /entry:_main main.obj

+1

Es scheint eine schlechte Idee zu sein, den Prozesseintrittspunkt 'main' zu nennen: normalerweise markiert dieses Symbol eine Funktion, die vom CRT-Startcode aufgerufen wird. Ich würde "_start" oder etwas empfehlen, wie es Linux standardmäßig verwendet, es sei denn, Ihre Befehlszeile verbindet sich im CRT-Code. –

+1

Wie auch immer, ja das ist eine gute Antwort auf die Titelfrage; Die Suchergebnisse der Leute könnten sie hier bringen, wenn sie asm-Quellcode haben, der unter Windows arbeitet, im Gegensatz zur Verwendung des 32-Bit Linux 'int 0x80' ABI durch den OP (der nicht unter Windows verfügbar ist, nicht über Cygwin und nicht einmal über) das Linux-auf-Windows-Subsystem, es ist pure x86-64 ohne IA32 compat ABI.) –

+0

Ja ist es, der Name 'main' ist nur ein Beispiel. Ich werde es trotzdem bearbeiten. – 0x3h