Assembler unter Windows

Hi,ich krieg es nicht mal hin,ein einfaches "Hallo Welt" Programm in Assembler geschrieben unter Windows sauber laufen zu lassen.
Der Code sieht so aus (Compiler Nasm)

Code:
mov ax, cs ; Wert des Codesegmentregisters in Register ax übertragen
mov ds, ax ; Datensegment auf Wert von ax setzen

mov ah,0x09
mov dx,String
int 0x21

mov ah,0x4c
int 0x21

String db "Hallo Welt",0,"$"
Wenn ich die Exe ausführe steht zwar unten Hallo Welt aber davor die ganze Zeit "Befehl oder Dateiname nicht gefunden".

Liegt das an Windows XP oder an Nasm???
 
Ich würde empfehlen mit com-Dateien (altes ausführbares Dateiformat von MS-DOS) anzufangen, da du dich sowieso schon an DOS-Interrupts versuchst. Dieses Format ist einfacher im Aufbau als exe und imho leichter zu verstehen (lassen sich auch noch auf 32-Bit Windows ausführen, auf 64-Bit Versionen brauchst du DOSBox o.Ä.).

Dazu, dass dein Code com-gerecht wird, fehlt ein "org 0x100" am Anfang, das den Code an den Einsprungspunkt 0x100 von com-Dateien ausrichtet. Assemblieren tust du es dann so "nasm datei.asm -o datei.com".

Soweit ich weiß ist für com-Dateien sowieso cs = ds = es, weswegen dann deine ersten zwei Zeilen unnötig sind (mov ax, cs ; mov ds, ax). Segmentregister sind anfangs sowieso nicht leicht zu verstehen.

Übrigens: nasm (= Netwide Assembler) ist ein Assembler, kein Compiler.
 
Du kannst es mit der libc tun (also die Befehle, die du unter C benutzt, in Assembler verwenden).
Das geht z.B. so: Folgender Assemblercode
Code:
extern _printf
extern _exit

section .text

global _main
_main:	
	push text
	call _printf
	add esp,4
	push 0
	call _exit

section .data
	
	text: db "Hallo Welt!",13,10,0

muss mit nasm assembliert werden -> "nasm -f elf hallo.asm"
Dann holst du dir die msvcr71.dll (z.B. aus C:\Windows\system32) und linkst mit einem Linker (z.B. ld) die Objektdatei, die nasm generiert hat, gegen die DLL. Dann bekommst du eine exe-Datei, die dir "Hallo Welt!" ausgibt und sich dann beendet.
 
ok,könntest du mir bitte noch sagen wie ich die dll in den Linker Befehl einbaue? Ich habe LINK.exe von Microsoft.
 
Wie das mit link von Microsoft geht, weiß ich nicht genau. Aber wahrscheinlich ähnlich wie mit ld:
Code:
ld hallo.o msvcr71.dll

btw: ich weiß gar nicht, ob link das ELF-Dateiformat kennt. Eventuell musst du also (wenn du unbedingt link verwenden willst) bei nasm nicht "-f elf" sondern "-f win32" angeben. Ich benutze aber immer ELF, deswegen kann ich dir nichts genaues dazu sagen.
 
Zurück
Oben