Programarea in limbaj de asamblare Setul de instructiuni
Programarea in limbaj de asamblare Setul de instructiuni ISA x 86 (continuare) Exemple de programe
Instructiuni de intrerupere • INT – sintaxa: INT <nivel_intrerupere> = 0. . 255 – semnificatia: apelul prin program a unei rutine de intrerupere (intreruperi software) – adresa rutinei - pastrata intr-o tabela de intreruperi – tabela contine 256 intrari (adrese) pt. cele 256 de nivele de intrerupere acceptate de un procesor x 86 – INT - forma speciala de instructiune “CALL”
Instructiuni de intrerupere – mod de executie: • se salveaza pe stiva registrul de stare program (indicatorii de conditie) • se salveaza pe stiva CS si IP • se copiaza in CS: IP adresa rutinei de intrerupere din tabela de intreruperi de la adresa: <nivel_intrerupere>*4 – adresa rutinei poate fi modificata in timpul executiei programului - legare dinamica – este o modalitate de acces la resursele (procedurile) sistemului de operare
Instructiuni de intrerupere Memoria principala Program INT n Rutina de intrerupere <adr_seg>: <adr_offset> *4 0000 Tabela de intreruperi (256 intrari)
Instructiuni de intrerupere • INTO - interrupt on overflow – se genereaza intrerupere la depasire de capacitate if(OF=1) INT 4 • INT 3 - breackpoint – intrerupere folosita pentru scopuri de depanare – are cod pe 1 octet – programul de depanare (Cod. View, Debug, TD) insereaza acest cod in locul de oprire temporara a programului (rulare cu breackpoint)
Instructiuni de intrerupere • IRET – semnificatia: revenire din rutina de intrerupere – ce face: • descarca de pe stiva CS: IP • descarca de pe stiva indicatorii de conditie • continua cu instructiunea urmatoare celei in care sa produs intreruperea sau cu instructiunea de dupa instructiunea care a provocat intreruperea
Instructiuni de intrerupere • Utilizarea instructiunilor de intrerupere – pentru simularea unor intreruperi hardware – pentru apelul unor rutine in functie de context (legarea dinamica) – pentru apelul unor functii (servicii) ale sistemului de operare: • “Intreruperi BIOS” - ex: – INT 10 H - functii video (de afisare) – INT 13 H - functii de acces la memoria externa (HDD, FDD) – INT 16 H - functii de tastatura • Apeluri sistem - INT 21 H
Exemple de apeluri de intreruperi ; Apeluri de intreruperi BIOS ; citeste un caracter de la tastatura MOV AH, 0 INT 16 H ; in Al va fi codul caracterului citit ; scrierea unui caracter pe ecran ; in mod TTY MOV AH, 0 EH MOV AL, ‘X’ INT 10 H ; Apeluri sistem (INT 21 H) ; terminarea programului utilizator MOV AX, 4 C 00 H INT 21 H ; Scrierea unui caracter pe ecran MOV AH, 02 MOV DL, ’X’ INT 21 H
Instructiuni pt. indicatorii de conditie • CLC, STC, CMC – semnificatia: • CLC - clear carry - CF=0 • STC - set carry - CF=1 • CMC - complement carry - CF=NOT CF • CLD, STD – semnificatia: • controleaza directia de avans pt. instructiunile pe siruri: – DF=0 - incrementare registre index – DF=1 - decrementare registre index • CLD - clear direction - DF=0 • STD - set direction - DF=1
Instructiuni pt. indicatorii de conditie • CLI, STI – semnificatia: permit validarea si invalidarea intreruperilor mascabile – CLI - clear IF - IF=0 - invalidare intreruperi mascabile – STI - set IF - IF=1 - validare intreruperi mascabile • Altele: • NOP - no operation - instructiune de temporizare – (este de fapt xchg ax, ax care nu are nici un efect) • HLT - halt - oprirea procesorului • HIT - halt until interrupt or reset -oprirea temporara a procesorului
Alte instructiuni • LOCK – blocarea accesului pe magistrala pe durata instructiunii urmatoare – folosit in sistemele multiprocesor, pentru accesul la resurse partajate • CPUID – identificare procesor – pt. Pentium in prealabil in EAX se pune 1 • RDTSC - (numai la Pentium) – read real-time stamp counter – EDX: EAX = contor de cicluri (64 biti)
Exemple de programe instructiuni de transfer ; x=5 x ; x=y x y x-intreg dw ? mov x, 5 dw dw mov ; x=y[5] x dw y dw mov ? 1234 h ax, y x, ax ? 1, 2, 3, 20 h, 30 h ax, y+2*5 x, ax ; x=student. bursa x dd ? student db 10 dup(? ) ; nume db 10 dup(? ) ; prenume dd 600000 mov eax, dword ptr student+20 mov x, eax ; x=x+1 x=x-1 x=0 inc x dec x xor ax, ax mov x, ax;
Exemple de programe instructiuni de transfer ; operatii pe siruri/vectori vec 1 db ‘sir de caractere’ l_vect equ $-vec 1 vec 2 db l_vec 1 dup(? ) mov si, offset vec 1 mov di, offset vec 2 mov cx, l_vec 1 cld rep movsb ; vec 2[i]=vec 1[j] vec 1 dw l_vec 1 equ vec 2 dw mov shl mov ; altfel mov 1, 3, 22, 144, 13 $-vec 1 l_vec 1 dup(? ) di, i di si, j si ax, vec 1[si] vec 2[di] ax, vec 1[si*2] vec 2[di*2], ax
Exemple de programe operatii pe tablouri bidimensionale ; filtrarea imaginilor mov si, offset imag+100 h+1 ; 1 2 1 mov dx, 100 h-2 ; 2 4 2 *1/16 et 1: mov cx, 100 h-2 ; 1 2 1 et: mov al, 0 imag db 100 h dup(? )) mov ah, [si] E equ +1 shl ah, 2 V equ -1 add al, ah S equ 100 h mov ah, [si+E] N equ -100 h shl ah, 2 inc si NE equ -0 ffh add al, ah inc si NV equ -101 h. . . . dec dx SE equ 101 h shr al, 4 jnz et 1 SV equ 0 ffhh loop et
Exemple de programe operatii aritmetice ; x=y+z mov ax, y add x, ax ; y=y+x intregi foarte lungi x dd 12345678 h, 98765432 h y dd 5555 h, 1111 h mov eax, x add y, eax mov eax, x+4 adc y+4, eax ; operatii in BCD impachetat mov al, x add al, y daa ;
Exemple de operatii logice ; numarul de biti de 1 intr-un cuvant dw 055 aah …… mov ax, cuvant mov cx, 16 xor dl, dl et: ror ax, 1 jnc skip inc dl skip: loop et ……… ; numarati bitii de 0 ; sa se converteasca literele mici in litere mari sir db “Acesta este un text 123!” l_sir equ $-sir …. . lea si, sir mov cx, l_sir et: mov al, [si] ; ldsb – ce ar implica? cmp al, ’a’ ; ‘a’=61 h jb sf cmp al, ‘z’ ja sf and al, 11011111 B ; sub al, 20 h sf: mov [si], al ; stosb ce ar implica ? inc si loop et
Exemple ; Testarea unei zone de memorie Data 1 segment Vardb 10000 h DUP(? ) Data 1 ends ……. mov ax, data 1 mov ds, ax mov ax, 0 call test jc err mov ax, 5555 h call test jc err mov ax, 0 AAAAh …………. mov ax, 0 ffffh ………. . test proc xor si xor cx ; 8000 h*2 et: mov [si], ax scasw jnz sf loop et clc ret sf: stc ret test endp
Exemplu de citire de la o interfata • • • • • • • • buf: DB 100 DUP(? ) lbuf EQU $-buf ; lungimea bufferului adrport EQU 300 h ; adresă port de intrare adrstare EQU 301 h ; adresă registru de stare masca EQU 01 h ; mască pentru bitul D 0 timeout EQU 100 h ; limită de timp ……. ; iniţializare transfer mov si, offset buf ; iniţializare poantor memorie mov dx, adrport ; iniţializare adresă port D mov cx, lbuf ; iniţializare contor E ……. C ; transfer de date et 1: mov bx, timeout ; iniţializare limită de timp pt. aşteptare inc dx ; adresă registru de stare et 2: in al, dx ; citire port de intrare and al, masca ; testare bit de stare jnz et 3 ; testare bit de stare setat dec bx ; decrementare contor de timp cmp bx, 0 ; test depăşire limită de timp jnz et 2 jmp sfîrşit ; salt la sfîrşit et 3: dec dx ; adresă port de intrare in al, dx ; citire port mov [si], al ; memorare dată inc si ; avans poantor loop et 1 ; buclare (testare încheiere transfer) ; verificarea corectitudinii transferului sfîrşit: cmp cx, 0 ; se verifică dacă transferul s-a încheiat jnz eroare ; corect (contor=0) ……. Magistrala de adrese Magistrala de date Comenzi IOR R. date R. stare Ready
- Slides: 18