Programarea in limbaj de asamblare

18
Programarea in limbaj de asamblare Setul de instructiuni ISA x86 (continuare) Exemple de programe

description

Programarea in limbaj de asamblare. Setul de instructiuni ISA x86 (continuare) Exemple de programe. Instructiuni de intrerupere. INT sintaxa: INT = 0 ..255 semnificatia: apelul prin program a unei rutine de intrerupere (intreruperi software) - PowerPoint PPT Presentation

Transcript of Programarea in limbaj de asamblare

Page 1: Programarea in limbaj de asamblare

Programarea in limbaj de asamblare

Setul de instructiuni ISA x86(continuare)

Exemple de programe

Page 2: Programarea in limbaj de asamblare

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”

Page 3: Programarea in limbaj de asamblare

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

Page 4: Programarea in limbaj de asamblare

Instructiuni de intrerupere

0000

*4 <adr_seg>:<adr_offset>

Memoria principala

Rutina de intrerupere

Tabela de intreruperi

ProgramINT n

(256 intrari)

Page 5: Programarea in limbaj de asamblare

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)

Page 6: Programarea in limbaj de asamblare

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

Page 7: Programarea in limbaj de asamblare

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

Page 8: Programarea in limbaj de asamblare

Exemple de apeluri de intreruperi

;Apeluri de intreruperi BIOS;citeste un caracter de la tastatura

MOV AH,0INT 16H

; in Al va fi codul caracterului citit

;scrierea unui caracter pe ecran; in mod TTY

MOV AH, 0EHMOV AL, ‘X’INT 10H

;Apeluri sistem (INT 21H);terminarea programului utilizator

MOV AX, 4C00HINT 21H

;Scrierea unui caracter pe ecranMOV AH, 02MOV DL,’X’INT 21H

Page 9: Programarea in limbaj de asamblare

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

Page 10: Programarea in limbaj de asamblare

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

Page 11: Programarea in limbaj de asamblare

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)

Page 12: Programarea in limbaj de asamblare

Exemple de programe - instructiuni de transfer

; x=5 x-intregx dw ?

mov x, 5; x=yx dw ?y dw 1234h

mov ax, ymov x,ax

;x=y[5]x dw ?y dw 1,2,3,20h,30h

mov ax,y+2*5mov x,ax

;x=student.bursax dd ?student db 10 dup(?) ; nume

db 10 dup(?) ; prenumedd 600000mov eax, dword ptr student+20mov x, eax

; x=x+1 x=x-1 x=0inc xdec xxor ax,axmov x,ax;

Page 13: Programarea in limbaj de asamblare

Exemple de programe - instructiuni de transfer

;operatii pe siruri/vectorivec1 db ‘sir de

caractere’l_vect equ $-vec1vec2 db l_vec1 dup(?)

mov si, offset vec1mov di, offset vec2mov cx, l_vec1cldrep movsb

; vec2[i]=vec1[j]vec1 dw 1,3,22,144,13l_vec1 equ $-vec1vec2 dw l_vec1 dup(?)

mov di,ishl dimov si,jshl simov ax, vec1[si]mov vec2[di]

;altfel mov ax,vec1[si*2]mov vec2[di*2],ax

Page 14: Programarea in limbaj de asamblare

Exemple de programe - operatii pe tablouri bidimensionale

; filtrarea imaginilor; 1 2 1; 2 4 2 *1/16; 1 2 1imag db 100h dup( 100h dup(?))E equ +1V equ -1S equ 100hN equ -100hNEequ -0ffhNV equ -101hSE equ 101hSVequ 0ffhh

mov si, offset imag+100h+1mov dx, 100h-2

et1:mov cx, 100h-2et: mov al, 0

mov ah, [si]shl ah,2add al,ahmov ah, [si+E]shl ah,2 inc siadd al,ah inc si

....... dec dxshr al,4 jnz et1loop et

Page 15: Programarea in limbaj de asamblare

Exemple de programe -operatii aritmetice

; x=y+zmov ax,yadd x,ax

; y=y+x intregi foarte lungix dd 12345678h, 98765432hy dd 55555555h, 11111111h

mov eax,xadd y,eaxmov eax,x+4adc y+4,eax

;operatii in BCD impachetatmov al, xadd al, ydaa

;

Page 16: Programarea in limbaj de asamblare

Exemple de operatii logice; numarul de biti de 1 intr-un cuvantcuvant dw 055aah……

mov ax, cuvantmov cx, 16xor dl,dl

et: ror ax, 1jnc skipinc dl

skip: loop et ………; numarati bitii de 0

; sa se converteasca literele mici in litere marisir db “Acesta este un text 123!”l_sir equ $-sir…..

lea si, sirmov cx, l_sir

et: mov al,[si] ; ldsb – ce ar implica?cmp al,’a’ ; ‘a’=61hjb sfcmp al, ‘z’ja sf and al,11011111B ; sub al,20h

sf: mov [si],al ; stosb ce ar implica ?inc siloop et

Page 17: Programarea in limbaj de asamblare

Exemple;Testarea unei zone de memorieData1 segmentVar db 10000h DUP(?)Data1 ends…….

mov ax, data1mov ds,axmov ax, 0call testjc errmov ax, 5555hcall test jc errmov ax, 0AAAAh

………….mov ax, 0ffffh

………..

test procxor sixor cx ; 8000h*2

et: mov [si], axscasw jnz sfloop et

clcret

sf: stcret

test endp

Page 18: Programarea in limbaj de asamblare

• buf: DB 100 DUP(?)• lbuf EQU $-buf ; lungimea bufferului• adrport EQU 300h ; adresă port de intrare• adrstare EQU 301h ; adresă registru de stare• masca EQU 01h ; mască pentru bitul D0• timeout EQU 100h ; limită de timp• …….• ; iniţializare transfer• mov si, offset buf ; iniţializare poantor memorie• mov dx, adrport ; iniţializare adresă port• mov cx, lbuf ; iniţializare contor• …….• ; transfer de date• et1: mov bx, timeout ;iniţializare limită de timp pt.

aşteptare• inc dx ; adresă registru de stare• et2: in al, dx ; citire port de intrare• and al, masca ; testare bit de stare• jnz et3 ; testare bit de stare setat• dec bx ; decrementare contor de timp• cmp bx,0 ; test depăşire limită de timp• jnz et2• jmp sfîrşit ; salt la sfîrşit • et3: dec dx ; adresă port de intrare• in al, dx ; citire port• mov [si], al ; memorare dată• inc si ; avans poantor• loop et1 ; 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)• …….

Exemplu de citire de la o interfata

R. date R. stare

Magistrala de date

Magistrala de adrese

DEC

Ready

ComenziIOR\