Programowanie w języku Assembler » FAQ

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

  • 2006-01-17 02:26
  • 3 komentarze
  • 658 odsłon
  • Oceń ten tekst jako pierwszy
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

3 komentarze

darktemplar 2005-09-03 12:58

:/ albo od razu protected i finał

Gynvael Coldwind 2004-02-19 11:05

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

ŁF 2003-11-19 13:00

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