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

Marooned

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.

<font size="1" color="silver">data ostatniej modyfikacji: 2003-11-19</span>

FAQ

3 komentarzy

:/ albo od razu protected i finał

Hehe, a ci co lubia experymentowac zawsze moga pobawic sie z trybem UnReal processora ;>

Proponuję też zajrzeć do artykułu o pamięci ems w dziale tp