Document, comentariu, eseu, bacalaureat, liceu si facultate
Top documenteAdmitereTesteUtileContact
      
    


 


Ultimele referate adaugate

Adauga referat - poti sa ne ajuti cu un referat?

Politica de confidentialitate



Ultimele referate descarcare de pe site
  CREDITUL IPOTECAR PENTRU INVESTITII IMOBILIARE (economie)
  Comertul cu amanuntul (economie)
  IDENTIFICAREA CRIMINALISTICA (drept)
  Mecanismul motor, Biela, organe mobile proiect (diverse)
  O scrisoare pierduta (romana)
  O scrisoare pierduta (romana)
  Ion DRUTA (romana)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  Starea civila (geografie)
 

Ultimele referate cautate in site
   domnisoara hus
   legume
    istoria unui galban
   metanol
   recapitulare
   profitul
   caract
   comentariu liric
   radiolocatia
   praslea cel voinic si merele da aur
 
despre:
 
Modul protejat - sisteme de operare
Colt dreapta
Vizite: ? Nota: ? Ce reprezinta? Intrebari si raspunsuri
 

 

Notiuni generale

Setul de instructiuni ale microprocesoarelor Intel 80286,80386,80486, contine - pe linga instructiunile generale folosite in modelul real - si instructiuni pentru programare in modul protejat. In continurare prezentam mai mult despre instructiunile valabile pentru 80286, deoarece programele continind cod pentru g2v2vm
286 pot fi rulate pe 486 fara modificari. Diferenta esentiala intre modul real si modul protejat consta in modul de calculare a adreselor de memorie. In modul real, un 80286 este perfect compatibil cu 8086. In acest mod domeniul de adrese este de un 1Mo, adresa fizica calculindu-se ca la un 8086:

adresa_de_segment * 16 + deplasament

(Eventual mai putem accesa zona de memorie inalta (HMA) = 64Ko peste 1Mo).
Adresa de segment este continuta intr-un registru de segmente. Domeniul de adrese poate fi impartit pe segmente de memorie. Un segment incepe intotdeauna la o adresa multiplu de 16 (paragraf) si are o lungime fixa de 64Ko (fig 1)

memoria interna
ÚAAAAAAAAAAAAA¿ 0
ÚAAAAAAAAAAAAAAAAAA¿ * 16 ³ ³
³ adresa de baza AAAAAAAAA>AAAAAAAAAAAAAAa\
AAAAAAAAAAAAAAAAAAAÙ ³ ³ |
³ ³ |
ÚAAAAAAAAAAAAAAAAAA¿ ³ ³ | segment de
³adresa deplasamentAAAAAAAAA>AAAAAAAAAAAAAAa > 64 ko
AAAAAAAAAAAAAAAAAAAÙ ³ ³ |
³ ³ |
AAAAAAAAAAAAAAa/
³ ³
AAAAAAAAAAAAAAÙ 1 Mo fig 1

Si in modul protejat memoria poate fi impartita pe segmente. In acest caz fiecare segment are un descriptor de segment, care pe linga adresa fizica concreta a inceputului de segment contine lungimea segmentului si drepturile de acces la acesta. Registri de segment (selectorii) contin o referinta la un asemenea descriptor. Adresa tabelei de descriptori de segment este continuta in registrul
GDTR (Global Descriptor Table Register), LDTR (Local Descriptor Table Register) sau IDTR (Interrupt Descriptor Table Register). Adresa fizica se calculeaza cu urmatoararea formula:




adresa_de_segment_continuta_in_descriptor+adresa_de_deplasament

daca modul de lucru nu este paginat.(fig 2)

