This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
laboratoare:laborator-06 [2015/11/18 03:00] razvan.deaconescu [[1.5p] Bonus: Dump la zonă de memorie] |
laboratoare:laborator-06 [2016/01/09 18:27] (current) razvan.deaconescu [[1p] 11. Bonus: Dump pe zona de cod a procesului curent] |
||
---|---|---|---|
Line 52: | Line 52: | ||
==== Instanțierea unei structuri ==== | ==== Instanțierea unei structuri ==== | ||
- | O primă variantă pentru a avea o structură în memorie este de a declara-o static în secțiunea ''.data''. Sintaxa folosește macro-urile NASM ''istruct'' și ''iend'' și keyword-ul ''at''. | + | O primă variantă pentru a avea o structură în memorie este de a declara-o static în secțiunea ''.data''. Sintaxa folosește macro-urile NASM ''istruc'' și ''iend'' și keyword-ul ''at''. |
În exemplul următor este prezentată instanțierea statică a structurii declarate mai sus, unde ''struct_var'' este adresa din memorie de unde încep datele. | În exemplul următor este prezentată instanțierea statică a structurii declarate mai sus, unde ''struct_var'' este adresa din memorie de unde încep datele. | ||
Line 395: | Line 395: | ||
Descărcați arhiva, decomprimați-o și accesați directorul aferent. | Descărcați arhiva, decomprimați-o și accesați directorul aferent. | ||
- | ==== [0.5p] 1. Tutorial: Afișare a conținutului unei structuri === | + | ==== [1p] 1. Tutorial: Afișare a conținutului unei structuri === |
În programul ''print_structure.asm'' sunt afișate câmpurile unei structuri. | În programul ''print_structure.asm'' sunt afișate câmpurile unei structuri. | ||
Line 405: | Line 405: | ||
</note> | </note> | ||
- | ==== [1p] 2. Modificare a unei structuri ==== | + | ==== [1.5p] 2. Modificare a unei structuri ==== |
Scrieți cod în cadrul funcției ''main'' astfel încât să modificați câmpurile structurii ''sample_student'' pentru ca | Scrieți cod în cadrul funcției ''main'' astfel încât să modificați câmpurile structurii ''sample_student'' pentru ca | ||
Line 411: | Line 411: | ||
* vârsta să fie ''22'' | * vârsta să fie ''22'' | ||
* grupa să fie ''323CA'' | * grupa să fie ''323CA'' | ||
+ | |||
+ | <note warning> | ||
+ | Nu modificați ce se afișează, modificați codul structurii. Nu vă atingeți de codul de afișare, acel cod trebuie să rămână același. Trebuie să adăugați la începutul funcției main, în locul marcat cu ''TODO'' codul pentru modificarea structurii. | ||
+ | </note> | ||
+ | |||
+ | <note warning> | ||
+ | Trebuie să modificați conținutul structurii din cod, adică trebuie să scrieți în zona de memorie aferentă câmpului din structură. Nu modificați structura din secțiunea ''.data'', este vorba să folosiți cod pentru a modifca structura. | ||
+ | </note> | ||
<note tip> | <note tip> | ||
Line 416: | Line 424: | ||
</note> | </note> | ||
- | ==== [0.5p] 3. Tutorial: Alocare a unei structuri pe stivă ==== | + | ==== [1p] 3. Tutorial: Alocare a unei structuri pe stivă ==== |
În programul ''on_stack_structure.asm'' se alocă o structură ca o variabilă locală funcției ''main'': se face loc pe stivă folosind ''sub esp, 80'' și apoi se inițializează câmpuri din structură și se afișează. Urmăriți codul, observați construcțiile și modul de adresare a memoriei. | În programul ''on_stack_structure.asm'' se alocă o structură ca o variabilă locală funcției ''main'': se face loc pe stivă folosind ''sub esp, 80'' și apoi se inițializează câmpuri din structură și se afișează. Urmăriți codul, observați construcțiile și modul de adresare a memoriei. | ||
Line 426: | Line 434: | ||
<note tip> | <note tip> | ||
- | Folosiți construcția ''rep movsb'' pentru a completa câmpurile de tip string (array de bytes). | + | Folosiți construcția ''rep movsb'' pentru a completa câmpurile de tip string (array de bytes), adică ''name'' și ''surname''. Lungimea șirului (plasată în registrul ''ecx'') trebuie să includă și terminatorul de șir (''NUL''-terminatorul: valoarea ''0'', sau caracterul ''%%'\0'%%''). |
+ | |||
+ | Pentru celelalte câmpuri (''age'', ''birth_year'', ''gender'') folosiți valori întregi. | ||
</note> | </note> | ||
Line 433: | Line 443: | ||
În programul ''process_structure.asm'' câmpul ''id'' al variabilei ''sample_student'' (de tip structură ''stud_struct'') este populat cu inițialele de la prenumele și numele studentului. Urmăriți codul, observați construcțiile și modul de adresare a memoriei. | În programul ''process_structure.asm'' câmpul ''id'' al variabilei ''sample_student'' (de tip structură ''stud_struct'') este populat cu inițialele de la prenumele și numele studentului. Urmăriți codul, observați construcțiile și modul de adresare a memoriei. | ||
- | ==== [1.5p] 6. Prelucrare a unei structuri ==== | + | ==== [2p] 6. Prelucrare a unei structuri ==== |
Actualizați programul de anterior astfel încât câmpul ''id'' să fie inițializat la primele 3 litere din prenume, urmate de primele trei litere din nume, urmate de semnul ''-'' (//minus//) și urmate de numele grupei. Adică pentru intrarea definită în fișier, afișarea va însemna mesajul //AndVoi-323CA//. | Actualizați programul de anterior astfel încât câmpul ''id'' să fie inițializat la primele 3 litere din prenume, urmate de primele trei litere din nume, urmate de semnul ''-'' (//minus//) și urmate de numele grupei. Adică pentru intrarea definită în fișier, afișarea va însemna mesajul //AndVoi-323CA//. | ||
Line 441: | Line 451: | ||
</note> | </note> | ||
- | ==== [0.5p] 7. Tutorial: Populare a unui vector de structuri ==== | + | <note tip> |
+ | Șirul referit de câmpul ''id'' trebuie să fie ''NUL''-terminat. Pentru aceasta va trebui să scrieți ''NUL''-terminatorul (adică ''0'' sau caracterul ''%%'\0'%%'' pe ultima poziție a șirului. | ||
+ | |||
+ | Pentru a scrie un caracter pe o poziție a șirului (de exemplu caracterul ''-'' sau ''NUL''-terminatorul) folosiți o construcție de forma<code> | ||
+ | mov byte [sample_student + id + <index>], <character> | ||
+ | </code> | ||
+ | unde ''<index>'' este index-ul unde vrem să scriem în cadrul șirului, iar ''<character>'' este caracterul pe ca vrem să îl scriem. | ||
+ | </note> | ||
+ | |||
+ | <note important> | ||
+ | Pentru câmpul ''gender'' folosiți valoarea ''1'' sau ''2'' (octet). | ||
+ | </note> | ||
+ | ==== [1p] 7. Tutorial: Populare a unui vector de structuri ==== | ||
În programul ''structure_array.asm'' este definită o variabilă ''students'' similară unui vector de structuri. În cadrul programului se face inițializarea și afișarea acestui vectori de structuri, folosindu-se șirul vid (primul caracter este ''0'') în cadrul câmpurilor de tip șir. Urmăriți codul, observați construcțiile și modul de adresare a memoriei Rulați codul. | În programul ''structure_array.asm'' este definită o variabilă ''students'' similară unui vector de structuri. În cadrul programului se face inițializarea și afișarea acestui vectori de structuri, folosindu-se șirul vid (primul caracter este ''0'') în cadrul câmpurilor de tip șir. Urmăriți codul, observați construcțiile și modul de adresare a memoriei Rulați codul. | ||
- | ==== [1.5p] 8. Alocarea și populare unui vector de structuri ==== | + | ==== [1.5p] 8. Alocare și populare unui vector de structuri ==== |
Actualizați programul de mai sus astfel încât vectorul de structuri să nu mai fie o variabilă globală neinițilizată (în ''.bss'') ci să fie alocat pe stivă. | Actualizați programul de mai sus astfel încât vectorul de structuri să nu mai fie o variabilă globală neinițilizată (în ''.bss'') ci să fie alocat pe stivă. | ||
- | ==== [1.5p] 9. Bonus: Alocare dinamică ==== | + | <note tip> |
+ | Construcția legată de ''.bss'' e recomandat să o ștergeți complet ca să nu vă încurce. | ||
+ | </note> | ||
- | Realizați o alocare dinamică (cu ''malloc'') a unui șir/array de bytes de o dimensiune dată (să spunem 128 de octeți) și apoi inițializați acel șir cu octetul/caracterul ''%%'a'%%''. | + | <note tip> |
+ | Ca să alocați vectorul de structuri pe stivă, folosiți o construcție de forma:<code> | ||
+ | sub esp, <size> | ||
+ | </code> | ||
+ | unde ''<size>'' este dimensiunea spațiului pe care trebuie să îl faceți pe stivă. Folosiți valoarea ''2000'' pentru dimensiunea spațiului (exact rezultatul ''STRUCT_STUDENTS*NUM_STUDENTS''). | ||
+ | |||
+ | Pentru a referi începutul spațiului alocat folosiți expresia ''ebp - 2000''. De la adresa indicată de ''ebp - 2000'' începe vectorul de structuri. | ||
+ | |||
+ | Folosiți variabila ''ebx'' pentru a referi începutul spațiului alocat (adresa acelui spațiu). Folosiți o construcție de forma<code> | ||
+ | lea ebx, [ebp-2000] | ||
+ | </code> | ||
+ | Apoi va trebui să adunați la începutul spațiului alocat offset-ul aferent elementului curent (calculat în schelet în registrul ''eax''). | ||
+ | </note> | ||
+ | ==== [1.5p] 9. Bonus: Alocare pe stivă ==== | ||
+ | |||
+ | Realizați o alocare **pe stivă** a unui șir/array de bytes de o dimensiune dată (să spunem 128 de octeți) și apoi inițializați acel șir cu octetul/caracterul ''%%'a'%%''. | ||
+ | |||
+ | <note tip> | ||
+ | Pentru alocare pe stivă folosiți o construcție de forma<code> | ||
+ | sub esp, 128 | ||
+ | </code> | ||
+ | </note> | ||
<note tip> | <note tip> | ||
Line 459: | Line 504: | ||
==== [1.5p] 10. Bonus: Dump la zonă de memorie ==== | ==== [1.5p] 10. Bonus: Dump la zonă de memorie ==== | ||
- | Faceți //dump// la zona de memorie alocată dinamic înainte și după inițializarea ei. Prin //memory dump// înțelegem să fie afișat fiecare octet în format hexazecimal. | + | Faceți //dump// la zona de memorie alocată pe stivă înainte și după inițializarea ei. Prin //memory dump// înțelegem să fie afișat fiecare octet în format hexazecimal. |
- | ==== [1p] Bonus: Dump pe zona de cod a procesului curent ==== | + | ==== [1p] 11. Bonus: Dump pe zona de cod a procesului curent ==== |
Faceți //dump// la zona de memorie de cod (text) a procesului curent. Începeți de la adresa funcției main și afișați un număr dat de octeți/caractere (de exemplu ''100''). | Faceți //dump// la zona de memorie de cod (text) a procesului curent. Începeți de la adresa funcției main și afișați un număr dat de octeți/caractere (de exemplu ''100''). | ||
+ | |||
+ | ===== Soluții ===== | ||
+ | |||
+ | [[http://elf.cs.pub.ro/asm/res/laboratoare/lab-06-sol.zip|Soluții de referință pentru exercițiile de laborator]] |