1 / 26

Programarea in limbaj de asamblare

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

jenny
Télécharger la présentation

Programarea in limbaj de asamblare

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programarea in limbaj de asamblare ISA x86 Variabile, structuri de date si structuri de program

  2. 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.

  3. 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

  4. 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

  5. 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,

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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>

  11. 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>

  12. 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)

  13. 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

  14. 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

  15. 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

  16. 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>]..]}

  17. 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!!!

  18. 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

  19. 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

  20. 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]>

  21. 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

  22. 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

  23. 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 !!!)

  24. 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

  25. 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

  26. 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

More Related