User Tools

Site Tools


laboratoare:laborator-05

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
laboratoare:laborator-05 [2015/11/11 08:38]
razvan.deaconescu [[1.5p] 9. Bonus: Numărul de numere negative și pozitive dintr-un vector]
laboratoare:laborator-05 [2016/01/09 18:27] (current)
razvan.deaconescu [[2p] 10. Bonus: Numărul de numere pare și impare dintr-un vector]
Line 110: Line 110:
  
 Atunci cănd facem înmulțire procesul este următorul, așa cum este descris și [[https://​en.wikibooks.org/​wiki/​X86_Assembly/​Arithmetic|aici]]:​ Atunci cănd facem înmulțire procesul este următorul, așa cum este descris și [[https://​en.wikibooks.org/​wiki/​X86_Assembly/​Arithmetic|aici]]:​
-  - Plasăm ​înmulțitorul ​în registrul ​''​AL''​ (pentru ​operații pe un byte), registrul ''​AX'' ​(pentru ​operații ​pentru ​cuvânt ​16 biți, 2 octeți) și registrul ''​EAX''​' (pentru ​operații pe dublu cuvânt ​32 de biți, 4 octeți). +  - Plasăm ​deînmulțitul în registrul ​de deînmulțit,​ adică: 
-  - Deînmulțitul este transmis ca argument mnemonicii ''​mul''​.+    - dacă facem operații pe un byte (8 biți, un octet), plasăm deînmulțitul în registrul ''​AL''​
 +    - dacă facem operații ​pe un cuvânt ​(16 biți, 2 octeți, plasăm deînmulțitul în registrul ''​AX''​
 +    - dacă facem operații pe un dublu cuvânt ​(32 de biți, 4 octeți), plasăm deînmulțitul în registrul ''​EAX''​
 +  - Înmulțitorul ​este transmis ca argument mnemonicii ''​mul''​. Înmulțitorul trebuie să aibă aceeași dimensiune ca deînmulțitul.
   - Rezultatul este plasat în două registre (partea //high// și partea //low//).   - Rezultatul este plasat în două registre (partea //high// și partea //low//).
  
Line 122: Line 125:
 <note tip> <note tip>
 Pentru înmulțirea numerelor de tip ''​word''​ (pe 16 biți), componentele sunt dispuse astfel: Pentru înmulțirea numerelor de tip ''​word''​ (pe 16 biți), componentele sunt dispuse astfel:
-  * În registrul ''​AX''​ se plasează ​înmulțitorul+  * În registrul ''​AX''​ se plasează ​deînmulțitul
-  * Argumentul instrucțiunii ''​mov''​ (posibil un alt registru) este pe 16 biți (fie valoare fie un registru precum ''​BX'',​ ''​CX'',​ ''​DX''​).+  * Argumentul instrucțiunii, înmulțitorul, ​''​mul''​ (posibil un alt registru) este pe 16 biți (fie valoare fie un registru precum ''​BX'',​ ''​CX'',​ ''​DX''​).
   * Rezultatul înmulțirii este dispus în perechea ''​DX:​AX'',​ adică partea "​high"​ a rezultatului în registrul ''​DX'',​ iar partea "​low"​ a rezultatului în registrul ''​AX''​.   * Rezultatul înmulțirii este dispus în perechea ''​DX:​AX'',​ adică partea "​high"​ a rezultatului în registrul ''​DX'',​ iar partea "​low"​ a rezultatului în registrul ''​AX''​.
 +
 +Pentru înmulțirea numerelor de tip ''​dword''​ (pe 32 biți), componentele sunt dispuse astfel:
 +  * În registrul ''​EAX''​ se plasează deînmulțitul.
 +  * Argumentul instrucțiunii,​ înmulțitorul,​ ''​mul''​ (posibil un alt registru) este pe 32 biți (fie valoare fie un registru precum ''​EBX'',​ ''​ECX'',​ ''​EDX''​).
 +  * Rezultatul înmulțirii este dispus în perechea ''​EDX:​EAX'',​ adică partea "​high"​ a rezultatului în registrul ''​EDX'',​ iar partea "​low"​ a rezultatului în registrul ''​EAX''​.
  
 </​note>​ </​note>​
  
 +<​note>​
 +La afișarea rezultatului folosiți două instrucțiunii ''​PRINT_UDEC''​ pentru a afișa cele două registre care conțin rezultatul:
 +  * Registrele ''​DX''​ și ''​AX''​ pentru înmulțirea numerelor de tip ''​word''​.
 +  * Registrele ''​EDX''​ și ''​EAX''​ pentru înmulțirea numerelor de tip ''​dword''​.
 +
 +</​note>​
 ==== [1p] 3. Ridicare număr la puterea a treia ==== ==== [1p] 3. Ridicare număr la puterea a treia ====
  
Line 153: Line 167:
  
 <note tip> <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:+Registrele ''​eax''​ și ''​edx''​ le veți folosi la înmulțirea pentru ridicarea la putere (în instrucțiunea ''​mul''​). Astfel că nu veți mai putea folosi (ușor) registrul ''​eax''​ pentru stocarea sumei pătratelor. 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 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''​).   - (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''​).
Line 225: Line 239:
 </​note>​ </​note>​
  
-==== [1.5p] 10. Bonus: Numărul de numere pare și impare dintr-un vector ====+==== [2p] 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. Creați un program care afișează numărul de numere pare, respectiv numărul de numere impare dintr-un vector.
  
 <note tip> <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]].+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]]
 + 
 +Va trebui să folosiți trei registre pentru împărțire:​ ''​EDX''​ și ''​EAX''​ pentru deîmpărțit,​ un alt registru pentru împărțitor (probabil ''​EBX''​). Ceea ce înseamnă că va trebui să salvați pe stivă, înaintea operației de împărțire,​ valorile celor două registre în care rețineți numărul de numere pare și numărul de numere impare.
 </​note>​ </​note>​
 +
 +<​note>​
 +Pentru testare folosiți un vector doar cu numere pozitive. Pentru numere negative trebuie să faceți extensie de semn; ar merge și fără pentru că ne interesează doar restul, dar nu am fi riguroși :-)
 +</​note>​
 +
 +===== Soluții =====
 +
 +[[http://​elf.cs.pub.ro/​asm/​res/​laboratoare/​lab-05-sol.zip|Soluții de referință pentru exercițiile de laborator]]
 +
laboratoare/laborator-05.1447223918.txt.gz · Last modified: 2015/11/11 08:38 by razvan.deaconescu