memoria interna
ÚAAAAAAAAAAAAA¿ 0
³ ³ ÚAAAAAAAAAAA¿
AAAAAAAAAAAAAAa\<AAAAAAa GDTR ³
ÚAAAAAAAAAAAAAAAAAA¿ ³ ³ | AAAAAAAAAAAAÙ
³ adresa selector AAAAAAAAA>AAAAAAAAAAAAAAa |
AAAAAAAAAAAAAAAAAAAÙ ÚAAAAAa ³ |
ÚAAAAAAAAAAAAAAAAAA¿ ³ ³ ³ | tabela de descriptori
³ adresa de baza ³<AAÙ AAAAAAAAAAAAAAa > de segmente
AAAAAAAAAAAAAAAAAAAÙ ³ ³ |
³ ³ ³ |
³ ³ ³ |
³ AAAAAAAAAAAAAAa/
³ ³ ³
AAAAAAAAAAAAAAAAAAAA>AAAAAAAAAAAAAAa\
³ ³ |
ÚAAAAAAAAAAAAAAAAAA¿ ³ ³ |
³adresa deplasamentAAAAAAAAA>AAAAAAAAAAAAAAa > segment de
AAAAAAAAAAAAAAAAAAAÙ ³ ³ | 1o-64ko la 286
³ ³ | 1o-1Mo la 386
AAAAAAAAAAAAAAa/
³ ³
AAAAAAAAAAAAAAÙ 16 Mo-1 Go fig 2

In modul lucru paginat (de la 80386 in sus) adresa fizica se obtine din adresa mai sus calculata cu ajutorul unor noi transformari. In cele ce urmeaza vom considera modul de lucru nepaginat. Ca expunerea sa fie completa trebuie sa amintim ca exista si un mod de lucru virtual 8086 in cadrul modului protejat, cind adresa fizica se calculeaza ca la modul real, programului fiindu-i transparent faptul ca lucreaza in modulul protejat sau nu.Acest mod care lipseste la 80286 a fost introdus de la 80386 in sus pentru a putea rula programe dezvoltate pentru
8086 paralel cu programe scrise pentru modul protejat, beneficiind in plus si de rigurozitatea protectiei ce li se pune la dispozitie. Acest mod se numeste mod virtual fiindca eventualele diferente intre modul real si cel protejat sunt rezolvate (simulate) pe cale soft.
Cum am aratat mai sus, registrii de segment contin niste selectori
(indecsi) in tabele de descriptori. La incarcarea unei valori intr-un registru de segment, procesorul incarca automat in partea inaccesibila programatorului din registrul de segment informatiile din descriptor referitoare la segment: adresa de inceput, lungimea, drepturi de acces si tipul segmentului (aceasta parte neaccesibila se mai numeste si registru cash).
Segmentul poate contine cod, data sau alte informatii (cum vom vedea mai tirziu), poate fi executat, se pot citi si (sau) scrie date in el, etc.
Modul protejat a fost implementat pentru regimul multitasking.In asemenea sisteme este deosebit de importanta viteza cu care se poate ceda executia de la un task la altul. Aceasta schimbare necesita salvari si restaurari de context (continutul tuturor registrilor folositi de task) ceea ce incepind cu 80286 se realizeaza pe cale hard. (pe cale soft acest lucru se poate realiza eventual folosind instructiunile
PUSH, POP, etc). Fiecare task are un TSS (task state segment) care are la rindul sau un descriptor de segment. Segmentul TSS contine date speciale: valorile registrilor microprocesorului folosit de task. Din acest segment se incarca valori in registrii procesorului in mod automat cand task-ul primeste controlul, tot in
TSS se salveaza continutul registrilor cind task-ul preda controlul unui alt task.
Folosirea task-ului este indicata insa nu obligatorie. Fiecare task, pe linga descriptorii generali continuti in GDT (global descriptor table) poate sa contina descriptorii proprii in tabel LDT (local descriptor table). Descriptorul LDT-ului este continut in GDT. Registrul LDTR contine selectorul acestui descriptor.
Pentru securitatea programelor sau task-urilor, la procesoarele Intel au fost implementate 4 nivele de prioritati. Un program sau task avand un anumit privilegiu poate acesa direct segmente mai putin sau egal privilegiate. Nivelul de privilegiu cel mai ridicat este nivelul 0. Programele sau task-urile de nivelul
0 pot accesa orice segment. La multe procesoare exista numai 2 nivele de privilegiu, nivelul supervisor (sistem) si user (utilizator). In cazul unei asemenea organizari apar probleme la extinderile sistemului de operare, in general probleme de protectie si de fiabilitate. Datorita diferentelor de importanta ce exista intre diferitele functii realizate de sistemele de operare, pentru functionarea sigura este nevoie de cel putin 3 nivele de protectie. La procesoarele in discutie, existenta celor
4 nivele asigura posibilitati superioare de protectie. Pe nivel 0 de obicei se ruleaza nucleul sistemului de operare (kernel). Rutinele de sistem si accesul la periferie se realizeaza pe nivelul 1 de protectie. Pe nivelul 2 se afla de obicei extensiile sistemului de operare, iar programele utilizator ruleaza pe nivelul 3.
Pentru apelul functiilor de sistem, care utilizeaza la rindul lor segmente mai privilegiate si se ruleaza cu un privilegiu mai ridicat, se folosesc "portile de apel" (GATE), care au la randul lor descriptor de porti (fig 3). memoria interna
ÚAAAAAAAAAAAAA¿ 0
³ ³ ÚAAAAAAAAAAA¿
AAAAAAAAAAAAAAa\<AAAAAAa IDTR ³
³ ³ | AAAAAAAAAAAAÙ
(INT numar) AAAAAAAA>AAAAAAAAAAAAAAa |
ÚAAAAAAAAAAAAAAAAAAAAa descriptor ³ |
³ ³ poarta ³ > tabela de descriptori
³ ÚAAAAAAAAAAAAAAAAAAAa | de intreruperi
³ ³ ³ ³ |
³ ³ AAAAAAAAAAAAAAa/
³ ³ ³ ³ ÚAAAAAAAAAAA¿
³ ³ AAAAAAAAAAAAAAa\<AAAAAAa GDTR ³
³ ³ ³ ³ | AAAAAAAAAAAAÙ

