
UNIVERZITET "Sv. Kiril i Metodij"
Prirodno matemati~ki Fakultet - Skopje
Institut za Informatika
![]()
Rabota so
pro{irena i prodol`ena memorija
Predmet:
Mikroprocesori i Mikrokompjuteri
Izrabotil: Goran Velinov
Mentor: Doc. D-r. Marjan
Gu{ev
Skopje, noemvri 1997 godina
![]()
So pojavata na procesorot Intel 286 e ovozmo`eno adresirawe do 16MB memorija, no za pristap do taa memorija procesorot mora da raboti vo za{titen re`im na rabota. Nao|aweto na~in na sistemot da mu se dodade memorija koja {to DOS efektivno mo`e da ja koristi impliciral sorabotkata na trite golemi proizveduva~i - Lotus, Intel i Microsoft. Kako rezultat na taa sorabotka e standardot za dodavawe na memorija nare~en LIM standard spored prvite bukvi na proizvoditelite. Vo osnova se rabotelo za dodavawe na memorija na posebna karti~ka pri {to i se pristapuvalo preku memoriski stranici. Memoriskata ramka ili prozorec se nao|al vo podra~jeto na gornata memorija. Na toj na~in DOS mo`el da pristapi do ramkata i da koristi momentalnata memoriska stranica. So menuvaweto na stranicite sprema potrebite na programite DOS imal pristap, ne ednovremen, do celata pro{irena memorija. Memoriskiot prozorec e dolg 64KB, a vnatre vo nego, sprema standardot, se razlikuvale ~etiri podra~ja po 16KB {to se nare~eni memoriski stranici. Sprema prviot javno objaven standard, LIM 3.0, bilo mo`no da se pristapi do 8MB memorija. Na slika br.1 e ilustriran na~inot na pristap do pro{irenata memorija po konceptot na memoriski ramka i memoriska stranica.
Pokraj karti~kata, {to pretstavuvala
hardverskiot del od sistemot na pro{irena memorija, potreben e i
eden vid pogonska programa {to ja osiguruva programskata podloga.
Pogonskite programi od ovoj tip se narekuvaat upravuva~ki
programi na pro{irenata memorija - EMM (Expanded Memory Managers). So pojavata na procesorot od klasata 386
koj {to mo`el da raboti i vo t.n. virtuelen 86 re`im, ovozmo`eno
e mapirawe na podra~je od prodol`enata memorija vo memoriska
ramka i na toj na~in softverski da se emulira karti~kata so
pro{irena memorija. Standardite za pro{irenata memorija
evoluirale so tek na vremeto. Najpoznati standardi za pro{irenata
memorija se EMS 3.2 i
EMS 4.0. Verzijata 4.0 e vsu{nost
podobruvawe na verzijata 3.2 vo smisla na podr{kata za
32MB, a ne 8MB memorija, realokatibilna memoriska ramka so
proizvolna golemina (bez ograni~uvawe na 64KB) i mo`nosta za za{tita na sodr`inata na
pro{irenata memorija vo slu~aj na pa|awe na sistemot.
Programaskata vklu~uva vkupno 58 funkcii.
Slika 1. Organizacija na DOS memorija
Programite {to sakaat da alociraat pro{irena memorija mora da imaat del od kodot vo koj }e proverat dali pro{irenata memorija e instalirana vo sistemot. Pristapot do pro{irenata memorija e standarden - so prekinot 67H i negovite funkcii za rabota so memorijata. Me|utoa so povikuvaweto na prekinot 67H vo slu~aj koga pro{irenata memorija ne e instalirana mo`e da dojde do pa|awe na sistemot. Zatoa prvo pravilo za dobra programa {to raboti so pro{irena memorija e proverkata dali taa e dostapna. Imaj}i go predvid faktot deka rabotata so pro{irenata memorija e ovozmo`ena so pogonskata programa {to se vika EMMXXXXO (imeto mu e definirano so LIM standardot), so funkcijata 3DH na prekinot 21H se obiduva da se otvori ured kako datoteka i da se dobie soodveten handle. Ako e uspe{en povikot, se povikuva podfunkcijata 07H na funkcijata 44H na prekinot 21H. Dokolku po povikot na ovaa funkcija vrednosta vo registerot AL e 0, toga{ ne e instalirana pro{irenata memorija i povicite na funkciite na prekinot 67H nema da bidat uspe{ni i mo`at da dovedat do pa|awe na sistemot.
Vtoriot na~in na e zasnovan na faktot deka instaliranata pogonska programa go naso~uva prekinot 67H na svojot po~etok (naslovot na pogonskata programa). Zatoa se prvo odreduva segment adresata na pogonskata programa so pomo{ na prekinuva~kiot vektor na adresa 0:091CH, a potoa na pomestuvaweto 0AH (10 bajti od po~etokot) se bara imeto EMMXXXXO. Ako e najdeno navedenoto ime, ovozmo`ena e rabotata so pro{irenata memorija. Otkako e provereno dali e dostapna pro{irenata memorija, ponatamo{nata rabota sekoga{ se odviva na ist na~in:
1. Se alocira opredelen broj memoriski stranici (sekoja stranica ima 16KB) pri {to vkupniot broj alocirani stranici zavisi od potrebite na programata i od vkupno dostapnata pro{irena memorija.
2. Koristeweto na uspe{no alociranite memoriski stranici ne e direktno, t. e. podatocite vo sekoja od niv mo`e da se zapi{uvaat i od niv ~itaat samo koga se mapirani vo ramki na edna od ~etirite fizi~ki memoriski stranici {to se nao|aat vo memoriskata ramka ili prozor.
3. Pred zavr{uvawe na programata potrebno e da se oslobodi alociranata memorija zatoa {to vo sprotivno i pokraj zavr{uvaweto na programata, memorijata e trajno alocirana i ne e dostapna za ponatamo{na rabota na drugi programi.
Kako {to e navedeno na po~etokot,
alociraweto i rabotata so pro{irenata memorija se ovozmo`eni so
funkciite na prekinot 67H.
Sledniov primer napi{an vo asembler, gi poka`uva site osnovni
~ekori pri upotrebata na pro{irenata memorija: proverka na
dostapnosta, alocirawe, mapirawe i osloboduvawe.
Listing 1. EMS.ASM Listing na asembler programa za rabota so
pro{irena memorija.
EXTRN PRINT_NMB:FAR Nadvoresna funkcija za ispisuvanje na broj,
;smestena vo ASMILB.ASM
@WR_STR MACRO STR ;Makro za ispisuvanje na string na ekran
MOV AH, 09H
MOV DX, OFFSET STR
INT 21H
ENDM
@WR_BR MACRO BROJ ;Makro za ispisuvawe na dvobajten broj
MOV AX, BROJ
CALL PRINT_NMB
ENDM
@WR_BR1 MACRO BROJ ;Makro za ispisuvanje na ednobajten broj
XOR AH, AH
MOV AL, BROJ
CALL PRINT_NMB
ENDM
@RD_KEY MACRO ;Makro za citanje znak od tastatura
MOV AH, 07H ;(ekvivalent na ReadKey)
INT 21H
ENDM
@KRAJ MACRO ;Makro za kraj
MOV AX,4C00H
INT 21H
ENDM
STACK SEGMENT STACK ;Stek segment
DB 128 DUP(0)
STACK ENDS
DATA SEGMENT ;Podatocen segment
EMMEC DB ?
STRANI DW ?
BR DW ?
HANDLE DW ?
BR1 DB ?
BR2 DB ?
VRADRP DW ?
PAGEADRP DW ?
NL DB 13,10,'$'
IME DB 'EMMXXXX0$'
TOC DB '.$'
LZ DB ' ( $'
DZ DB ' KByte) $'
EMMV DB 'EMM-Version number : $'
EMSN DB 'Number of EMS pages : $'
EMSF DB '...free : $'
PRK DB ' ...Please press a key $'
EMSA DB 'Segment address of page frame : $'
EMSAL DB 'Now a page from EMS memory can be allocated, and the screen$'
EMSAL1 DB 'contents can be copied from video RAM into this page$'
DEMO DB 'EMMA DEMO $'
OLDS DB 'Old screen contents are cleared.However the data from the$'
SCR DB 'screen is in EMS, and can be re - copied onto the screen$'
NOMEM DB 'No EMS memory instaled$'
NULA DB '0$'
KR DB ' END $'
STR1 DB 'Unidentifiable error $'
STR2 DB 'EMS driver error (EMM trouble) $'
DB 'EMS hardware error $'
DB 'Illegal EMM handle $'
DB 'Called EMS function does not exist $'
DB 'No more free EMS handles available $'
DB 'Error while saving or restoring mapping $'
DB 'More pages requested than are actually available$'
DB 'More pages requested than are free $'
DB 'No pages requested $'
DB 'Logical page does not belong to handle $'
DB 'Illegal physical page number $'
DB 'Mapping memory range is full $'
DB 'Map save has already been done $'
DB 'Mapping must be saved beforeit can be restored $'
DATA ENDS
CODE SEGMENT PARA PUBLIC 'CODE' ;Programski segment
ASSUME CS:CODE, DS:DATA, SS:STACK, ES:DATA
POC: MOV BX, DATA
MOV DS, BX
MOV ES, BX
@WR_STR DEMO
@WR_STR NL
CALL EMSINST ;Povik na funkcija sto proveruva dali
;e instalirana EMS memorija
CMP AX, 00H
JE L1
CALL EMSVERSION ;Povik na funkcija sto ja opredeluva
;verzijata na pogonskoit program
MOV BR, AX
CMP AX, 1111H
JE L2
JMP L3
L2: CALL PRINTERR
L3: @WR_STR EMMV
MOV AX, BR
MOV BL, 0AH
DIV BL
MOV BR1, AL
MOV BR2, AH
@WR_BR1 BR1
@WR_STR TOC
CMP BR2, 00H
JE LG1
@WR_BR1 BR2
JMP LG2
LG1: @WR_STR NULA
LG2: @WR_STR NL
CALL EMSNUMPAGE ;Povik na funk. sto go opredeluva vkupniot
;broj na mem. str. na prosirenata memorija
MOV BR, AX
CMP AX, 1111H
JE L4
JMP L5
L4: CALL PRINTERR
L5: @WR_STR EMSN
@WR_BR BR
MOV CL, 04H
JMP LP1
L1: JMP L111
LP1: SHL BR, CL
@WR_STR LZ
@WR_BR BR
@WR_STR DZ
@WR_STR NL
CALL EMSFREEPAGE ;Povik na funk. sto go opredeluva vkupniot
;br na slobodni mem. str. na pros. mem.
MOV BR, AX
CMP AX, 1111H
JE L6
JMP L7
L6: CALL PRINTERR
L7: @WR_STR EMSF
@WR_BR BR
MOV CL, 04H
SHL BR, CL
@WR_STR LZ
@WR_BR BR
@WR_STR DZ
@WR_STR NL
CALL EMSFRAMESEG ;Povik na funk. sto ja opredeluva adresata
;na fizickata memoriska ramka
MOV BR, AX
CMP AX, 0FFFFH
JE L8
JMP L9
L8: CALL PRINTERR
L9: @WR_STR EMSA
@WR_BR BR
@WR_STR NL
JMP LP2
L111: JMP L112
LP2: @WR_STR NL
@WR_STR EMSAL
@WR_STR NL
@WR_STR EMSAL1
@WR_STR NL
@WR_STR PRK
@WR_STR NL
; @RD_KEY
MOV BX, 01H
CALL EMSALLOC ;Povik na funkcija sto alocira opredelen
;memoriski stranici
MOV HANDLE, AX
CMP AX, 1111H
JE L10
JMP L11
L10: CALL PRINTERR
L11: XOR AX, AX
XOR BX, BX
MOV DX, HANDLE
CALL EMSMAP ;Povik na funkcija sto mapira rezervirana
;memoriska stranica
CMP AX, 00H
JE L12
JMP L13
L12: CALL PRINTERR
L13: CALL VRADR ;Povik na funk. sto ja opredeluva adresata
;na video memorijata
XOR DX, DX
CALL PAGEADR ;Povik na funk. sto generira pokazuvac na
;na memoriska stranica
MOV CX, 4000
PUSH DS
PUSH ES
MOV ES, VRADRP
MOV DS, PAGEADRP
XOR SI, SI
XOR DI, DI
L14: MOV DL, ES:[SI]
MOV [DI], DL
INC SI
INC DI
DEC CX
CMP CX, 00H
JNE L14
POP ES
POP DS
@RD_KEY
CALL CLEAR ;Povik na funkcija sto go brise ekranot
@WR_STR OLDS
@WR_STR NL
@WR_STR SCR
@WR_STR NL
@WR_STR PRK
@RD_KEY
MOV CX, 4000
PUSH DS
PUSH ES
XOR SI, SI
XOR DI, DI
MOV BX, VRADRP
MOV ES, BX
MOV DS, PAGEADRP
L15: MOV DL, [SI]
MOV ES:[DI], DL
INC SI
INC DI
DEC CX
CMP CX, 00H
JNE L15
POP ES
POP DS
MOV DX, HANDLE
CALL EMSFREE ;Povik na funkcija sto ja osloboduva
;rezerviranata mem. str.
CMP AX, 00H
JNE L16
CALL PRINTERR
L16: @WR_STR NL
@WR_STR KR
@WR_STR NL
JMP LP3
L112: @WR_STR NOMEM
LP3: @KRAJ
;Funkcija sto proveruva dali e instaliran pogonskata programa EMMXXX0
;Vlez: nema
;Izlez:AX=00H ako ne e instaliran
; AX=01H ako e instaliran
EMSINST PROC NEAR
MOV AH, 35H
MOV AL, 67H
INT 21H
XOR CX, CX
MOV SI, OFFSET IME
MOV CL, 08H
MOV BX, 0AH
LAB1: MOV AH, [SI]
MOV DH, ES:[BX]
CMP AH, DH
JNZ LAB2
INC SI
INC BX
LOOP LAB1
MOV AX, 01H
JMP LAB3
LAB2: XOR AX, AX
LAB3: NOP
RET
EMSINST ENDP
;Funkcija sto go opredeluva vkupniot broj na memoriski stranici na prosirenata
;memorija
;Vlez: nema
;Izlez: AX vkupniot broj na memoriski stranici
EMSNUMPAGE PROC NEAR
MOV AH, 42H
INT 67H
CMP AH, 00H
JZ LAB01
MOV EMMEC, AH
MOV AX, 1111H
JMP LAB02
LAB01: MOV AX, DX
LAB02: NOP
RET
EMSNUMPAGE ENDP
;Funkcija sto go opredeluva vkupniot broj na slobodni memoriski stranici na
;prosirenata memorija
;Vlez: nema
;Izlez: AX broj na slobodnite memoriski stranici
EMSFREEPAGE PROC NEAR
MOV AH, 42H
INT 67H
CMP AH, 00H
JZ LAB11
MOV EMMEC, AH
MOV AX, 1111H
JMP LAB12
LAB11: MOV AX, BX
LAB12: NOP
RET
EMSFREEPAGE ENDP
;Funkcija sto ja opredeluva segmentnata adresa na fizickata memoriska ramka
;vo koja se mapiraat logickite memoriski stranici
;Vlez: nema
;Izle: AX segmentna adresa na memoriskata ramka
EMSFRAMESEG PROC NEAR
MOV AH, 41H
INT 67H
CMP AH, 00H
JZ LAB21
MOV EMMEC, AH
MOV AX, 0FFFFH
JMP LAB22
LAB21: MOV AX, BX
LAB22: NOP
RET
EMSFRAMESEG ENDP
;Osnovna funkcija sto alocira opredelen broj memoriski stranici
;sekoja stranica e so dolzina 16K
;Vlez: BX broj na strani sto treba da se alociraat
;Izlez: AX EMS handle
EMSALLOC PROC NEAR
MOV AH, 43H
INT 67H
CMP AH, 00H
JZ LAB31
MOV EMMEC, AH
MOV AX, 1111H
JMP LAB32
LAB31: MOV AX, DX
LAB32: NOP
RET
EMSALLOC ENDP
;Funkcija sto ja mapira rezerviranata memoriska stranica vo edna od cetirite
;dostapni fizicki stranici vo vnatresnosta na ramkata
;Vlez: AL fizicka pozicija
; BX logicka pozicija
; DX EMS handle
;Izlez: AX=00H ako mapiranjeto vo fizickata ramka ne e uspeno
; AX=01H ako se e vo red
EMSMAP PROC NEAR
MOV AH, 44H
INT 67H
MOV EMMEC, AH
CMP AH, 00H
JZ LAB41
XOR AX, AX
JMP LAB42
LAB41: MOV AX, 01H
LAB42: NOP
RET
EMSMAP ENDP
;Funkcija sto ja osloboduva rezerviranata memoriska stranica preku
;pripgjckiot handle
;Vlez: DX EMS handle
;Izlez: AX=00H ako ima greska
; AX=01H ako se e vo red
EMSFREE PROC NEAR
MOV AH, 45H
INT 67H
MOV EMMEC, AH
CMP AH, 00H
JZ LAB51
XOR AX, AX
JMP LAB52
LAB51: MOV AX, 01H
LAB52: NOP
RET
EMSFREE ENDP
;Funkcija sto ja opredeluva verzijata na pogonskiot program na prosirenata
;memorija
;Vlez: nema
;Izlez: AX=1111H ako ima greska
; AX verzija na programata, ako se e vo red
EMSVERSION PROC NEAR
MOV AH, 46H
INT 67H
CMP AH, 00H
JZ LAB61
MOV EMMEC, AH
MOV AX, 1111H
JMP LAB62
LAB61: MOV BL, AL
AND BL, 0EH
MOV CL, 04H
SHR AL, CL
MOV CL, 0AH
MUL CL
ADD AL, BL
LAB62: NOP
RET
EMSVERSION ENDP
;Funkcija sto vrsi zacuvuvanje na mapata na prosirenata memorija
;Vlez: nema
;Izlez: AX=00H ako se e vo red
; EMMEC kod na greskata
EMSSAVEMAP PROC NEAR
MOV AH, 47H
INT 67H
MOV EMMEC, AH
CMP AH, 00H
JZ LAB71
MOV AX, 01H
JMP LAB72
LAB71: XOR AX, AX
LAB72: NOP
RET
EMSSAVEMAP ENDP
;Funkcija sto vrsi resetiranje na mapata na prosirenata memorija
;Vlez: nema
;Izlez: AX=00H ako se e vo red
; EMMEC kod na greskata
EMSRESTOREMAP PROC NEAR
MOV AH, 48H
INT 67H
MOV EMMEC, AH
CMP AH, 00H
JZ LAB81
MOV AX, 01H
JMP LAB82
LAB81: XOR AX, AX
LAB82: NOP
RET
EMSRESTOREMAP ENDP
;Funkcija sto vo slucaj na neuspesen povik na ostanatite funkcii ispisuva
;greska na standardniot izlezen ured
;Vlez: EMMEC kod na greskata
;Izlez: nema
PRINTERR PROC NEAR
@WR_STR STR1
MOV AL, EMMEC
CMP AL, 80H
JL LAB91
CMP AL, 8EH
JG LAB91
CMP AL, 82H
JE LAB91
JMP LAB92
LAB91: @WR_STR STR2
LAB92: MOV BX, OFFSET STR2
XOR AH, AH
SUB AX, 80H
MOV DX, 30H
MUL DX
ADD AX, BX
MOV DX, AX
MOV AH, 09H
INT 21H
RET
PRINTERR ENDP
;Funkcija sto generira promenliva - pokazuvac na adresata na video memorijata
;Vlez: nema
;Izlez: VRADRP segmentot na adresata
VRADR PROC NEAR
MOV AH, 0FH
INT 10H
CMP AL, 07H
JNE LAB10
MOV VRADRP, 0B000H
JMP LAB20
LAB10: MOV VRADRP, 0B800H
LAB20: NOP
RET
VRADR ENDP
;Funkcija sto generira promenliva - pokazuvac na adresata na ramkata na
;fizickata stranica
;Vlez: nema
;Izlez: PAGEADRP segment na adresata
PAGEADR PROC NEAR
CALL EMSFRAMESEG
MOV PAGEADRP, BX
MOV CL, 0AH
SHL DX, CL
ADD PAGEADRP, DX
RET
PAGEADR ENDP
;Funkcija sto go brise ekranot (ekvivalent na ClrScr)
;Vlez: nema
;Izlez: nema
CLEAR PROC NEAR
MOV CX, 3750
PUSH ES
MOV ES, VRADRP
XOR SI, SI
XOR DI, DI
P11: XOR AH, AH
MOV ES:[SI], AH
INC SI
DEC CX
CMP CX, 00H
JNE P11
POP ES
RET
CLEAR ENDP
CODE ENDS
END POC
Prodol`enata memorija pretstavuva
dodatna memorija na koja {to procesorot pristapuva vo za{titen
mod. 8086/8088 procesori voop{to nemaat pristap do prodol`enata
memorija, zatoa {to rabotat edinstveno vo realen mod. Od
procesorite od klasata 286 i podobri pristapot do prodol`enata
memorija e mnogu ednostaven. So postavuvawe na eden bit vo
registerot na znamenca procesorot se prefrla vo za{titen mod i
ima pristap do celokupnata prodol`ena memorija. Me|utoa
ednostaven pristap ne zna~i i ednostavna upotreba zatoa {to
rabotata so prodol`enata memorija ima golemi programski
pobaruvawa poradi nizata pravila koi {to adresiraweto i rabotata
so memorijata gi pravat potpolno poinakvi vo odnos na realniot
mod. Treba da se napomene deka e mo`en pristap do dolnite 64KB od prodol`enata memorija i od realen mod,
kako posledica od na~inot na adresirawe.
Kako i kaj pro{irenata mamorija, rabotata so prodol`enata memorija e mo`na samo ako prodol`enata memorija postoi vo sistemot. Standardniot pristap do prodol`enata memorija e ovozmo`en so prekinot 15N. Na raspolagawe ima dve funkcii: 87N i 88N. So povikuvawe na funkcijata 88N se opredeluva koli~estvoto na prodol`ena memorija. Funkcijata 87N pomestuva memoriski blokovi vo vnatre{nosta na memoriskiot prostor, t.e. ovozmo`eno e pomestuvawe na memoriski blokovi nad 1MV vo prostorot do 1MV. Iako zvu~i ednostavno, funkcijata 87N pobaruva mnogu podrobni informacii, {to posebno va`i za Global Descriptor Table - GDT na koja {to pri povikot na funkcijata poka`uva ES:SI. GDT gi opi{uva memoriskite segmenti na procesorot vo za{titen mod. Za razlika od realnot mod, dol`inite na segmentite ne se ednakvi (64K) i se dvi`at od 1K do 64K. Ponatamu, vo realen mod segmentite zapo~nuvaat na to~no opredeleni adresi. Tie adresi mora da bidat delivi so 16, dodeka vo za{titen mod segmentite mo`e da po~nuvaat na bilo koja adresa. Sekoj od segmentite ima tnr. pristapen kod {to gi deli segmentite na podato~ni i programski, ozna~uva prioritet ili onevozmoo`uva pristap. Sekoj od segmentite vo GDT e opi{an so 8 bajti sprema slednava tablica:
Pomestuvawe Zna~ewe
00N Dol`ina na segmentot
02N Adresa na segmentot (bitovi 0-15)
04N Adresa na segmentot (bitovi 16-23)
05N Pristapen kod 06N
Vakvata struktura se povtoruva za site segmenti {to gi opisuva GDT na slednava struktura:
Pomestuvawe Zna~ewe
00N Rezervirano - bilo {to
08N GDT
10N Po~eten segment (START)
18N Celen segment (DESTINATION)
20N BIOS CS
28N Stek (Stack)
BIOS-ot gi popolnuva podatocite za site segmenti osven za po~etniot i celniot. Zatoa treba da se definira opisna struktura za po~etniot i celniot segment. Dol`inata ne smee da pomine 64K (FFFFH). Adresata na segmentot se definira so 24 bita od koi na pomestuvaweto 02N se 16-te dolni i na pomestuvaweto 04N se 8-te gorni bita od adresata. Pristapniot kod zavisi od primenata: kod 92N ozna~uva podato~en segment so najvisok prioritet vo koj mo`e da se zapi{uva. Upotrebata na funkcijata 87N osven slo`enosta na povikot ima u{te eden nedostatok - dodeka procesorot se nao|a vo za{titen mod se onevozmo`eni site prekini. Ako se ~esto koristi ovaa funkcija }e dojde do zadocnuvawe na sistemskiot ~asovnik, pomestuvaweto na golemi podato~ni blokovi ima golemo vreme na izvr{uvawe, pa mo`e da se slu~i programata vo pozadina za obrabotka na seriskiot vlez da propu{ti podatoci. Poseben problem se javuva kaj procesorot 80286. Prefrlaweto vo za{titen mod e brzo i ednostavno, no vra}aweto vo realen mod e mo`no edinstveno so resetirwe na procesorot, {to od edna strana odzema vreme, a od druga strana vra}a na podigawe na sistemot. Podigaweto na sistemot se izbegnuva so poraka na BIOS-ot za namenata na resetiraweto, no toa pobaruva dodatno vreme. Zna~i, ako se raboti so procesor 80286, upotrebata na ovaa funkcija e dvojna osven na IBM PS/2 sistemi ~ija dodatna elektronika se gri`i za vra}aweto vo realen mod. Procesorite 80386 i 80486 pobrzo i poednostavno go re{avaat prefrlaweto od realen vo za{titen mod i obratno i kaj niv ne se javuvaat vakvi problemi. Direktnata upotreba na prekinot 15N na funkcijata 87N pri~inuva i kolizii, zatoa {to sekoja programa ja koristi celata prodol`ena memorija. So funkcijata 88N programata se snabduva so podatoci za vkupnata prodol`ena memorija, no ne ka`uva ni{to za eventualnata zafatenost na del od taa memorija od strana na nekoja druga programa kako naprimer programa za ke{irawe na diskot i sli~no. Za da mo`at programite simultano da koristat prodol`enata memorija i za da se stvori konzistentnost me|u programite za upotreba na prodol`enata memorija, proizveduva~ite Microsoft, Intel, Lotus, AST Research vo 1988. Godina objavile XMS standard (Extended Memory Specifications). XMS ovozmo`uva slednite pristapi do prodol`enata memorija:
XMS pogonskite programi ovozmo`uvaat na programerite pristap do prodol`enata memorija preku soodvetni funkcii. Prvo treba da se utvrdi dali e XMS pogonskata programa instalirana. Potoa se dostapni slednite funkcii za rabota so prodol`enata memorija:
Broj na funkcijata Opis
00N Opredeluvawe na verzijata na XMS programata
01N Alocirawe na HMA
02N Osloboduvawe na HMA
03N Globalno uklu~uvawe na adresnata linija A20
04N Globalno isklu~uvawe na adresnata linija A20
05N Lokalno uklu~uvawe na adresnata linija A20
06N Lokalno isklu~uvawe na adresnata linija A20
07N Opredeluvawe na statusot na adres. linija A20
08N Opredeluvawe na koli~estvoto prod. memorija
09N Alocirawe na EMV
0AN Osloboduvawe na EMV
0AN Osloboduvawe na EMV
0VN Pomestuvawe na EMV
0SN Zaklu~uvawe na EMV
0DH Odklu~uvawe na EMV
0EN Informacii za EMV handle
0FH Modifikacija na alociraniot EMV
10N Alocirawe na UMB
11N Osloboduvawe na UMB
EXTRN PRINT_NMB:FAR ;Nadvoresna funkcija za ispisuvanje na broj,
;smestena vo ASMILB.ASM
@WR_STR MACRO STR ;Makro za ispisuvanje na string na ekran
MOV AH, 09H
MOV DX, OFFSET STR
INT 21H
ENDM
@WR_BR MACRO BROJ ;Makro za ispisuvanje na dvobajten broj
MOV AX, BROJ
CALL PRINT_NMB
ENDM
@WR_BR1 MACRO BROJ ;Makro za ispisuvanje na ednobajten broj
XOR AH, AH
MOV AL, BROJ
CALL PRINT_NMB
ENDM
@RD_KEY MACRO ;Makro za citanje znak od tastatura
MOV AH, 07H ;(ekvivalent na ReadKey)
INT 21H
ENDM
@KRAJ MACRO ;Makro za kraj
MOV AX,4C00H
INT 21H
ENDM
STACK SEGMENT STACK ;Stek segment
DB 128 DUP(0)
STACK ENDS
DATA SEGMENT ;Podatocen segment
ERR_NOERR EQU 00H
ERR_NOTIMPLEMENTED EQU 80H
ERR_VDISKFOUND EQU 81H
ERR_A20 EQU 82H
ERR_GENERAL EQU 8EH
ERR_UNRECOVERABLE EQU 8FH
ERR_HMANOTEXIST EQU 90H
ERR_HMAINUSE EQU 91H
ERR_HMAMINSIZE EQU 92H
ERR_HMANOTALLOCED EQU 93H
ERR_A20STILLON EQU 94H
ERR_OUTOMEMORY EQU 0A0H
ERR_OUTOHANDLES EQU 0A1H
ERR_INVALIDHANDLE EQU 0A2H
ERR_SHINVALID EQU 0A3H
ERR_SOINVALID EQU 0A4H
ERR_DHINVALID EQU 0A5H
ERR_DOINVALID EQU 0A6H
ERR_LENINVALID EQU 0A7H
ERR_OVERLAP EQU 0A8H
ERR_PARITY EQU 0A9H
ERR_EMBUNLOCKED EQU 0AAH
ERR_EMBLOCKED EQU 0ABH
ERR_LOCKOVERFLOW EQU 0ACH
ERR_LOCKFALL EQU 0ADH
ERR_UMBSIZETOOBIG EQU 0B0H
ERR_NOUMBS EQU 0B1H
ERR_INVALIDUMB EQU 0B2H
XMSPTR1 DW ?,?
XMSPTR2 DW ?
XMSERR DB ?
VERNR DW ?
REVNR DW ?
ERR DW ?
HMAT DB 'HMA Test - Please press a key to start the test...$'
EMBT DB 'EMB Test - Please press a key to start the test...$'
MEML DB 'Memory location :$'
ER DB ' ERROR ! $'
HMAOK DB 'HMA O.K., no defective memory location.$'
HMANO DB 'ATTENTION: No access to HMA possible.$'
TOTF DB 'Total size of free extended memory (incl. HMA): $'
LENF DB ' Lengest free blok: $'
KB DB ' KB $'
STA DB 'Sart address = $'
KBA DB ' KB allocated. $'
HAN DB 'Handle = -$'
KBT DB 'KB Test : $'
XMSP DB 'XMS demo $'
ACC DB 'Access to HMA possible.$'
NOA DB 'No access to HMA.$'
TOC DB '.$'
TOC2 DB ':$'
XMSV DB 'XMS version number : $'
REVN DB 'Revision number : $'
NOX DB 'No XMS driver instaled! $'
EMBOK DB 'EMB ok, none of the tested 1K blocks were defective $'
ATT DB 'ATTENTION ! $'
DEF DB 'defective 1K blocks detected in EMB $'
NULA DB '0$'
NULA2 DB '00$'
BR DW ?
MI DW 16 DUP(0)
;BR DW ?
BR1 DW ?
BR2 DB ?
TOTFREE DW ?
MAXBL DW ?
HANDLE DW ?
HANDLE1 DW ?
NL DB 13,10,'$'
BAR DW 1024 DUP(0)
DATA ENDS
CODE SEGMENT PARA PUBLIC 'CODE' ;Programski segment
ASSUME CS:CODE, DS:DATA, SS:STACK, ES:DATA
POC: MOV BX, DATA
MOV DS, BX
@WR_STR XMSP
@WR_STR NL
@WR_STR NL
CALL XMSINIT ;Povik na funkcija sto inicijalizira XMS-ot
CMP AX, 00H
JZ L1
CALL XMSQUERYVER ;Povik na funkcija sto ja opredeluva
;na upravuvackata programa
CMP DX, 00H
JZ L2
@WR_STR ACC
@WR_STR NL
JMP L3
L2: @WR_STR NOA
@WR_STR NL
L3: @WR_STR XMSV
MOV AX, VERNR
MOV BL, 64H
DIV BL
PUSH AX
MOV BR2, AL
@WR_BR1 BR2
@WR_STR TOC
POP AX
MOV BR2,AH
CMP AH, 00H
JE LG1
@WR_BR1 BR2
JMP LG2
LG1: @WR_STR NULA
LG2: @WR_STR NL
@WR_STR REVN
MOV AX, REVNR
MOV BL, 64H
JMP LP1
L1: JMP L111
LP1: DIV BL
PUSH AX
MOV BR2, AL
@WR_BR1 BR2
@WR_STR TOC
POP AX
MOV BR2,AH
@WR_BR1 BR2
@WR_STR NL
CALL HMATEST ;Povik na funkcija sto ja provruva gornata
;memorija
@WR_STR NL
CALL EMBTEST ;Povik na funkcija sto ja proveruva
;prodolzenata memorija
JMP LP2A
L111: @WR_STR NOX
LP2A: @KRAJ
;Funkcija za inicijalizacija na XMS-ot. Mora da se povika pred povik na bilo
;koja funkcija za rabota so prodolzenata memorija
;Vlez: nema
;Izlez: XMSPTR1 pokazuvac na adresata na kontrolnata programa
; AX=00H ako se e vo red
; AH=01H ako ima greska
; XMSERR kod na greskata
XMSINIT PROC NEAR
MOV AX, 4300H
INT 2FH
CMP AL, 80H
JNZ LAB1
MOV AX, 4310H
INT 2FH
MOV WORD PTR [XMSPTR1], BX
MOV WORD PTR [XMSPTR1 +2], ES
MOV AL, ERR_NOERR
MOV XMSERR, AL
MOV AX, 01H
JMP LAB2
LAB1: MOV AX, 00H
LAB2: NOP
RET
XMSINIT ENDP
;Funkcija za povikuvanje na funkcijata za rabota so prodolzenata memorija
;Vlez: AH broj na funkcijata
; BX, DX, SI, ES POTREBNI REGISTRI
;Izlez: AH=01H ako se e vo red
; AH=00H ako ima greska
; XMSERR kod na greskata
XMSCALL PROC NEAR
MOV CX, DS
PUSH CX
PUSH AX
MOV AX, 5BCCH
MOV DS, AX
POP AX
MOV ES, CX
CALL DWORD PTR ES:[XMSPTR1]
POP DS
CMP AX, 00H
JE LAB01
JMP LAB03
LAB01: CMP BX, 80H
JGE LAB02
JMP LAB03
LAB02: MOV XMSERR, BL
JMP LAB04
LAB03: PUSH AX
MOV AL, ERR_NOERR
MOV XMSERR, AL
POP AX
LAB04: NOP
RET
XMSCALL ENDP
;Funkcija za opredeluvanje na verzijata na XMS upravuvackata programa i
;poslednata revizija na taa programa
;Vlez: nema
;Izlez: VERBR broj na verzijata
; REVNR broj na revizijata
XMSQUERYVER PROC NEAR
MOV AH, 00H
CALL XMSCALL
PUSH DX
MOV CX, AX
XOR AX, AX
MOV AL, CH
MOV DL, 64H
MUL DL
MOV VERNR, AX
XOR AX, AX
MOV AL, CL
PUSH CX
MOV CL, 04H
SHR AL, CL
MOV DL, 0AH
MUL DL
ADD VERNR, AX
POP CX
AND CL, 0FH
XOR CH, CH
ADD VERNR, CX
XOR AX, AX
MOV AL, BH
MOV DL, 64H
MUL DL
MOV REVNR, AX
XOR AX, AX
MOV AL, BL
MOV CL, 04H
SHR AL, CL
MOV DL, 0AH
MUL DL
ADD REVNR, AX
AND BL, 0FH
XOR BH, BH
ADD REVNR, BX
POP DX
RET
XMSQUERYVER ENDP
;Funkcija za kopiranje na 1024 B na opredelena memoriska lokacija
;Vlez: BAR pomestuvanjeto na lokacijata
; AH vrednosta na znakot
;Izlez: nema
FILLCHAR PROC NEAR
MOV SI, OFFSET BAR
MOV CX, 400H
OZ1: MOV [SI], AH
INC SI
LOOP OZ1
RET
FILLCHAR ENDP
;Funkcija za provrka na pristapot i rabota so gornata memorija
;Vlez: nema
;Izlez: nema
HMATEST PROC NEAR
@WR_STR HMAT
@RD_KEY
MOV DX, 0FFFFH ;Alociranje na gornata memorija
MOV AH, 01H
CALL XMSCALL
CMP AX, 00H
JZ LA1
JMP LA2
LA1: JMP LA10
LA2: MOV AH, 07H ;Opredeluvanje na statusot na A20 handlerot
CALL XMSCALL
CMP AX, 01H
JZ LA3
XOR AX, AX
JMP LA4
LA3: MOV AX, 01H
LA4: PUSH AX
CMP AX, 00H
JNZ LA5
MOV AH, 03H ;Uklucuvanje na A20 linijata za da bide
CALL XMSCALL ;ovozmozen direkten pristap do prod. mem.
LA5: MOV ERR, 00H
MOV SI, 10H
@WR_STR NL
@WR_STR MEML
XOR CX, CX
LA6: MOV BR, SI
;SUB BR, 000FH
PUSH SI
;@WR_BR BR
;@WR_STR NL
JMP LP2
LA10: JMP LA110
LP2: MOV DX, 0FFFFH
MOV ES, DX
MOV AX, BR
XOR DX, DX
MOV BX, 100H
DIV BX
POP SI
MOV ES:[SI], DL
CMP ES:[SI], DL
JZ LA7
INC CX
INC SI
@WR_STR ER
INC ERR
LA7: INC SI
INC CX
CMP CX, 0FFF0H
JL LA6
MOV CX, 0FFF0H
MOV BR, CX
@WR_BR BR
@WR_STR NL
MOV AH, 02H ;Osloboduvanje na alociranata memorija.
CALL XMSCALL ;Pri zavrsuvanjeto na programta alociranata
;memorija mora da se oslobodi
POP AX
CMP AX, 00H
JNZ LA8
MOV AH, 04H ;Isklucuvanje na A20 linijata
CALL XMSCALL
LA8: CMP ERR, 00H
JNZ LA9
@WR_STR HMAOK
JMP LA111
LA9: ;@WR_STR HMANO
LA110: @WR_STR NL
@WR_STR HMANO
LA111: NOP
RET
HMATEST ENDP
;Funkcija za proverka i rabota so prodlozenata memorija
;Vlez: nema
;Izlez: nema
EMBTEST PROC NEAR
@WR_STR EMBT
@RD_KEY
MOV AH, 08H ;Opredeluvanje na vkupnoto kolicestvo na
CALL XMSCALL ;prodolzena memorija i najgolemiot sloboden
MOV TOTFREE, AX ;blok vo KB
MOV MAXBL, DX
@WR_STR NL
@WR_STR TOTF
@WR_BR TOTFREE
@WR_STR KB
@WR_STR NL
@WR_STR LENF
@WR_BR MAXBL
@WR_STR KB
@WR_STR NL
SUB TOTFREE, 40H
MOV AX, TOTFREE
CMP MAXBL, AX
JL LB1
SUB MAXBL, 40H
LB1: CMP MAXBL, 00H
JE LB700
MOV DX, MAXBL ;Alociranje na blok od prodolzenata memorija
MOV AH, 09H ;so odredena dolzina
CALL XMSCALL
MOV HANDLE, DX
@WR_BR MAXBL
@WR_STR KBA
@WR_STR NL
@WR_STR HAN
MOV DX, HANDLE
XOR DX, 0FFFFH
INC DX
MOV HANDLE1, DX
@WR_BR HANDLE1
@WR_STR NL
MOV DX, HANDLE ;Zaklucuvanje na blok od prodolzenata mem.
MOV AH, 0CH ;taka da upravuvackata programa ne moze so
CALL XMSCALL ;nego da raboti
PUSH BX
PUSH DX
MOV DX, HANDLE ;Odklucuvanje na zaklucen blok od prodol.
MOV AH, 0DH ;memorija
CALL XMSCALL
@WR_STR STA
@WR_STR NULA2
POP DX
MOV BR, DX
@WR_BR BR
@WR_STR TOC2
JMP LB8
LB700: JMP LB70
LB8: POP BX
@WR_STR NULA2
MOV BR1, BX
@WR_BR BR1
@WR_STR NL
MOV ERR, 00H
XOR CX, CX
@WR_STR KBT
LB2: MOV BR, CX
PUSH CX
INC BR
MOV AX, CX
MOV BL, 0FFH
DIV BL
CALL FILLCHAR
MOV SI, OFFSET MI
PUSH ES
MOV AX, 5BCCH
MOV ES, AX
MOV AX, 400H
MOV WORD PTR ES:[SI], AX
XOR AX, AX
MOV WORD PTR ES:[SI+02], AX
MOV WORD PTR ES:[SI+04], AX
MOV DX, OFFSET BAR
MOV WORD PTR ES:[SI+06], DX
MOV WORD PTR ES:[SI+08], AX
MOV AX, HANDLE
MOV WORD PTR ES:[SI+0AH], AX
MOV AX, CX
MOV BX, 400H
MUL BX
MOV WORD PTR ES:[SI+0CH], AX
MOV WORD PTR ES:[SI+0EH], DX
POP ES
PUSH CX
MOV AH, 0BH ;Kopiranje na sodrzinata na memoriskiot blok
CALL XMSCALL ;od prodolzenata memorija vo konvencijanata
;memorija
MOV AH, 0FFH
CALL FILLCHAR
POP CX
MOV SI, OFFSET MI
PUSH ES
MOV AX, 5BCCH
MOV ES, AX
MOV AX, 400H
MOV WORD PTR ES:[SI], AX
XOR AX, AX
MOV WORD PTR ES:[SI+02], AX
JMP LB9
LB70: JMP LB7
LB20: JMP LB2
LB9: MOV AX, HANDLE
MOV WORD PTR ES:[SI+04], AX
MOV AX, CX
MOV BX, 400H
MUL BX
MOV WORD PTR ES:[SI+06], AX
MOV WORD PTR ES:[SI+08], DX
XOR AX, AX
MOV WORD PTR ES:[SI+0AH], AX
MOV DX, OFFSET BAR
MOV WORD PTR ES:[SI+0CH], DX
MOV WORD PTR ES:[SI+0EH], AX
POP ES
PUSH CX
MOV AH, 0BH ;Kopiranje na sodrzinata na memoriskiot blok
CALL XMSCALL ;od prodolzenata memorija vo konvencional.
;memorija
POP CX
XOR BX, BX
MOV SI, OFFSET BAR
LB3: PUSH BX
MOV AX, CX
MOV BL, 0FFH
DIV BL
CMP [SI], AH
JNE LB4
INC ERR
MOV BX,41H
JMP LB5
LB4: POP BX
INC BX
INC SI
LB5: CMP BX, 400H
JL LB3
POP CX
INC CX
CMP CX, MAXBL
JL LB20
@WR_BR BR
@WR_STR NL
CMP ERR, 00H
JNE LB6
@WR_STR EMBOK
@WR_STR NL
JMP LB61
LB6: @WR_STR ATT
MOV AX, ERR
MOV BR, AX
@WR_BR BR
@WR_STR DEF
LB61: MOV DX, HANDLE ;Osloboduvanje na alocirana prodolzena mem.
MOV AH, 0AH
CALL XMSCALL
LB7: NOP
RET
EMBTEST ENDP
CODE ENDS
END POC