Programare in limbaj de asamblare Tehnici de programare
Programare in limbaj de asamblare Tehnici de programare
Accesul la resursele unui sistem de calcul n 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, et
Nivele de acces la resurse Rutine de intrerupere Int 10 h, 13 hh, 16 h. . Aplicatii LNI +BIB. DOS BIOS MH Comenzi specifice Functii predefinite Functii sistem (Int 21 h) Instructiuni In/Out
Accesul la nivelul masinii hardware exemplu: tiparirea unui text la imprimanta data segment text db “hello world” ltext equ $-text port equ 378 h port_c equ 37 ah port_s equ 379 h strob equ 00000001 b busy equ 10000000 b ack equ 01000000 b cmd_init equ 00000001 b 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
tiparirea unui text la imprimanta (continuare) et 1: in al, dx test al, busy ; activ pe 1 jz et 1 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 et 2: in al, dx test al, ack ; activ pe 0 jnz et 2 mov dx, port_c mov al, cmd_init ; se forteaza 1 pe strob or al, stb out dx, al mov dx, port_s loop et 1
tiparirea unui text la imprimanta (continuare) mov ax, 4 c 00 h int 21 h code ends end start
Accesul la resurse prin intreruperi BIOS n 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 10 h - functii de ecran INT 13 H - functii FDD, HDD INT 16 H - functii de tastatura INT 14 H - functii de comunicatie pe canalul serial INT 17 H - 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)
Accesul la resurse prin intreruperi BIOS exemplu: citirea unui sector de pe disc 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 13 h jc err. . err: ; cod pt. eroare code ends end start
Accesul la resurse prin “apeluri sistem” (system calls) n se folosesc concepte mai abstracte: – – n 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 21 h – se testeaza corectitudinea efectuarii operatiei
Exemple de functii sistem: n n n n n 01 - citirea tastaturii cu ecou 02 - afisarea unui caracter 05 - tiparirea unui caracter 08 - citirea tastaturii fara ecou 14 h - citirea secventiala cu FCB 15 h - scrierea secventiala cu FCB 3 fh - citirea unui fisier 40 h - scrierea unui fisier 31 h - revenirea in procesul parinte cu pastrarea alocarii memoriei 4 ch - revenirea in sistemul de operare
Accesul la resurse prin “apeluri sistem” (system calls) exemplu: ; tiparirea unui caracter ; iesirea dintr-un proces cu mov al, “x” ; pastrarea alocarii memoriei mov ah, 05 mov ah, 31 h int 21 h mov al, cod_retur ; citirea unui caracter de la mov dx, dimensiune ; disp. de intrare standard int 21 h mov ah, 01 ; dimensiunea memoriei rezervate se da in int 21 h paragrafe de 16 octeti ; in al va fi caracterul citit
Redirectarea unor intreruperi BIOS n obiectivul: – rescrierea unor functii ale sistemului de operare, referitor la o anumita resursa n 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 DW 2 DUP(? ); aici se salvează vechiul vector de ; întrerupere ; initializare ……. . MOV AH, 35 h ; 35 h-funcţie sistem pentru citirea ; vectorului de întrerupere MOV AL, n ; n – nivelul de întrerupere redirectat INT 21 h ; 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 d ; tratare a întreruperii
MOV DX, offset RUT_INT ; DX <- adresa de offset a noii ; rutine de întrerupere MOV AH, 25 h ; 25 h - funcţia de scriere vector; ; în DS: DX se pune adresa rutinei de într MOV AL, n ; n – nivel de întrerupere INT 21 h ; 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, 25 h ; funcţia de scriere vector MOV AL, n ; n – nivel întrerupere INT 21 h ; î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 1 CH) n Implementare: prin ceasul de timp-real – contor (timer) care genereaza periodic intreruperi la fiecare 18, 2 ms – rutina de tratare a intreruperii contine instructiunea INT 1 CH – rutina de tratare a intreruperii 1 CH contine o singura instructiune : IRET - revenire din rutina – prin redirectarea intreruperii 1 CH 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 n 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 n 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 n 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 n majoritatea functiilor sistem nu sunt reentrante – nu pot fi apelate din nou inainte de terminare
Reguli de scriere a procedurilor rezidente (TSR - Terminate and Stay Resident) n Procedura rezidenta: – care se activeaza la aparitia unor evenimente (ex: intreruperi, apasarea unor combinatii de litere, etc. ) – se foloseste functia sistem 31 h (int 21 h) pt. a specifica spatiul care ramane rezident n 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 n pentru activarea procedurilor rezidente se pot folosi: – intreruperea de ceas de timp-real (int 8 h) – intreruperea hard de tastatura (int 9 h) – intreruperea soft de tastatura (int 16 h)
- Slides: 23