³ AAAAA>AAAAAAAAAAAAAAa |
³ ÚAAAAAa descriptor ³ | tabela de descriptori
³ ³ ³ segment ³ > de segmente
³ ³ AAAAAAAAAAAAAAa |
³ ³ ³ ³ |
³ ³ AAAAAAAAAAAAAAa/
³ ³ ³ ³
³ AAAAA>AAAAAAAAAAAAAAa\
\³/ ³ ³ |
ÚAAAAAAAAAAAAAAAAAA¿ ³ ³ |
³adresa deplasamentAAAAAAAAA>AAAAAAAAAAAAAAa > segment de cod de
AAAAAAAAAAAAAAAAAAAÙ ³ ³ | 1o - 1 Mo
³ ³ |
AAAAAAAAAAAAAAa/
³ ³
AAAAAAAAAAAAAAÙ 16 Mo-1 Go fig 3

Selectori si descriptori

Modul cum arata un registru segment se poate urmari pe fig 4. Valoarea selectorului se reprezinta pe 14 biti si, in functie de valoarea bitului
TI (table indicator), indica o intrare in GDT (TI=0) sau in LTD (TI=1).
RPL (Request Privilege Level) este nivelul de privilegiu cerut. Putem avea acces la un descriptor daca valoarea din RPL este mai mica sau egala cu valoarea din
DPL (Demand Privilege Level), care, dupa cum vom vedea la descrierea descriptorilor, este nivelul de privilegiu al segmentului). CPL (Curent Privilege Level) are acceasi valoare cu RPL din CS, si reprezinta nivelul la care ruleaza programul.

16 2 1 0
ÚAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¿
³ valoare selector ³ TI ³ RPL ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÙ fig 4

