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>
:/ 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