Programm per Interrupt starten (assembler) [solved]

Hallo,
ich probiere gerade ein Programm aus Assembler heraus zu starten. Mit der Windows-API ist das zwar viel einfacher, aber ich würde es trotzdem gerne per Interrupt machen, ich weiß nur nicht so ganz wie...

Gefunden habe ich den Int 21 mit ah = 4b
Die Anwendung ist mir jedoch an manchen Stellen schleierhaft, speziell was es mit dem Parameterblock auf sich hat.

Code:
lea edi, Parameterblock
mov [edi], 0
mov [edi+2h], offset Kommandozeile
mov [edi+6h], ???   ;pointer to first FCB to be copied into child's PSP
mov [edi+Ah], ???   ;pointer to second FCB to be copied into child's PSP
mov [edi+Eh], ???   ;(AL=01h) will hold subprogram's initial SS:SP on return
mov [edi+12h], ??? ;(AL=01h) will hold entry point (CS:IP) on return
lea dx, prgName
lea bx, Parameterblock
mov cx, 04h
mov ah, 4Bh
xor al, al ;Programm laden und ausführen
int 21h

1. Was sind FCB und PSP?
2. Muss ich [edi+Ah] und [edi+12h] überhaupt beschreiben, wenn al = 0 ist?
 
Sogar noch ein bischen mühseliger, ich befinde mich unter Windows.
Da fällt mir ein: klappt es dann überhaupt noch mit Interrupts?
 
Jep, denn Windows hat einen eigenen DOS-Emulatior ;)
http://de.wikipedia.org/wiki/NTVDM

Und da Du hier die "typischen" DOSe Interrupts verwendest, sollte es eigentlich gut klappen.
Abgesehen von dem "Art of Assembly language" Buch findet sich auch nicht mehr so viel zur DOSe Programmierung. Wobei ich ehrlich gesagt auch nicht mehr viel mit DOS Programmierung am Hut habe und deshalbt auch keine Dokumentationen etc kenne ;)
 
Danke erst mal für deinen Link. Die Quelle ist super.
Das Beispiel für mein Problem funktioniert nur leider nicht.

Bei
Code:
mov bx, seg Parmblock
und
Code:
mov dx, seg prgName
gibt mir MASM einen symbol type conflict aus. Wofür steht eigentlich die seg-Anweisung? Ich bin bisher noch nicht auf sie gestoßen.
 
Wofür steht eigentlich die seg-Anweisung?
das hängt mit der Speicherverwaltung von DOS zusammen.Da CPUs, die vor 386 kamen, sowieso nur 16-Bit Regeister besitzen, können diese theoretisch erstmal auch nur 65656 Adressen ansperechen.
Damit man auch größere Programme basteln kann und mehr als 64KB Speicher nutzen, wurde Segmentation eingeführt. Ich weiß jetzt nich, wann die Segmentregister genau eingeführt wurden, aber dank diesen kann man insgesamt 32-Bit Adressen ansprechen:
Segmentregister (CS,DS usw -16Bit)*16+(Wert aus einem der Offsetregister (BX,SI,DI,SP,BP)
wobei damit dann im Segmentregister der höhere WORD der Adresse steht.

Nur - da bin ich sonderlich darin bewandert und verweise lieber auf das Chapter4 des Buches oder eventuell Googlesuche zum "Segment DOS Speicherverwaltung" ;).
Ich würde darauf spekulieren, dass der MASM Linker über die SEG Anweisung die die spätere Adresse "auflöst" bzw. die Anweisung
mov dx,seg XYZ
in
mov dx,0x01000
"umschreibt", wenn z.B das Segment an 0x1000 gelegt wird.

Syntaktisch erwartet MASM eine Definierung der "Segmente" (k.A warum im Beispiel das mit den Variablen angegeben ist). Das ist auch im Chapter4,Seite 27 beschrieben.
Code:
dseg segment para public ?data?
; Global variables go here:
dseg ends
Wobei aber: wenn Du sowieso keine größeren Programme schreiben willst, kannst Du auch direkt das COM Format produzieren und erparst Dir die Segmentenquälerei.
Oder Du könntest auch die Variablen im Code-Abschnitt definieren. Siehe Chapter4 Seite 27.
 
Ich hab mein Programm wie die beschriebene SHELL.asm aufgebaut, trotzdem kam der selbe Fehler. Selbst wenn ich ParmBlock und PathName als Segmente definiere ändert das nichts.
Mir ist bewusst, dass das die dümmste Frage ist die ich stellen kann, aber ich weiß einfach nicht mehr weiter: Kannst du mir einen Beispielcode geben?

mfg raven
 
hab hier was zusammengebastelt - ein programm (COM Format),welches sich selbst assembliert ;)
größtenteils hier "geCopy&Pasted" (wie schon erwähnt, DOSe mag ich nicht ;) ). Ich habe es mit mehreren Exen getestet und scheint eigentlich gut zu klappen - auch Windows-Exen lassen sich damit starten.

Ach ja, für DOSe brauchst Du natürlich einen 16-bit Linker:
http://users.easystreet.com/jkirwan/new/pctools.html
sonst gibt es z.T unverständliche oder irreführende Fehlermeldungen.
 
Zurück
Oben