Descriptori de segmente (date si cod)

Modul cum arata un descriptor de segment se poate urmari in fig 5.

16 0
ÚAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¿\
³ limita 0-15 ³ |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa > pentru 286
³ adresa de baza 0-15 ³ |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa/
³P³DPL³T³ TIP ³adresa de baza 16-23³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³adr baza 24-31 ³G³B³O³A³limita 16-23³la 286 se pune 0 pt compatibilitate
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÙ fig 5

limita - lungimea segmentului in octeti. adresa de baza - adresa de baza a segmentului.
P - bit de prezenta (daca este 1 apeleaza o intrerupere)
DPL - privilegiu de acces la un segment.
T - 1 pentru descriptorii de segment de data si de cod.
-0 pentru descriptori de sistem (de LDT, de TSS) descriptori de porti.
TIP (pe 3 biti):
La segmente de cod:
-bit-ul 3 - E (executable) - trebuie sa fie intotdeauna 1
-bit-ul 2 - C (conforming) - daca este 1 se pot executa segmente cu
DPL < CPL, iar CPL nu se schimba; daca este 0 se pot executa numai segmente pentru care CPL = DPL (se foloseste la executarea extensiilor sistemelor de operare de catre programe utilizator)
-bit-ul 1 - R (readable) - daca este 1 se pot citi datele din segment altfel se pot incarca numai instructiuni
La segmente de date:
-bit-ul 3 - E - trebuie sa fie intotdeauna 0
-bit-ul 2 - ED (expantion direction) - daca este 1 segmentul creste spre adrese mici
-bit-ul 1 - W (writeable) - daca este 0 se pot citi date din segment
B - daca este 0 dimensiunea implicita a operantiilor este de 32 biti (explicit se poate schimba la fiecare instructiune)
A - daca este 1 segmentul a fost accesat
G (granularitate) - daca este 1, elementul de schimb cu memoria este pagina; daca este 0, elementul de schimb cu memoria este octetul (se foloseste la modul de lucru paginat)

Descriptori de sistem

Descriptorii LDT-ului si TSS-ului sunt astfel de descriptori. Un descriptor de sistem seamana foarte mult cu un descriptor de segment (cod sau date), dar difera numai octetul 5. In cazul descriptorilor sistem, acesta are urmatorul continut:
-bitii 0-3: indica tipul descriptorului, valoarea 2 indica descriptor LDT, valoarea 1 sau 3 indica descriptor TSS (1 segmentul TSS disponibil, 3-segmentul
TSS ocupat)
-bitul 4: este intotdeauna 0
-bitii 5-6: DPL, descriptorul poate fi accesat numai daca CPL<=DPL
-bitul 7: P (present), ca la descriptorii de cod sau date.

Descriptori de porti

16 0
ÚAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¿
³ deplasament ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ selector ³ XX ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³P³DPL³0³ TIP ³ XXX ³ nr. cuvinte ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ valoare $0000 ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÙ fig 5

deplasament - deplasamentul in cadrul segmentului unde se face saltul selector - selectorul in tabela GDT sau LDT al descriptorului de segment de cod
TIP - valoarea 4 indica poarta CALL; valoarea 5 indica poarta TASK, valoarea 6 indica poarta INTERRUPT, valoarea 7 indica poarta, TRAP; nr. cuvinte - numarul de cuvinte ce se va copia pe noua stiva (la fiecare nivel de prioritate se lucreaza cu o stiva separata).

Tabele de descriptori

Tabelele de descriptori pot fi manipulate cu ajutorul instructiunilor
LIDT,LGDT,LLDT (incarcare in registri din memorie), respectiv SIDT, SGDT, SLDT
(incarcare in memorie din registrii).

Sistemul de intrerupere

