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

Programarea in limbaj de asamblare

  • Upload
    jenny

  • View
    79

  • Download
    0

Embed Size (px)

DESCRIPTION

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 - PowerPoint PPT Presentation

Citation preview

Page 1: Programarea in limbaj de asamblare

1

Programarea in limbaj de asamblare

ISA x86

Variabile, structuri de date

si structuri de program

Page 2: Programarea in limbaj de asamblare

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.

Page 3: Programarea in limbaj de asamblare

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

Page 4: Programarea in limbaj de asamblare

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

Page 5: Programarea in limbaj de asamblare

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,

Page 6: Programarea in limbaj de asamblare

6

Exemple de declaratii de variabile simple

m db ? erorii db 6 l byte 260j byte -7 al word 23l byte 255 tt byte -130k sbyte -23bits byte 10101111bcar byte 'A'cuv dw 1234hvar word 0FFFFhdcuv dword 12345678h

Page 7: Programarea in limbaj de asamblare

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

Page 8: Programarea in limbaj de asamblare

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

Page 9: Programarea in limbaj de asamblare

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

Page 10: Programarea in limbaj de asamblare

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>

Page 11: Programarea in limbaj de asamblare

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<=pmov es:[bx], al ;Mem[p]<=al

– declarare:

<nume_pointer> dword ?|far ptr <nume_var>

Page 12: Programarea in limbaj de asamblare

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,44text byte 'Text'cuvinte word 10 DUP(?)tablou word 20 DUP(0)var word 10 DUP(1,2)

Page 13: Programarea in limbaj de asamblare

13

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,INDEXADD SI,2 MOV AX,

TABLOU[SI*2]

A[0] A[1] A[2] A[3]

Adr. de baza Indexul Dim. element

Adr. element = Adr. de baza + index*Dim. element

Expresie evaluata la compilare

Page 14: Programarea in limbaj de asamblare

14

Date structurate:Tablou

• Tablouri multidimensionale:– dificil, nu exista suport adecvat in LA

– amplasarea in memorie a elementelor: dupa linii sau dupa coloane

Adr. de baza Adr. rand 2

Page 15: Programarea in limbaj de asamblare

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_elementMOV BX, rand*lung_randMOV AX, TABLOU[BX][SI]ADD SI, dim_element

Expresii constante

Page 16: Programarea in limbaj de asamblare

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

Page 17: Programarea in limbaj de asamblare

17

Date structurate:Inregistrari (record)

• Exemplu:student structFirstName 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!!!

Page 18: Programarea in limbaj de asamblare

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

Page 19: Programarea in limbaj de asamblare

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

Page 20: Programarea in limbaj de asamblare

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

Page 21: Programarea in limbaj de asamblare

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

Page 22: Programarea in limbaj de asamblare

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

Page 23: Programarea in limbaj de asamblare

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

Page 24: Programarea in limbaj de asamblare

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

Page 25: Programarea in limbaj de asamblare

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

Page 26: Programarea in limbaj de asamblare

26

Prototip de program in LA

data segment public 'DATA' ..... ; declaratii de variabile si constantedata endscode segment public 'CODE' assume cs: code, ds: datastart: mov ax, data mov ds, ax ; initializare DS ...... mov ax, 4c00h ; revenire in sistemul de operare int 21hcode ends end start ;sfarsit program