UNIVERZITET "Sv. Kiril i Metodij"

Prirodno matemati~ki Fakultet - Skopje

Institut za Informatika

 

SEMINARSKA RABOTA

 

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

Pro{irena memorija

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


Rabota so pro{irenata 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`ena memorija

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.

Rabota so prodol`enata mamorija

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:

  1. Pristap do gornite memoriski podra~ja (HMA - High Memory Area) {to po~nuva od 1 MV i ima dol`ina 64 KV (do 1088 KV).
  2. Pristap preku blokovi od prodol`enata memorija, {to gi ima vkpno ~etiri, a zapo~nuva od 1088 KV. Obi~no se ozna~uvaat so EMV (Exstended Memory Blocks).
  3. Pristap preku gornite memoriski blokovi (UMB - Upper Memory Blocks) {to se nao|aat vo granici od 640 KB do 1MV.

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

Vo programite {to ja koristat prodol`enata memorija se prepora~uva da se koristat funkcii od XMS pogonskata programa. Na toj na~in se izbegnuvaat kolizii, aprogramiraweto e konzistentno i ednostavno. Sledniot primer pka`uva upotrebata na osnovnite funkcii za rabota so prodol`enata memorija.

Listing 2. XMS.ASM Listing na asembler programa za rabota so prodol`ena 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 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