La modul protejat incercarile de a efectua operatii nepermise se soldeaza cu executia unor intreruperi. De la 80286 in sus apar urmatoarele intreruperi procesor (generate de microprocesor):
8 - exceptie dubla
9 - segmentul coprocesorului a fost depasit
10 - TSS gresit
11 - nu exista segment in memorie (bitul P= 0)
12 - segmentul SS este depasit sau nu exista
13 - violarea drepturilor de protectie (de ex. depasirea limitelor tabelelor, segmentelor, instructiuni I/O neaccesibile, etc.)

Datorita faptului ca unele din aceste intreruperi se suprapun cu intreruperile hard din modul real, la intrarea in modul protejat este necesara o reinitializare a sistemului de intreruperi. La intreruperile mai sus amintite (in afara de intreruperea 9) valoarea IP-ului salvata pe stiva se refera la instructiunea ce a generat eroarea. Acest lucru ne permite o eventuala inlaturare a cauzei erorii si repetarea instructiunii in cauza. La intreruperile 8, 9, 10, 11, 12,
13, pe linga registrii salvati pe stiva in mod obisnuit, se va depune si un cuvant de eroare (error-code). Daca s-a schimbat stiva (s-a schimbat nivelul de prioritate), cuvantul de eroare va fi in stiva cea noua.
Continutul cuvantului de eroare : bitul 0: - are valoarea 0 daca eroarea a fost provocata de o prelucrare normala; are valoarea
1: - daca eroarea a aparut in momentul tratarii unei intreruperi externe programului (NMI,INTR, depasire segment la coprocesor, coprocesor ocupat, intrerupere TRAP); bitii 1-2: - au valoarea 1 sau 3 daca partea de selector din cuvantul de eroare indica spre tabele IDT; au valoarea 0 daca selectorul indica spre tabela GDT si respectiv 2 daca selectorul indica spre LDT; bitii 3-15: - contin selectorul care a cauzat eroarea. In cazul unor erori selectorul din codul de eroare are valoarea 0, ceea ce semnalizeaza intreruperii faptul ca nu se poate realiza corectarea erorii si reluarea executiei.
La intreruperea 8, intodeauna se depune valoarea 0. Se stie ca incarcarea unui selector cu 0 nu provoaca eroare, insa folosirea lui la calculul adreselor provoaca intreruperea 13.

Exemplu de program

Programul prezentat contine trei parti: trecerea in modul protejat, o parte de exemplificare (apelarea unor intreruperi, etc) si revenirea in modul real. Principala greutate la programarea in modul protejat se datoreaza lipsei rutinelor BIOS si DOS care in schimb exista in modul real. Programarea tastaturii, ecranului etc. trebuie realizata de noi. O problema si mai mare este lipsa intreruperilor 8, 9, 10, 11, 12, 13, in absenta carora depistarea erorilor devine aproape imposibila. Inhibarea intreruperilor cu STI, duce eventual la realizarea unor afisari pe ecran sau copieri date din memoria de peste 1Mo.
Cea mai buna solutie este implementarea unui set minim de intreruperi cu care se poate lucra. Programul porneste de la pregatirea tabelelor de descriptori
GDT si IDT (pregatirea unei tabele LDT se realizeaza asemanator pregatirii GDT-ului).
Se realizeaza calculul adreselor de baza de 24 biti (32 la 80386) si calculul limitelor segmentelor. Apoi se completeza intrarile in tabele si se pregateste adresa de revenire in modul real. Se scrie in memoria CMOS comanda de pornire dupa starea SHUTDOWN (se stie ca starea SHUTDOWN poate fi inlaturat de un RESET sau NMI).
Se salveaza starea controloarelor de intreruperi. Se incarca inceputurile tabelelor
GDT si IDT. Pentru a fi siguri ca instructiunile LGDT si LIDT sunt corect generate de orice asamblor, se depune direct codul lor masina cu directive DB. Se intra in modul protejat cu ajutorul instructiunilor:
MOV AX,1
LMSV AX.
Se incarca selectorii in registrii de segment. Se reinitializeaza controlorii de intreruperi hard (8259) pentru a inlatura conflictul cu intreruperilor procesorului.
Apelurile (JUMP FAR, CALL FAR, INT numar) sint din motive explicative.
Se arata si modul de functionare a intreruperii hard a tastaturii. Se iese din modul modul protejat, prin comanda SHUTDOWN. La revenirea in modul real registrii de segment se refac (revenirea s-ar fi putut realiza mai usor cu :
MOV AX,0
LMSW AX de la 80386 in sus).

