16.08.2013 Aufrufe

Professionell programmieren Per XMS-Treiber kontrolliert das ...

Professionell programmieren Per XMS-Treiber kontrolliert das ...

Professionell programmieren Per XMS-Treiber kontrolliert das ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

dabei war. Der <strong>XMS</strong>-<strong>Treiber</strong> weicht von dieser Konvention insofern ab, daß er ausschließlich den<br />

Rückgabewert 80h als gültige Antwort auf die Installationsanfrage definiert.<br />

Über den Multiplexkanal gibt es nur noch eine weitere <strong>XMS</strong>-Funktion: die Adresse des <strong>XMS</strong>-Handlers selbst<br />

erfragen.<br />

xmsvec dd ?<br />

mov ax,4310h<br />

int 2Fh<br />

mov word ptr xmsvec,bx<br />

mov word ptr xmsvec + 2,es<br />

Prinzipiell hätte man zwar alle <strong>XMS</strong>-Funktionen gleich über INT 2Fh abwickeln können. Doch je mehr<br />

Programme sich in diese Vektorkette einschleifen, desto länger kann es dauern, bis ein Funktionsaufruf den<br />

Adressaten erreicht. Die eigentlichen <strong>XMS</strong>-Funktionen werden daher mit dem Funktionscode in AH durch<br />

einen FAR CALL an die hier erhaltene Adresse angestoßen.<br />

Kehren wir nun zu den angesprochenen drei Grundfunktionen zurück: Allocate, Move und Free. Bevor man<br />

seine Daten im <strong>XMS</strong> loswird, muß man sich einen entsprechend großen Speicherbereich zuweisen lassen. Dies<br />

geschieht in der Funktion Nummer 9, Allocate Memory.<br />

mov dx,kbytes ; benötigte Größe<br />

mov ah,9<br />

call xmsvec ; anfordern<br />

dec ax<br />

jnz keinram<br />

mov handle,dx<br />

Die meisten <strong>XMS</strong>-Funktionen geben in AX ein Erfolgsflag zurück. Konnte die Funktion ordnungsgemäß<br />

durchgeführt werden, ist AX Eins, bei einem Fehler ist AX Null, und der Fehlercode wird dann in BL hinterlegt.<br />

Oft ist es hilfreich, zu wissen, wieviel Platz im Speicher noch zur Verfügung steht. Wenn man zehn<br />

verschiedene Blöcke über zusammen 100 KByte benötigt, und es sind nur noch 98 KByte frei, braucht man mit<br />

dem Zuweisen vielleicht gar nicht erst anzufangen. Die <strong>XMS</strong>-Funktion 8 übergibt im DX-Register den<br />

gesamten freien <strong>XMS</strong>-Speicher in KByte und in AX den größten, noch freien zusammenhängenden <strong>XMS</strong>-<br />

Block.<br />

Mit dem Handle, daß beim Zuweisen in Funktion 9 zurückgegeben wird, kann man den Speicherblock<br />

ansprechen. Da der <strong>XMS</strong>-Speicher physikalisch oberhalb 1 MByte liegt, ist er im Real Mode nicht direkt<br />

zugänglich. Das Übertragen von Daten in den oder aus dem <strong>XMS</strong>-Block geschieht deswegen auch über einen<br />

Funktionsaufruf. Ihm werden die drei benötigten Parameter (Quelladresse, Zieladresse, Anzahl Bytes) in einer<br />

Struktur bei DS:SI übergeben (siehe Tabelle 2).<br />

Die Handles für Quelle und Ziel sind entweder die von Funktion 9 übergebenen <strong>XMS</strong>-Handles oder Null. Bei<br />

einer Handle bezeichnet die dazugehörige Adresse den Offset in dem betreffenden Datenblock. Eine Null als<br />

Handle betrifft den Adreßraum unterhalb 1 MByte. In dem Fall werden im Adreßfeld normale Real-Mode<br />

Adreßpärchen (Segment:Offset) abgelegt, also ein 10-Bit Offset im unteren Word und <strong>das</strong> Segment im oberen.<br />

mov si,offset daten ; Parameterfeld<br />

mov ax,laenge_L ; Anzahl Bytes<br />

mov dx,laenge_H<br />

add ax,1<br />

adc dx,0<br />

and al,not 1 ; gerade Zahl erforderlich<br />

mov [si],ax<br />

mov 2[si],dx<br />

mov word ptr 4[si],0 ; Real-Mode Handle<br />

mov word ptr 6[si],offset quelle<br />

mov word ptr 8[si],seg data<br />

mov ax,Handle ; <strong>XMS</strong>-Handle<br />

mov 10[si],ax<br />

xor ax,ax ; Offset Null im <strong>XMS</strong>-Block

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!