[NASM 2.10] assemblierte Programme (*.com, *.exe) lassen sich nicht ausführen

T

Tersus

Gast
Guten Morgen,
den aktuellen Netwide Assembler geladen, habe ich mich an die Arbeit gemacht, eine in einem Tutorial zu findende "Hello World"-Quelldatei zu assemblieren.


Quelltext für die *.com
Code:
org		100h

start:

mov		dx,		hello
mov		ah,		09h
int		21h
mov		al,		0
mov		ah,		4Ch
int		21h

section		.data

hello: db 'hello world', 13, 10, '$'

Parallel dazu der Quelltext für die *.exe
Code:
segment  code

start:

mov  ax,  data
mov  ds,  ax
mov  dx,  hello
mov  ah,  09h
int  21h
mov  al,  0
mov  ah,  4Ch
int  21h

segment  data

hello:  db  'Hello  World!',  13,  10,  '$'

Die erhaltene *.com, bzw. per Linker erhaltene *.exe lässt sich nicht ausführen!

Ich verwende Windows 7.
 
Ich kenne mich mit Assembler jetzt kaum aus, deswegen...

Wie führst du die Datei aus? Gut möglich dass sie direkt wieder zu geht nachdem "hello world" ausgegeben wurde. Starte sie mal aus der Kommandozeile.


Edit: Fix nasm 2.10 geladen und die *.com erstellt. Funktioniert wunderprächtig. o.O
 
Zuletzt bearbeitet:
Hi,

ich befürchte die Instruktion "int 21h" ist z.B. noch ein Relikt aus alten Zeiten. Das ist im Wesentlichen ein "call-to-DOS" und ich bezweifle, dass das in Windows 7 noch funktioniert. Für NASM und Windows 7 gibt es recht wenige Tutorials - für Assembler, Windows (7) und x64 überhaupt.
Das PDF hier könnte aber vielleicht etwas hilfreich in den verschiedenen Welten sein:
http://www.agner.org/optimize/calling_conventions.pdf
Sofern es nur um das Experimentieren mit dem Assembler geht, könnte ich dir wohl bei Linux mehr helfen.
 
Vradash schrieb:
Ich kenne mich mit Assembler jetzt kaum aus, deswegen...

Wie führst du die Datei aus? Gut möglich dass sie direkt wieder zu geht nachdem "hello world" ausgegeben wurde. Starte sie mal aus der Kommandozeile.

Ich starte die *.com schon aus der Kommandozeile. Ich erhalte die Ausgabe: "Cannot execute \Pfad\*.com"


Vradash schrieb:
Edit: Fix nasm 2.10 geladen und die *.com erstellt. Funktioniert wunderprächtig. o.O

Das ist doch nicht zu fassen, warum geht das bei mir nicht?!

Mit welchem Befehl hast Du die *.com assembliert? Per nasm hello.com -f bin -o hello.com?


EDIT:

Ich habe die Lösung gerade gefunden!

Wenn nur einer der Verzeichnisnamen hin zur *.com oder *.exe länger als 8 Zeichen ist, dann kann die entsprechende Datei nicht ausgeführt werden!

Sachen gibts ... :rolleyes:


Gruß
 
Zuletzt bearbeitet von einem Moderator:
Na, das ist doch gut. :) Also, dass du die Lösung gefunden hast, nicht das mit den 8 Zeichen. *g* Wohl noch so ein Relikt aus den frühen FAT-Zeiten.

Übrigens: Den Code für die exe konnte ich nicht kompilieren, sagt, data wäre nicht definiert. :)
 
Vradash schrieb:
Übrigens: Den Code für die exe konnte ich nicht kompilieren, sagt, data wäre nicht definiert. :)

Man spricht hier nicht von Kompilierung, sondern von Assemblierung. ;) Um den Quelltext für die *.exe zu assemblieren, brauchst Du einen Linker. Hier werden nämlich die Segmente vom Programmierer selbst verwaltet und nicht, wie bei der *.com vom Programm.
 
Zurück
Oben