.286p
Intrare_Descriptor struc ; structura unui descriptor de segment
Lungime dw 0 ; lungimea segmentului
AdresaL dw 0 ; adresa 0-15
AdresaH dw 0 ; adresa 16-24
Tip dw 0 ; tipul segmentului
Rezervat386 dw 0
Intrare_Descriptor ends
Port_Stare_8042 equ 064h ; port stare al lui 8042
Comanda_Shutdown equ 0feh ;
Descriptor_Date equ 93h
Descriptor_Cod equ 9bh
Port_Date_8259A equ 021h
Port_Date_8259B equ 0a1h
Descriptor_Intr equ 86h
Descriptor_Call equ 85h
Descriptor_Trap equ 87h
CSeg segment para public 'code' assume cs:CSeg, ds:CSeg
; Tabela globala de descriptori even gdt label gword
; descriptor nul
Ind_Null Intrare_Descriptor <0,0,0,0,0>
; descriptor de date pt. DS
Ind_Ds Intrare_Descriptor <0,0,0,0,0>
; descriptor de date pt. ES
Ind_Bios Intrare_Descriptor <0,0,0,0,0>
; descriptor de date pt. SS
Ind_Ss Intrare_Descriptor <0,0,0,0,0>
; descriptor de date pt. CS
Ind_Cs Intrare_Descriptor <0,0,0,0,0>
Ind_Gen_Int Intrare_Descriptor <0,0,0,0,0>
Ind_Int_9 Intrare_Descriptor <0,0,0,0,0>
; descriptor pt. segmentul de cod folosit de int 9
GDT_Lg equ $-gdt
; descriptoru tabelei globale
Ind_Idt Intrare_Descriptor <GDT_Lg,0,0,0,0>
; descriptorul tabelei de intreruperi
Ind_Idt Intrare_Descriptor <IDT_Lg,0,0,0,0>
; selectorii descriptorilor
Sel_Ds equ 08h
Sel_Bios equ 10h
Sel_Ss equ 18h
Sel_Cs equ 20h
Sel_Gen_Int equ 28h
Sel_Int_9 equ 30h even idt label gword rept 9
Intrare_Descriptor <offset general_int,Sel_Gen_Int,0,Descriptor_Intr,> endm
Intrare_Descriptor <offset intrerupt_9,Sel_Int_9,0,Descriptor_Intr,> rept 256
Intrare_Descriptor <offset general_int,Sel_Gen_Int,0,Descriptor_Intr,> endm idt_Lg equ $ - IDT salt_mod_protejat label dword salt_p_ofs dw offset mod_protejat salt_p_seg dw Sel_Cs
Stare_8259A db ?

