Jak zarezerwować więcej, niż 1MB pamięci pod DOSem

 



Artykuł wyjaśnia, jak zarezerwować większą ilość pamięci pod DOSem (powyżej 1MB) z wykorzystaniem sterownika himem.sys.
Inspiracją do jego napisania był ten wątek.

Sprawdzenie, czy zainstalowany jest himem.sys.
mov ax, 4300h
int 2fh
cmp al, 80h
je Himem_zainstalowany


Pobranie adresu procedury obsługi XMS.
XMSproc        dd ?

mov ax, 4310h
int 2fh
mov word ptr [XMSproc], bx
mov word ptr [XMSproc+2], es


I teraz mając adres do procedury obsługi XMS możemy dzięki niej wywoływać różne funkcje. Wybieramy je przez AH.

Sprawdzenie ilości wolnej pamięci.
mov ah, 8
call dword ptr [XMSproc]


dostajemy:
 DX: ilość wolnej pamięci w kB
 AX: rozmiar największego dostępnego bloku pamięci w kB

Rezerwacja bloku pamięci rozszerzonej.
mov ah, 9
mov dx, ile_kilobajtow_zarezerwowac
call dword ptr [XMSproc]


dostajemy:
 dx - uchwyt do zarezerwowanego bloku pamięci

Zwolnienie zarezerwowanej pamięci.
mov ah, 0ah
mov dx, uchwyt_XMS
call dword ptr [XMSproc]


No i najważniejsze - przesyłanie danych między pamięcią rozszerzoną, a podstawową.
W tym celu musimy wypełnić pewną strukturę.

IleBajtow     dd ?
UchwytZrodla  dw ?
AdresZrodla   dd ?
UchwytCelu    dw ?
AdresCelu     dd ?


(Poniższe instrukcje mov są tylko wskazaniem, co gdzie umieścić. Wiadomo, że nie można przesyłać bezpośrednio jednej komórki pamięci do drugiej. Należy to zrobić przez jakiś rejestr, najlepiej AX, EAX)

Przesyłanie z XMS do pamięci podstawowej.
mov IleBajtow, ile_bajtow
mov UchwytZrodla, uchwyt_XMS
mov AdresZrodla, 0
mov UchwytCelu, 0
mov AdresCelu, adres (AdresCelu = offset, AdresCelu[2] = segment)


Przesyłanie z pamięci podstawowej do XMS.
mov IleBajtow, ile_bajtow
mov UchwytZrodla, 0
mov AdresZrodla, adres (AdresCelu = offset, AdresCelu[2] = segment)
mov UchwytCelu, uchwyt_XMS
mov AdresCelu, 0


Jak już wypełniliśmy tę strukturę, to przesłanie pamięci wywołamy w ten sposób:
mov ah, 0bh
call dword ptr [XMSproc]


Jeśli AX=1 to wszystko OK. Jeśli natomiast AX=0, to pojawił się błąd. Numer błędu ląduje w BL. Pełny opis błędów tu.

data ostatniej modyfikacji: 2003-11-19
 

Programowanie - najnowsze