260 likes | 487 Vues
Programarea in limbaj de asamblare. ISA x86 Variabile, structuri de date si structuri de program. Declararea variabilelor. Scopul: utilizarea unor nume simbolice in locul unor adrese fizice rezervarea de spatiu in memorie si initializarea variabilelor
E N D
Programarea in limbaj de asamblare ISA x86 Variabile, structuri de date si structuri de program
Declararea variabilelor • Scopul: • utilizarea unor nume simbolice in locul unor adrese fizice • rezervarea de spatiu in memorie si initializarea variabilelor • pt. verificarea utilizarii corecte a variabilelor (verificare de tip) • Modul de declarare: - prin directive • Directiva (pseudo-instructiune): • entitate de program utilizata pentru controlul procesului de compilare, editare de legaturi si lansarea programului • directivele NU SE EXECUTA; in programul executabil nu exista cod aferent pentru directive • se folosesc pentru: • declararea variabilelor si a constantelor • declararea segmentelor si a procedurilor • controlul modului de compilare, si editare de legaturi, etc.
Declararea variabilelor Variabile simple (nestructurate): • Octeti: • sintaxa: <nume_var> DB ?|<valoare> <nume_var> BYTE ?|<valoare> <nume_var> SBYTE ?|<valoare> • semnificatia: • se rezerva o locatie de memorie de 1 octet; • locatia este initializata cu <valoare>, sau este neinitializata daca apare '?' • <nume_var> - eticheta ce simbolizeaza adresa variabilei • <valoare> - valoare numerica in intervalul [0..255] sau [-127..127] • poate pastra: un numar intreg fara semn, un numar intreg cu semn, un cod ASCII, 2 cifre BCD
Declararea variabilelor Variabile simple (nestructurate): • Cuvinte: • sintaxa: <nume_var> DW ?|<valoare> <nume_var> WORD ?|<valoare> <nume_var> SWORD ?|<valoare> • semnificatia: • se rezerva o locatie de memorie de 2 octeti; • locatia este initializata cu <valoare>, sau ramane neinitializata daca apare '?' • <nume_var> - eticheta ce simbolizeaza adresa variabilei • <valoare> - valoare numerica in intervalul [0..216-1] sau [- 215-1.. 215-1] • poate pastra: un numar intreg fara semn, un numar intreg cu semn, 2 coduri ASCII, 4 cifre BCD
Declararea variabilelor Variabile simple (nestructurate): • Dublu-cuvinte: • sintaxa: <nume_var> DD ?|<valoare> <nume_var> DWORD ?|<valoare> <nume_var> SDWORD ?|<valoare> • semnificatia: • se rezerva o locatie de memorie de 4 octeti; • locatia este initializata cu <valoare>, sau este neinitializata daca apare '?' • <nume_var> - eticheta ce simbolizeaza adresa variabilei • <valoare> - valoare numerica in intervalul [0..232-1] sau [- 231-1.. 231-1] • poate pastra: un numar intreg fara semn, un numar intreg cu semn, 4 coduri ASCII, 8 cifre BCD,
Exemple de declaratii de variabile simple m db ? erori i db 6 l byte 260 j byte -7 al word 23 l byte 255 tt byte -130 k sbyte -23 bits byte 10101111b car byte 'A' cuv dw 1234h var word 0FFFFh dcuv dword 12345678h
Declararea variabilelor Variabile simple (nestructurate): • Variabile simple lungi: • FWORD • variabila pe 6 octeti, introdus pentru pastrarea unor poantori (2 octeti pt. segment + 4 octeti pt. offset) • QWORD (quad-word) • variabila pe 8 octeti; folosit pentru pastrarea intregilor f. mari sau a valorilor in flotant (dubla precizie) • TBYTE (ten-bytes) • variabila pe 10 octeti; format folosit pt. coprocesorul matematic; se reprezinta 10 cifre BCD (despachetat) sau nr. flotant pe 80 biti • FWORD,QWORD si TWORD se folosesc rar, exista declaratii mai bune care le inlocuiesc
Declararea variabilelor Variabile simple (nestructurate): • Variabile in virgula flotanta: • REAL4 – variabila flotanta pe 4 octeti • REAL8 - variabila flotanta pe 8 octeti • REAL10 - variabila flotanta pe 10 octeti • sintaxa: <nume_var> REAL4|REAL8|REAL10 ?|<val_reala> • <val_reala> - valoare cu punct zecimal si eventual exponent • ex: VAR REAL4 1.0 VAR2 REAL8 2.5e+10 VAR3 REAL4 1 - eronat
Declararea variabilelor Variabile simple (nestructurate): • declararea unor tipuri de date proprii: • se foloseste directiva TYPEDEF (asemanator cu #DEFINE in C) – este o macrodefinitie • nume diferite pentru tipuri de date predefinite • exemple: integer typedef sword var1 integer 5 char typedef byte var2 char 'A' boolean typedef byte var3 boolean 0 float typedef real4 var4 float 1.5 colors typedef byte var5 colors 3
Variabile de tip pointer • pointer = adresa unei variabile • pointer "near" • indica adresa relativa (efectiva) in cadrul unui segment • se reprezinta pe 16 biti • exemplu de utilizare: lea bx, j ; sau mov bx, offset j => bx= adr_offset(j) mov p, bx ...... mov bx, p mov ax, [bx] • declarare: <nume_pointer> word ?|near ptr <nume_var>
Variabile de tip pointer • pointer "far" • indica o adresa absoluta: <adresa_segment>:<adresa_offset> • se reprezinta pe 32 biti • exemplu de utilizare: mov word ptr p, offset j ; "word ptr" evita eroarea de tip mov word ptr p+2, seg j ........... les bx, p ;ES:BX<=p mov es:[bx], al ;Mem[p]<=al • declarare: <nume_pointer> dword ?|far ptr <nume_var>
Date structurate • Tablou: • structura de date care contine elemente de acelasi tip • declaratie (pt. tablou unidimensional): <nume_matrice> <tip_element> <val_1>[..[,<val_n>]..] <nume_matrice> <tip_element> n DUP(?|<val_1>[..[,<val_n>]..]) • exemple: octeti byte 1,3,0ffh, 34h, -13 byte 12,33,44 text byte 'Text' cuvinte word 10 DUP(?) tablou word 20 DUP(0) var word 10 DUP(1,2)
A[0] A[1] A[2] A[3] Adr. de baza Indexul Dim. element Adr. element = Adr. de baza + index*Dim. element Date structurate Tablou • amplasarea unui tablou unidimensional in memorie • Adresare: • pt. un singur element: MOV AX, TABLOU+INDEX*DIM • pentru elemente consecutive: MOV SI, INDEX*2 (mod '386) MOV AX, TABLOU[SI] MOV SI,INDEX ADD SI,2 MOV AX, TABLOU[SI*2] Expresie evaluata la compilare
Date structurate:Tablou • Tablouri multidimensionale: • dificil, nu exista suport adecvat in LA • amplasarea in memorie a elementelor: dupa linii sau dupa coloane Adr. rand 2 Adr. de baza
Date structurate:Tablouri multidimensionale • Declararea tablourilor bidimensionale: <nume_tablou> <tip_element> n DUP( m DUP(?|<val>)) • !!!! <nume_tablou> reprezinta adresa primului element!!!! • Adresarea unui element: • element singular: MOV AX, TABLOU+rand*lung_rand+coloana*dim_element • adresare succesiva: MOV SI, coloana*dim_element MOV BX, rand*lung_rand MOV AX, TABLOU[BX][SI] ADD SI, dim_element Expresii constante
Date structurate:Inregistrari (record) • Declarare: • prin declararea unei structuri de tip inregistrare SI <nume_tip_struct> struct <nume_var> <tip_var> ?|<val_1>[...<val_n>]..]] <nume_var> <tip_var> ?|<val_1>[...<val_n>]..]] ........ <nume_tip_struct> ends • prin declararea unei inregistrari care are structura declarata: <nume_inreg> <nume_tip_structura> {[<val_1>[...<val_n>]..]}
Date structurate:Inregistrari (record) • Exemplu: student struct FirstName char 12 dup (?) SecondName char 12 dup (?) BirthYear integer ? Mark byte ? student ends ............. popescu student {} ........... MOV AX, popescu.BirthYear • !!! "popescu" este adresa primului element din structura!!!
Date structurate:Inregistrari (record) • Alte metode de adresare: • exemplul 1: popescu student {} popescuPtr dword popescu .......... les bx, popescuPtr mov ax, es:[bx].student.BirthYear • exemplul 2: mov bx, offset popescu mov ax,[bx+12+12] ; ax<= popescu.BirthYear
Declararea constantelor • Scop: - nume simbolic dat unei valori des utilizate • Sintaxa: <nume_constanta> equ|= <expresie> <nume_constanta> textequ '<'<text>'>' • Semnificatia: • la compilare <nume constanta> se inlocuieste cu <expresie> ; este o constructie de tip MACRO • sintaxa se verifica doar la inlocuire • <expresie> este o expresie aritmetico-logica evaluabila in momentul compilarii => termenii sunt constante sau operatorul '$' • '$' – reprezinta valoarea contorului curent de adrese
Declararea constantelor • Exemple: trei equ 3 true equ 0 false = 0ffh text byte 'acesta este un text' lung_text equ $-text dim_tablou equ rand*coloana*dim_element Adr_port equ 378h var textequ <[bx+100]>
Declararea structurilor de program • Declararea procedurilor: <nume_procedura> proc [near|far] <instructiuni&directive> <nume_procedura> endp • near - apel din interiorul segmentului • far – apel din exteriorul segmentului • obs: • procedura trebuie incheiata cu instr. RET altfel executia continua cu instructiunea de dupa endp • asamblorul nu verifica ce contine procedura • nume_procedura reprezinta adresa primei instructiuni (locatii) din procedura
Declararea structurilor de program • Declararea segmentelor: <nume_segment> segment [READONLY] [<align>] [<combine>] [<use>] [<'class'>] <instructiuni&directive> <nume_segment> ends • Observatii: • pot fi declarate oricate segmente, dar la un moment dat numai 4 segmente (6 la '386) sunt direct accesibile • pentru ca un segment sa fie accesibil, adresa sa (selector la '386, modul protejat) trebuie incarcata intr-un registru segment • la lansarea programului CS si SS se incarca automat, restul registrelor segment trebuie initializate prin program • un program contine in mod obisnuit un segment de date, un segment de cod si un segment de stiva
Declararea structurilor de program Declararea segmentelor • semnificatia parametrilor: • <align> - specifica modul de amplasare (aliniere) a segmentului in memorie: byte, word, dword, para (16 octeti), sau page(256 octeti) -implicit-para) • <combine> - folosit pt. concatenarea segmentelor care au acelasi nume: public, stack, common, memory, sau at. • <class> - folosit pt. ordonarea segmentelor care nu au acelasi nume: 'CODE', 'DATA', 'STACK', 'CONST' • READONLY – pt. a genera eroare in cazul in care se scrie in segment (ex:pt. protejarea segmentului de cod) • <use> - specifica tipul de cod care se va genera: use16, use32, flat ;(pt. segmentul de cod neaparat use16 !!!)
Declararea structurilor de program Declararea segmentelor • Directiva ASSUME • specifica segmentele direct accesibile • sintaxa: assume cs: <nume_seg> [,<ds:<nume_seg>] [,es:<nume_seg>] .. [,<gs:<nume_seg>] • permite verificarea la compilare a accesibilitatii unor variabile • declaratia poate sa nu reflecte situatia reala • directiva NU modifica continutul registrelor segment • TREBUIE sa fie o directiva assume inaintea primei instructiuni din program
Declararea structurilor de program • Directiva END • directiva de incheiere a programului • tot ce urmeaza dupa directiva se ignora la compilare • sintaxa: END [<eticheta>] • <eticheta> - punctul de lansare a programului; daca lipseste atunci lansarea se face de la prima instructiune din segmentul de cod
Prototip de program in LA data segment public 'DATA' ..... ; declaratii de variabile si constante data ends code segment public 'CODE' assume cs: code, ds: data start: mov ax, data mov ds, ax ; initializare DS ...... mov ax, 4c00h ; revenire in sistemul de operare int 21h code ends end start ;sfarsit program