Stare_8259B db ? text1 db 'Santem in modul protejat',0 text2 db 'Intrerupere oarecare',0 text3 db 'Intreruperea de tastatura',0
; date cu care vor fi initializate controlorii de intrerupere hard
Init_Date_Master db 20h, 11h, 04h, 5h, 01h
Init_Date_Slave db 0aoh, 11h, 02h, 01h, 01h
Start: cld push cs pop ds
; testam daca calculatorul este in modul protejat (de exemplu:
; Windows), daca da iesim din program, fiindca oricum nu
; putem executa insructiuni ,LIDT,LGDT,LTR,LMSW,CTS sau HLT
; neavand privilegiul
; smsw ax
; preluam valoarea din cuvintul de stare db 0fh, 01h, 0e0h and ax,1 jz nu_suntem mov ax, 4c00h int 21h nu_suntem : ; pregatire descriptor GDT mov cx, offset gdt mov ax, cs call Calc_Adr_Fiz_Seg mov Ind_Gdt.AdresaL, cx mov Ind_Gdt.adresaH, al mov Ind_Gdt.Lungime, 0ffffh mov Ind_Gdt.Tip,Descriptori_Cod
; pregatire descriptor IDT mov cx, offset idt mov ax, cs call Calc_Adr_Fiz_Seg mov Ind_Idt.AdresaL, cx mov Ind_Idt.AdresaH, al
; pregatire descriptori de date pt. DS mov cx, 0 mov ax, cs call Calc_Adr_Fiz_Seg mov Ind_DS.AdresaL, cx mov Ind_DS.AdresaH, al mov Ind_DS.Lungime, 0ffffh mov Ind_DS.Tip,Descriptor_Date
; pregatire descriptor de cod pt. CS mov Ind_CS.AdresaL, cx mov Ind_CS.AdresaH, al mov Ind_CS.Lungime, 0ffffh mov Ind_CS.Tip,Descriptor_Cod
; pregatire descriptor de stiva mov cx, 0 mov ax, ss call Calc_Adr_Fiz_Seg mov Ind_SS.AdresaL, cx mov Ind_SS.AdresaH, al mov Ind_SS.Tip,Descriptor_Date mov Ind_SS.Lungime, 0ffffh mov Ind_SS.Tip,Descriptor_Date
; pregatire descriptor pt. acces la
; memorie ecran mov Ind_Bios.AdresaL, 8000h mov Ind_Bios.AdresaH, 0bh mov Ind_Bios.Lungime, 0ffffh mov Ind_Bios.Tip,Descriptor_Date
; pregatire descriptor de porti pentru
; apelul intreruperilor mov cx, 0 mov ax, cs call Calc_Adr_Fiz_Seg mov Ind_Gen_Int.AdresaL, cx mov Ind_Gen_Int.AdresaH, al mov Ind_Gen_Int.Lungime, Offffh mov Ind_Gen_Int.Tip,Descriptor_Cod mov Ind_Int_9.AdresaL, cx mov Ind_Int_9.AdresaH, al mov Ind_Int_9.Lungime, Offffh mov Ind_Int_9.Tip,Descriptor_Cod
; salvare stare intreruperi cli in al, Port_Date_8259A mov Stare_8259,AL in al, Port_Date_8259B mov Stare_8259B,AL
; Depunem adresa de revenire in mod
; real la adresa 0400:0067 push es push di mov dx,040h mov ex,dx mov di,67h mov ax, offset modreal stosw pop di pop es
; Depunem comanda "salt far"(5) in
; registrul shutdown(15) in memoria CMOS mov al, 0fh out 70h, al jmp $ + 2 mov al, 5 out 71h, al assume DS: CSeg
; intreruperile hard generate de 8259A
; vor fi intreruperile 8-15 mov dl, 00001000B mov si, offset Init_Date_Master call Init_Controlor_8259
; intreruperile hard generate de 8259B
; vor fi intreruperi 24 - 31 mov dl, 00011000b mov si, offset Init_Date_Slave call Init_Controlor_8259
; incarcare tabela idt
; litd pword ptr Ind_Int db 2eh, 0fh, 01h, 1eh dw offset Ind_Idt
; incarcare tabela gdt
; lgdt pwodr ptr Ind_Gdt db 2eh, 0fh, 01h, 16h dw offset Ind_Gdt
; trecem procesorul in modul protejat prin
; incarcarea cu 1 a registrului de stare mov ax, 1
; lmsw ax db 0fh,01h,0f0h
; se va incarca in CS un selector corect
; registrul CS inaintea efectuarii acestei
; instructiuni contine vechea adresa de segment jmp dword ptr salt_mod_protejat assume DS:CSeg mod_protejat:
; se incarca valori si in celelalte registre
; folosind valori imediate
; cu ajutorul lui CS utilizat la calculul adreselor
; se pot efectua mov ax, Sel_Ss mov ss, ax mov ax, Sel_Ds mov ds, ax mov ax, Sel_Bios mov es, ax call Sterge_Ecran mov ax, Sel_Ds mov ds, ax mov si, offset text1 mov dx, 15 mov bx, 50 call Afisare_Text mod dx, 20 cic 4: mov cx, 0ffffh cic 0: sub cx, 1 cmp cx, 0 jne cic, 0 sub dx, 1 cmp dx, 0 gne cic 4 sti int 40h vtl: jmp vtl ;pt. asteptarea unei taste jmp Oprire_Procesor assume CS: CSeg, DS: CSeg modreal: mov dx, cs mov ds, dx mov al, Stare_8259A out Port_Date_8259,al mov al, stare_8259B out Port_Date_8259B,al sti
; terminare program mov ax,04c00h int 21h geno: ; intreruperea ce se apeleaza in general general_int proc far call Sterge_Ecran mov ax, Sel_Ds mov ds, ax mov si, offset text2 mov dx, 15 mov bx, 50 call Afisare_Text iret general_int endp
; intreruperea care se apeleaza la violarea
; drepturilor de acces la segmente, violarea
; drepturilor de acces la porturi I/O intrerup_9 proc far in al, 60h in al, 61h mov ah, a1 or a1, 80h out 61h, a1 mov a1,20h out 20h, a1 call Sterge_Ecran mov ax, Sel_Ds mov ds, ax mov si, offset text3 mov dx, 15 mov bx, 50 call Afisare_Text jmp Oprire_Procesor intrerupt_9 endp

