Title: Programarea in limbaj de asamblare
1Programarea in limbaj de asamblare
- Setul de instructiuni ISA x86
- (continuare)
- Exemple de programe
2Instructiuni de intrerupere
- INT
- sintaxa INT ltnivel_intreruperegt
- ltnivel_intreruperegt 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
3Instructiuni 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 CSIP adresa rutinei de intrerupere
din tabela de intreruperi de la adresa - ltnivel_intreruperegt4
- adresa rutinei poate fi modificata in timpul
executiei programului - legare dinamica - este o modalitate de acces la resursele
(procedurile) sistemului de operare
4Instructiuni de intrerupere
Memoria principala
Program
INT n
Rutina de intrerupere
Tabela de intreruperi
4
ltadr_seggtltadr_offsetgt
(256 intrari)
0000
5Instructiuni de intrerupere
- INTO - interrupt on overflow
- se genereaza intrerupere la depasire de
capacitate - if(OF1) 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)
6Instructiuni de intrerupere
- IRET
- semnificatia revenire din rutina de intrerupere
- ce face
- descarca de pe stiva CSIP
- 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
7Instructiuni 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
8Exemple de apeluri de intreruperi
- 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
9Instructiuni pt. indicatorii de conditie
- CLC, STC, CMC
- semnificatia
- CLC - clear carry - CF0
- STC - set carry - CF1
- CMC - complement carry - CFNOT CF
- CLD, STD
- semnificatia
- controleaza directia de avans pt. instructiunile
pe siruri - DF0 - incrementare registre index
- DF1 - decrementare registre index
- CLD - clear direction - DF0
- STD - set direction - DF1
10Instructiuni pt. indicatorii de conditie
- CLI, STI
- semnificatia permit validarea si invalidarea
intreruperilor mascabile - CLI - clear IF - IF0 - invalidare intreruperi
mascabile - STI - set IF - IF1 - 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
11Alte 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
- EDXEAX contor de cicluri (64 biti)
12Exemple de programe - instructiuni de transfer
- x5 x-intreg
- x dw ?
- mov x, 5
- xy
- x dw ?
- y dw 1234h
- mov ax, y
- mov x,ax
- xy5
- x dw ?
- y dw 1,2,3,20h,30h
- mov ax,y25
- mov x,ax
- xstudent.bursa
- x dd ?
- student db 10 dup(?) nume
- db 10 dup(?) prenume
- dd 600000
- mov eax, dword ptr student20
- mov x, eax
- xx1 xx-1 x0
- inc x
- dec x
- xor ax,ax
- mov x,ax
13Exemple 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
- vec2ivec1j
- 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, vec1si
- mov vec2di
- altfel
- mov ax,vec1si2
- mov vec2di2,ax
14Exemple de programe - operatii pe tablouri
bidimensionale
- 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 -0ffh
- NV equ -101h
- SE equ 101h
- SV equ 0ffhh
- mov si, offset imag100h1
- mov dx, 100h-2
- et1mov cx, 100h-2
- et mov al, 0
- mov ah, si
- shl ah,2
- add al,ah
- mov ah, siE
- shl ah,2 inc si
- add al,ah inc si
- ....... dec dx
- shr al,4 jnz et1
- loop et
15Exemple de programe -operatii aritmetice
- xyz
- mov ax,y
- add x,ax
- yyx intregi foarte lungi
- x dd 12345678h, 98765432h
- y dd 55555555h, 11111111h
- mov eax,x
- add y,eax
- mov eax,x4
- adc y4,eax
- operatii in BCD impachetat
- mov al, x
- add al, y
- daa
16Exemple de operatii logice
- 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 a61h
- jb sf
- cmp al, z
- ja sf
- and al,11011111B sub al,20h
- sf mov si,al stosb ce ar implica ?
- inc si
- loop et
- numarul de biti de 1 intr-un cuvant
- cuvant dw 055aah
-
- mov ax, cuvant
- mov cx, 16
- xor dl,dl
- et ror ax, 1
- jnc skip
- inc dl
- skip loop et
-
- numarati bitii de 0
-
17Exemple
- Testarea unei zone de memorie
- Data1 segment
- Var db 10000h DUP(?)
- Data1 ends
- .
- mov ax, data1
- mov ds,ax
- mov ax, 0
- call test
- jc err
- mov ax, 5555h
- call test
- jc err
- mov ax, 0AAAAh
- .
- mov ax, 0ffffh
- ..
- test proc
- xor si
- xor cx 8000h2
- et mov si, ax
- scasw
- jnz sf
- loop et
- clc
- ret
- sf stc
- ret
- test endp
18Exemplu de citire de la o interfata
- buf DB 100 DUP(?)
- lbuf EQU -buf lungimea bufferului
- adrport EQU 300h adresa port de intrare
- adrstare EQU 301h adresa registru de stare
- masca EQU 01h masca pentru bitul D0
- timeout EQU 100h limita de timp
- .
- initializare transfer
- mov si, offset buf initializare poantor
memorie - mov dx, adrport initializare adresa port
- mov cx, lbuf initializare contor
- .
- transfer de date
- et1 mov bx, timeout initializare limita de timp
pt. asteptare - inc dx adresa 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
Magistrala de adrese
Magistrala de date
Comenzi
IOR\
DEC
R. date
R. stare
Ready