240 likes | 456 Views
Programare in limbaj de asamblare. Tehnici de programare. Accesul la resursele unui sistem de calcul. resursele unui sistem de calcul: hardware: registre, indicatoare de conditie (flaguri) memorie, interfete si dispozitivede intrare/iesire, sistemul de intreruperi,
E N D
Programare in limbaj de asamblare Tehnici de programare
Accesul la resursele unui sistem de calcul • resursele unui sistem de calcul: • hardware: • registre, indicatoare de conditie (flaguri) • memorie, • interfete si dispozitivede intrare/iesire, • sistemul de intreruperi, • ceas de timp real, alte timere • software: • sistemul de fisiere • gestiunea taskurilor • gestiunea comunicatiei si servicii de sincronizare, etc.
Nivele de acces la resurse Rutine de intrerupere Int 10h, 13hh, 16h .... Comenzi specifice Functii predefinite Functii sistem (Int 21h) Aplicatii LNI +BIB. DOS BIOS M H Instructiuni In/Out
data segment text db “hello world” ltext equ $-text port equ 378h port_c equ 37ah port_s equ 379h strob equ 00000001b busy equ 10000000b ack equ 01000000b cmd_init equ 00000001b data ends code segment assume cs: code, ds: data start: mov ax, data mov ds, ax mov si, offset text mov cx, ltext mov dx, port_c mov al, cmd_init out dx, al mov dx, port_s Accesul la nivelul masinii hardwareexemplu: tiparirea unui text la imprimanta
et1: in al, dx test al, busy; activ pe 1 jz et1 mov al,[si] inc si mov dx, port out dx, al mov dx,port_c mov al, cmd_init ; se forteaza 0 pe strob and al, NOT strob out dx, al mov dx, port_s et2: in al, dx test al, ack ; activ pe 0 jnz et2 mov dx, port_c mov al,cmd_init ; se forteaza 1 pe strob or al, stb out dx, al mov dx, port_s loop et1 tiparirea unui text la imprimanta (continuare)
mov ax, 4c00h int 21h code ends end start tiparirea unui text la imprimanta (continuare)
Accesul la resurse prin intreruperi BIOS • doua tipuri de intreruperi: • intreruperi hardware - generate de interfete la aparitia unui eveniment (ex: receptia unui caracter, citirea unui sector, eroare de transmisie, etc.) • intreruperi software - “porti de acces” la resurse prin rutine (functii) BIOS • fiecare tip de resursa (interfata) are rezervat un nivel de intrerupere • se apeleaza prin instructiunea INT n
Accesul la resurse prin intreruperi BIOS • exemple de intreruperi BIOS (software) • INT 10h - functii de ecran • INT 13H - functii FDD, HDD • INT 16H - functii de tastatura • INT 14H - functii de comunicatie pe canalul serial • INT 17H - functii de tiparire • apelul functiilor: • se seteaza parametrii de apel in registrii procesorului • se executa instructiunea de intrerupere corespunzatoare • la revenirea din rutina se testeaza CF (0 - OK, 1-eroare)
data segment buf db 512 dup(?) data ends code segment assume cs:code, ds: data start: mov ax, data mov ds, ax mov es, ax ;initializare parametrii de apel mov ah, 02 ; functia de citire mov al, 1 ; nr. de sectoare mov cl, 5 ; nr sector mov ch, 0 ; nr. pista mov dl, 0 ; nr. disc mov dh, 0 ; nr. cap mov bx, offset buf int 13h jc err .... err: ; cod pt. eroare code ends end start Accesul la resurse prin intreruperi BIOSexemplu: citirea unui sector de pe disc
Accesul la resurse prin “apeluri sistem” (system calls) • se folosesc concepte mai abstracte: • fisier - pt. accesul la dispozitivele de stocare • canal - pt. dispozitivele de transmisie a datelor • dispozitiv standard de intrare • dispozitiv standard de iesire • modul de acces: • se seteaza anumiti parametri in registrele procesorului • se construiesc anumite structuri de date pt. acces (handler) • se apeleaza intreruperea INT 21h • se testeaza corectitudinea efectuarii operatiei
Exemple de functii sistem: • 01 - citirea tastaturii cu ecou • 02 - afisarea unui caracter • 05 - tiparirea unui caracter • 08 - citirea tastaturii fara ecou • 14h - citirea secventiala cu FCB • 15h - scrierea secventiala cu FCB • 3fh - citirea unui fisier • 40h - scrierea unui fisier • 31h - revenirea in procesul parinte cu pastrarea alocarii memoriei • 4ch - revenirea in sistemul de operare
; tiparirea unui caracter mov al, “x” mov ah, 05 int 21h ;citirea unui caracter de la ; disp. de intrare standard mov ah, 01 int 21h ; in al va fi caracterul citit ; iesirea dintr-un proces cu ;pastrarea alocarii memoriei mov ah, 31h mov al, cod_retur mov dx, dimensiune int 21h ;dimensiunea memoriei rezervate se da in paragrafe de 16 octeti Accesul la resurse prin “apeluri sistem” (system calls) exemplu:
Redirectarea unor intreruperi BIOS • obiectivul: • rescrierea unor functii ale sistemului de operare, referitor la o anumita resursa • mod de realizare: • se inlocuieste in tabela de intreruperi adresa rutinei vechi cu adresa noii rutine; la terminarea aplicatiei se reface vechea adresa • noua rutina va contine noul “driver” al resursei
VECT DW2 DUP(?); aici se salvează vechiul vector de ; întrerupere ;initializare …….. MOV AH, 35h ; 35h-funcţie sistem pentru citirea ;vectorului de întrerupere MOV AL, n ; n – nivelul de întrerupere redirectat INT 21h ;apelul funcţiei sistem; funcţia returnează ;în ES:BX adresa rutinei de la nivelul n MOV VECT, BX ; salvare adresă offset MOV BX, ES MOV VECT+2, BX ; salvare adresă segment MOV AX, SEG RUT_INT MOV DS, AX ;DS <- adresa de segment a noii rutine de ; tratare a întreruperii
MOV DX, offset RUT_INT ; DX <- adresa de offset a noii ; rutine de întrerupere MOV AH, 25h ;25h - funcţia de scriere vector; ; în DS:DX se pune adresa rutinei de întrer. MOV AL,n ;n – nivel de întrerupere INT 21h ;apelul funcţiei sistem ………. ; program ……… INT n ……
; sfîrşit program MOV AX, VECT+2 ; refacerea adresei MOV DS, AX MOV DX, VECT MOV AH, 25h ; funcţia de scriere vector MOV AL,n ; n – nivel întrerupere INT 21h ; înscrierea vechiului vector în ;tabela de intreruperi …….
;rutina de tratare a întreruperii RUT_INT PROC FAR ; noua rutina de tratare a intreruperii PUSH r ; salvarea registrelor utilizate în cadrul ; rutinei (r = AX, BX, ….) STI ; validare întrerupere ……….. ; corpul rutinei ……….. ; sfîrşitul rutinei POP r ; refacere registre salvate IRET RUT_INT ENDP
Executia periodica unor operatii (intreruperea 1CH) • Implementare: prin ceasul de timp-real • contor (timer) care genereaza periodic intreruperi - la fiecare 18,2ms • rutina de tratare a intreruperii contine instructiunea INT 1CH • rutina de tratare a intreruperii 1CH contine o singura instructiune : IRET - revenire din rutina • prin redirectarea intreruperii 1CH catre o anumita rutina, aceasta va fi apelata la fiecare intrerupere a ceasului de timp real • rutina trebuie sa fie rezidenta in memorie
Sfaturi de scriere a rutinelor • parametrii de apel se transmit prin: • registrii procesorului (de preferat) • prin stiva (numai daca se combina cu module scrise in limbaje de nivel inalt); Bp se foloseste pt. adresarea parametrilor de pe stiva • trebuie sa se precizeze modul de transmitere a parametrilor printr-o caseta de comentar ;nume functie ; descrierea operatiei efectuate ; Intrari: ... ; Iesiri: ... ; registre distruse/afectate
Sfaturi de scriere a rutinelor • continutul registrelor nu trebuie sa fie afectat de executia rutinei; • toate registrele folosite in rutina vor fi salvate pe stiva si vor fi refacute la sfarsitul rutinei • refacerea registrelor este obligatorie si la iesirea in caz de eroare • exceptie: registrele care contin parametrii de iesire • majoritatea functiilor sistem nu sunt reentrante • nu pot fi apelate dinnou inainte de terminare
Reguli de scriere a procedurilor rezidente (TSR - Terminate and Stay Resident) • Procedura rezidenta: • care se activeaza la aparitia unor evenimente (ex: intreruperi, apasarea unor combinatii de litere, etc.) • se foloseste functia sistem 31h (int 21h) pt. a specifica spatiul care ramane rezident • Reguli: • la apelul unei rutine rezidente nu trebuie sa afecteze starea procesorului si a taskului intrerupt • se va evita apelarea unor functii sistem pt. a nu produce apelarea repetata a acestora
Reguli de scriere a procedurilor rezidente • frecventa maxima de apel a procedurii rezidente trebuie determinata astfel incat timpul de executie a acesteia sa nu consume intregul timp al procesorului • la apelul si la revenirea din procedura rezidenta se va face o comutare de context: vor fi salvate si apoi refacute informatiile legate de taskul intrerupt: • continutul registrilor • informatii sistem: • prefixul segmentului de program (PSP) • zona de transfer a discului (DTA) • contextul ecranului • se folosesc functii sistem pt. determinarea ac. inf.
Reguli de scriere a procedurilor rezidente • pentru activarea procedurilor rezidente se pot folosi: • intreruperea de ceas de timp-real (int 8h) • intreruperea hard de tastatura (int 9h) • intreruperea soft de tastatura (int 16h)