This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
laboratoare:laborator-05 [2015/11/11 08:00] razvan.deaconescu [Numărul de numere negative și pozitive într-un vector] |
laboratoare:laborator-05 [2015/11/11 08:38] razvan.deaconescu [[1.5p] 9. Bonus: Numărul de numere negative și pozitive dintr-un vector] |
||
---|---|---|---|
Line 92: | Line 92: | ||
<code> | <code> | ||
- | mov BYTE PTR [ebx], 2 ; Move 2 into the single byte at memory location EBX | + | mov byte [ebx], 2 ; Move 2 into the single byte at memory location EBX |
- | mov WORD PTR [ebx], 2 ; Move the 16-bit integer representation of 2 into the 2 bytes starting at | + | mov word [ebx], 2 ; Move the 16-bit integer representation of 2 into the 2 bytes starting at |
; address EBX | ; address EBX | ||
- | mov DWORD PTR [ebx], 2 ; Move the 32-bit | + | mov dword [ebx], 2 ; Move the 32-bit |
</code> | </code> | ||
Line 105: | Line 105: | ||
Descărcați arhiva, decomprimați-o și accesați directorul aferent. | Descărcați arhiva, decomprimați-o și accesați directorul aferent. | ||
- | ==== Tutorial: Înmulțire două numere reprezentate pe un octet ==== | + | ==== [0.5p] 1. Tutorial: Înmulțire două numere reprezentate pe un octet ==== |
Parcurgeți rulați și testați codul din fișierul ''multiply.asm''. În cadrul programului înmulțim două numere definite ca octeți. Pentru a le aputea accesa folosimo construcție de tipul ''byte [register]''. | Parcurgeți rulați și testați codul din fișierul ''multiply.asm''. În cadrul programului înmulțim două numere definite ca octeți. Pentru a le aputea accesa folosimo construcție de tipul ''byte [register]''. | ||
Line 116: | Line 116: | ||
Testați programul. Încercați alte valori pentru ''num1'' și ''num2''. | Testați programul. Încercați alte valori pentru ''num1'' și ''num2''. | ||
- | ==== Înmulțire două numere ==== | + | ==== [2p] 2. Înmulțire două numere ==== |
Actualizați zona marcată cu ''TODO'' în fișierul ''multiply.asm'' pentru a permite înmulțirea și a numelor de tip ''word'' și ''dword'', adică ''num1_dw'' cu ''num2_dw'', respectiv ''num1_dd'' și ''num2_dd''. | Actualizați zona marcată cu ''TODO'' în fișierul ''multiply.asm'' pentru a permite înmulțirea și a numelor de tip ''word'' și ''dword'', adică ''num1_dw'' cu ''num2_dw'', respectiv ''num1_dd'' și ''num2_dd''. | ||
Line 128: | Line 128: | ||
</note> | </note> | ||
- | ==== Ridicare număr la puterea a treia ==== | + | ==== [1p] 3. Ridicare număr la puterea a treia ==== |
Realizați un program în limbajul de asamblare care ridică un număr la puterea a treia (adică ''num * num * num''). | Realizați un program în limbajul de asamblare care ridică un număr la puterea a treia (adică ''num * num * num''). | ||
Line 138: | Line 138: | ||
Nu definiți un număr foarte mare, pentru a putea fi vizualizat rezultatul înmulțirii în registrul ''eax''. | Nu definiți un număr foarte mare, pentru a putea fi vizualizat rezultatul înmulțirii în registrul ''eax''. | ||
- | ==== Tutorial: Suma elementelor dintr-un vector reprezentate pe un octet ==== | + | ==== [0.5] 4. Tutorial: Suma primelor N numere naturale ==== |
+ | |||
+ | În programul ''sum_n.asm'' din [[http://elf.cs.pub.ro/asm/res/laboratoare/lab-05-tasks.zip|arhiva laboratorului]] este calculată suma primelor ''num'' numere naturale. | ||
+ | |||
+ | Urmăriți codul, observați construcțiile și registrele specifice pentru lucru cu bytes. Rulați codul. | ||
+ | |||
+ | <note important> | ||
+ | Treceți la următorul pas doar după ce ați înțeles foarte bine ce face codul. Vă va fi greu să faceți următorul exercițiu dacă aveți dificultăți în înțelegerea exercițiului curent. | ||
+ | </note> | ||
+ | |||
+ | ==== [1.5p] 5. Suma pătratelor primelor N numere naturale ==== | ||
+ | |||
+ | Porniți de la programul ''sum_n.asm'' și creați un program ''sum_n_square.asm'' care să calculeze suma pătratelor primelor ''num'' numere naturale. | ||
+ | |||
+ | <note tip> | ||
+ | Registrele ''eax'' și ''edx'' le veți folosi la înmulțirea pentru ridicarea la putere (în instrucțiunea ''mul''). Pentru a reține suma pătratelor aveți două variante: | ||
+ | - (mai simplu) Folosiți registrul ''ebx'' pentru a reține suma pătratelor. | ||
+ | - (mai complicat) Înainte de a opera registrul ''eax'' salvați valoarea sa pe stivă (folosind instrucțiunea ''push''), apoi faceți operațiile necesare și apoi restaurați valoarea salvată (folosind instrucțiunea ''pop''). | ||
+ | |||
+ | </note> | ||
+ | |||
+ | <note> | ||
+ | Pentru verificare, suma pătratelor primelor ''100'' de numere naturale este ''338350''. | ||
+ | </note> | ||
+ | ==== [1p] 6. Tutorial: Suma elementelor dintr-un vector reprezentate pe un octet ==== | ||
În programul ''sum_array.asm'' din [[http://elf.cs.pub.ro/asm/res/laboratoare/lab-05-tasks.zip|arhiva laboratorului]] este calculată suma elementelor unui vector (//array//) de octeți (//bytes//, reprezentare pe 8 biți). | În programul ''sum_array.asm'' din [[http://elf.cs.pub.ro/asm/res/laboratoare/lab-05-tasks.zip|arhiva laboratorului]] este calculată suma elementelor unui vector (//array//) de octeți (//bytes//, reprezentare pe 8 biți). | ||
Line 148: | Line 172: | ||
</note> | </note> | ||
- | + | ==== [2p] 7. Suma elementelor dintr-un vector ==== | |
- | ==== Suma elementelor dintr-un vector ==== | + | |
În zona marcată cu ''TODO'' din fișierul ''sum_array.asm'' completați codul pentru a realiza suma vectorilor cu elemente de tip word (16 biți) și de tip dword (32 de biți); este vorba de vectorii ''word_array'' și ''dword_array''. | În zona marcată cu ''TODO'' din fișierul ''sum_array.asm'' completați codul pentru a realiza suma vectorilor cu elemente de tip word (16 biți) și de tip dword (32 de biți); este vorba de vectorii ''word_array'' și ''dword_array''. | ||
Line 164: | Line 187: | ||
</note> | </note> | ||
- | ==== Suma pătratelor elementelor dintr-un vector ==== | + | <note> |
+ | Suma elementelor celor trei vectori trebuie să fie: | ||
+ | * ''sum(byte_array): 575'' | ||
+ | * ''sum(word_array): 65799 '' | ||
+ | * ''sum(dword_array): 74758117'' | ||
- | TODO | + | </note> |
- | ==== Numărul de numere negative și pozitive dintr-un vector ==== | + | ==== [1.5p] 8. Suma pătratelor elementelor dintr-un vector ==== |
- | TODO | + | Pornind de la programul de la exercițiul anterior, calculați suma pătratelor elementelor dintr-un vector. |
- | ==== Numărul de numere pare și impare într-un vector ==== | + | <note> |
+ | Puteți folosi vectorul ''dword_array'' dar ar trebui să fie mai mici valorile elementelor ca să nu treacă pătratele valorilor acestora de reprezentarea pe 32 de biți. | ||
+ | </note> | ||
- | TODO | + | <note> |
+ | Dacă folosiți construcția de mai jos (vector cu ''10'' elemente)<code> | ||
+ | dword_array dd 1392, 12544, 7992, 6992, 7202, 27187, 28789, 17897, 12988, 17992 | ||
+ | </code> | ||
+ | suma pătratelor va fi ''2704560839''. | ||
+ | </note> | ||
+ | ==== [1.5p] 9. Bonus: Numărul de numere negative și pozitive dintr-un vector ==== | ||
+ | |||
+ | Creați un program care afișează numărul de numere negative, respectiv numărul de numere pozitive dintr-un vector. | ||
+ | |||
+ | <note> | ||
+ | Definiți un vector care să conțină atât numere negative cât și numare pozitive. | ||
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți intrucțiunea ''cmp'' și mnemonici de salt condițional. Urmăriți detalii [[https://en.wikibooks.org/wiki/X86_Assembly/Control_Flow|aici]]. | ||
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | Intrucțiunea ''inc'' urmată de un registru incrementează cu ''1'' valoarea stocată în acel registru. | ||
+ | </note> | ||
+ | |||
+ | ==== [1.5p] 10. Bonus: Numărul de numere pare și impare dintr-un vector ==== | ||
+ | |||
+ | Creați un program care afișează numărul de numere pare, respectiv numărul de numere impare dintr-un vector. | ||
+ | |||
+ | <note tip> | ||
+ | Puteți folosi instrucțiunea ''div'' pentru a împărți un număr la ''2'' și pentru a compara apoi restul împărțirii cu '''0''. Urmăriți detalii [[https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic|aici]]. | ||
+ | </note> |