home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
lib4a86
/
doc
/
mstack.doc
< prev
next >
Wrap
Text File
|
1992-02-11
|
10KB
|
251 lines
─────────────────────────────────────────────────────────────────────────────
Dokumentation zur Datei: MSTACK.INC
─────────────────────────────────────────────────────────────────────────────
MSTACK.INC - Routinen zur Verwaltung eines meldungsorientierten Stacks
(für den Assembler A86)
(c) Bernd Schemmer 1992
Letzter Update: 02.02.1992
■ Beschreibung:
---------------
MSTACK.INC stellt Routinen zur Verwaltung eines meldungsorientierten
Stacks zur Verfügung. Ein Stack (oder auf deutsch: Stapel) ist eine
nach dem LIFO-Prinzip (Last in, First out) organisierte Datenstruktur
zur Speicherung von Daten, in diesem Fall von Meldungen, wobei der
Inhalt der 'Meldungen' für die Routinen völlig unerheblich ist.
Jede Meldung belegt n Byte plus 1 Byte für die Verwaltungsstrukturen,
wobei n ein Wert im Intervall zwischen 0 und 255 ist.
Die Größe eines Stacks, der durch diese Routinen verwaltet werden
soll, muß zwischen 256 und 65.535 Byte liegen.
Jeder Stack beginnt immer mit einem 16 Byte großem Header auf einer
Segment-Grenze.
Die Routinen unterstützen auch die Einteilung von Meldungen in bis
zu 256 Klassen.
Jeder Stack ist durch einen Semaphor vor gleichzeitiger Bearbeitung
durch mehrere Prozesse geschützt, wodurch der Stack auch durch
mehrere verschiedene Prozesse gefüllt und geleert werden kann.
Es ist auch möglich, einen Stack in eine Datei zu sichern und später
wieder zu laden, da die Routinen nur mit relativen Offsets arbeiten.
Es muß nur der benutzte Teil des Stacks gesichert werden.
■ Variablen:
------------
MStackSeg - Word, Segment des aktuellen Stacks
Alle Routinen (außer InitMStack) definieren einen zusätzlichen
Einsprungpunkt 'name_A'. (z.B. für 'ReadMStack' ist dies
'ReadMStack_A'). Falls die Routinen über diesen Einsprungpunkt
aufgerufen werden, arbeiten sie mit dem Stack, dessen Segment
in dieser Variable gespeichert ist. (Der Wert des Registers ES
beim Aufruf ist in diesen Fall ohne Bedeutung, das Register ES
wird aber NICHT gesichert.) Die Variable muß in diesem Fall
vorher auf einen korrekten Wert gesetzt worden sein! (durch
den Aufruf von 'InitMStack' oder durch direktes Setzen)
Falls die Routinen über den normalen Einsprungpunkt aufgerufen
werden, wird diese Variable weder genutzt noch verändert.
MStackSeg:[MStackUserData1] - Word, für Benutzerzwecke reserviert
MStackSeg:[MStackUserData2] - Word, für Benutzerzwecke reserviert
An den Offsets MStackUserData1 und MStackUserData2 im Header
des Stacks sind jeweils 2 Byte (= 1 Wort) für Daten des Programms
reserviert. Diese beiden Wörter werden von den Routinen zur
Verwaltung des Stacks weder gelesen noch verändert (also auch
nicht mit einem definierten Wert initialisiert).
(MStackUserData1 und MStackUserData2 sind über 'dw' definiert)
Alle anderen Variablen zur Verwaltung des Stacks werden im Speicher-
bereich für den Stack angelegt und sollten von anderen Routinen weder
gelesen noch verändert werden.
■ Routinen:
-----------
InitMStack - Initialisert (d.h. löscht) den Stack
LockMStack - Sperrt einen Stack
UnLockMStack - Gibt einen Stack wieder frei
DeleteMStack - Löscht den gesamten Stack
WriteMStack - Sichert eine neue Meldung auf den Stack
LookMStack - Ermittelt die Länge und die Klasse der
nächsten Meldung vom Stack
ReadMStack - Holt die nächste Meldung vom Stack
GetMStackStatistik - Ermittelt die Daten des Stacks
Da alle Variablen zur Verwaltung des Stacks im Segment des Stacks
angelegt werden, können die Routinen auch mit mehreren Stacks
gleichzeitig arbeiten.
Hinweis: Da nicht alle verwendeten Namen und Bezeichner dieser Datei
dokumentiert sind, sollten bei Nutzung dieser Routinen in
den anderen Quelltexten keine Namen oder Bezeichner, die
die Zeichenkette 'MStack' enthalten, verwendet werden.
■ Fehlernummern der Routinen
----------------------------
Alle Fehlernummern der Routinen haben das Format 85xx, wobei xx die
Nummer des eigentlichen Fehlers ist.
Name Nummer Bedeutung
----------------------------------------------------------------------
MStackIsEmpty EQU 08501h ; Es ist keine Meldung auf dem Stack
MStackIsFull EQU 08502h ; Es ist nicht mehr genügend freier Speicher
; zur Aufnahme der neuen Meldung auf den
; Stack vorhanden
MStackLengthError EQU 08503h ; falsche Größe für den Stack angegeben
MStackBufferError EQU 08504h ; Puffer ist für die nächste Meldung zu
; klein
MStackMessageError EQU 08205h ; Die Meldung ist zu lang
MStackAktivError EQU 082FFh ; gleichzeigtiger Zugriff von mehreren
; Prozessen auf einen Stack nicht möglich
----------------------------
InitMStack
Funktion: Initialisiert den Stack
Eingabe: ES = Segment für den Stack
Der Stack beginnt immer am Offset 0
CX = Größe des Speicherbereichs in Byte für den Stack
Es muß gelten: 256 < CX < 65.535
Ausgabe: CF = 0 ->> okay
CX = freier Speicher auf dem Stack
CF = 1 ->> Fehler
AX = Fehlernummer
Der Stack wurde NICHT eingerichtet.
Bes.: Das Segment des Stacks wird, falls kein Fehler auftritt, in
der Variablen MStackSeg gespeichert.
Der Wert des Semaphors des Stacks wird NICHT berücksichtigt!
----------------------------
DeleteMStack
Funktion: Löscht den gesamten Stack
Eingabe: ES = Segment des Stacks
Ausgabe: CF = 0 ->> okay
CX = freier Speicher auf dem Stack
CF = 1 ->> Fehler
AX = Fehlernummer
----------------------------
LockMStack
Funktion: Sperrt einen Stack
Eingabe: ES = Segment des Stacks
Ausgabe: CF = 0 ->> okay
CF = 1 ->> Fehler
AX = Fehlernummer
----------------------------
UnLockMStack
Funktion: Gibt einen Stack wieder frei
Eingabe: ES = Segment des Stacks
Ausgabe: CF = 0 ->> okay
CF = 1 ->> Fehler
AX = Fehlernummer
Bes.: Der Wert des Semaphors des Stacks wird NICHT berücksichtigt!
----------------------------
GetMStackStatistik
Funktion: Ermittelt die statistischen Daten des Stacks
Eingabe: ES = Segment des Stacks
Ausgabe: CF = 0 ->> okay
CX = freier Speicher auf dem Stack
DX = Größe des Stacks
AX = Anzahl der Meldungen auf dem Stack
BX = Länge des belegten Teils des Stacks
CF = 1 ->> Fehler
AX = Fehlernummer
----------------------------
WriteMStack
Funktion: Sichert eine Meldung auf den Stack
Eingabe: ES = Segment des Stacks
CX = Länge der Meldung
DS:SI -> Meldung
Ausgabe: CF = 0 ->> okay
CF = 1 ->> Fehler
AX = Fehlernummer
und falls AX = MStackIsFull ist:
CX = max. Länge einer weiteren Meldung für den Stack
falls CX = -1 ->> keine weitere Meldung möglich
Bes.: Das Directionflag wird gelöscht.
----------------------------
LookMStack
Funktion: Ermittelt die Daten der nächsten Meldung auf dem Stack
Eingabe: ES = Segment des Stacks
Ausgabe: CF = 0 ->> okay
CX = Länge der nächsten Meldung
und falls CX <> 0:
AL = 1. Byte der Meldung
CF = 1 ->> Fehler
AX = Fehlernummer
Bes.: Die Klasse von Meldungen kann im 1. Byte einer Meldung
gesichert werden, da dieses Byte auch durch den Look-
Ahead-Aufruf zurückgeliefert wird.
Das Directionflag wird gelöscht.
----------------------------
ReadMStack
Funktion: Holt die nächste Meldung vom Stack
Eingabe: ES = Segment des Stacks
CX = Länge des Puffers für die Meldung
DS:SI -> Puffer für die Meldung
Ausgabe: CF = 0 ->> okay
Meldung steht im Puffer bei DS:SI
CX = Länge der Meldung
CF = 1 ->> Fehler
AX = Fehlernummer
Bes.: Falls diese Routine mit CX = 0 aufgerufen wird, verhält
sie sich wie die Routine 'LookMStack'.
Falls der Puffer bei DS:SI für die Meldung zu klein ist,
wird die Meldung NICHT vom Stack entfernt.
Das Directionflag wird gelöscht.