Init_Controlor_8259 proc near cld xor ah, ah lodsb xchg dx, ax outsb inc dx out dx, a1 mov cx, 3 cic1: loop cic1 ret
Init_Controlor_8259 endp
Sterge_Ecran proc near push es mov ax, Sel_Bios mov es, ax mov cx, 4000 mov ah, ' ' mov al, 0 rep stosw pop es ret
Sterge_Ecran endp
; Textul ce se va afisa este selectat de perechea DS:DI,
; caracterul null incheie textul DX indica linia,BX indica
; coloana
Afisare_Text proc near
; se calculeaza pozitia unde se afiseaza textul shl dx, 1 mov ax, 80 mul dx add ax, bx mov di, ax mov ax, Sel_Bios mov es, ax cic2: ; afisare text pe ecran lodsb cmp al, 0h je sfirsit_text stosb mov al, 27h stosb jmp cic2 sfirsit_text: ret
Afisare_Text endp
; Adresa este continuta in AX:CX
; Rezultatul va fi depus in AL:CX
Calc_Adr_Fiz_SEG proc near mov dx, 16 mul dx add ax, cx xchg ax, cx xor ax, ax adc ax, dx ret
Calc_Adr_Fiz_Seg endp
Oprire_Procesor : mov al, Comanda_Shutdown out Port_Stare_8042, al
Cont_3 hlt jmp short Cont_3

CSeg ENDS
Sseg segment para stack 'STACK' date_stiva dw 200h dup(0)
Sseg ends end Start


Colt dreapta
Creeaza cont
Comentarii:

Nu ai gasit ce cautai? Crezi ca ceva ne lipseste? Lasa-ti comentariul si incercam sa te ajutam.
Esti satisfacut de calitarea acestui document, eseu, cometariu? Apreciem aprecierile voastre.

Nume (obligatoriu):

Email (obligatoriu, nu va fi publicat):

Site URL (optional):


Comentariile tale: (NO HTML)


Noteaza documentul:
In prezent fisierul este notat cu: ? (media unui numar de ? de note primite).

2345678910

 
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite
Colt dreapta