170 likes | 381 Views
Programarea in limbaj de asamblare. Setul de instructiuni ISA x86 (continuare) Exemple de programe. Instructiuni de intrerupere. INT sintaxa: INT <nivel_intrerupere> <nivel_intrerupere> = 0 ..255 semnificatia: apelul prin program a unei rutine de intrerupere (intreruperi software)
E N D
Programarea in limbaj de asamblare Setul de instructiuni ISA x86 (continuare) Exemple de programe
Instructiuni de intrerupere • INT • sintaxa: INT <nivel_intrerupere> <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 x86 • 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 Tabela de intreruperi *4 <adr_seg>:<adr_offset> (256 intrari) 0000
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 (CodView, Debug, TD) insereaza acest cod in locul de oprire temporara a programului (rulare cu breackpoint)
Instructiuni de intrerupere • BOUND • sintaxa: BOUND <reg>, <mem> • semnificatia: - verificare incadrarea in limite if (reg < [mem]) or (reg > [mem+sizeof(reg)]) then int 5 • se poate inlocui cu: cmp reg, LowerBound jl OutOfBounds cmp reg, UpperBound jg OutOfBounds • probleme la IBM-PC - INT 5 - PrintScreen
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 s-a 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 10H - functii video (de afisare) • INT 13H - functii de acces la memoria externa (HDD, FDD) • INT 16H - functii de tastatura • Apeluri sistem - INT 21H
;Apeluri de intreruperi BIOS ;citeste un caracter de la tastatura MOV AH,0 INT 16H ; in Al va fi codul caracterului citit ;scrierea unui caracter pe ecran ; in mod TTY MOV AH, 0EH MOV AL, ‘X’ INT 10H ;Apeluri sistem (INT 21H) ;terminarea programului utilizator MOV AX, 4C00H INT 21H ;Scrierea unui caracter pe ecran MOV AH, 02 MOV DL,’X’ INT 21H Exemple de apeluri de intreruperi
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)
; x=5 x-intreg x dw ? mov x, 5 ; x=y x dw ? y dw 1234h mov ax, y mov x,ax ;x=y[5] x dw ? y dw 1,2,3,20h,30h mov ax,y+2*5 mov 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 vec1 db ‘sir de caractere’ l_vect equ $-vec1 vec2 db l_vec1 dup(?) mov si, offset vec1 mov di, offset vec2 mov cx, l_vec1 cld rep movsb ; vec2[i]=vec1[j] vec1 dw 1,3,22,144,13 l_vec1 equ $-vec1 vec2 dw l_vec1 dup(?) mov di,i shl di mov si,j shl si mov ax, vec1[si] mov vec2[di] ;altfel mov ax,vec1[si*2] mov vec2[di*2],ax Exemple de programe - instructiuni de transfer
; filtrarea imaginilor ; 1 2 1 ; 2 4 2 *1/16 ; 1 2 1 imag db 100h dup( 100h dup(?)) E equ -1 V equ +1 S equ 100h N equ -100h NE equ -101h NV equ -0ffh SE equ 0ffh SV equ 101h mov si, offset imag+100h+1 mov dx, 100h-2 et1:mov cx, 100h-2 et: mov al, 0 mov ah, [si] shl ah,2 add al,ah mov ah, [si+E] shl ah,2 inc si add al,ah inc si ....... dec dx shr al,4 jnz et1 loop et Exemple de programe - operatii pe tablouri bidimensionale
; x=y+z mov ax,y add x,ax ; y=y+x intregi foarte lungi x dd 12345678h, 98765432h y dd 55555555h, 11111111h 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 programe -operatii aritmetice