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 14:42]
razvan.deaconescu [[0.5p] 1. Tutorial: Înmulțire două numere reprezentate pe un octet]
laboratoare:laborator-05 [2016/01/09 18:27]
razvan.deaconescu [[2p] 10. Bonus: Numărul de numere pare și impare dintr-un vector]
Line 112: Line 112:
   - Plasăm deînmulțitul în registrul de deînmulțit,​ adică:   - Plasăm deînmulțitul în registrul de deînmulțit,​ adică:
     - 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 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 ''​AZ'';​+    - 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''​.     - 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.   - Înmulțitorul este transmis ca argument mnemonicii ''​mul''​. Înmulțitorul trebuie să aibă aceeași dimensiune ca deînmulțitul.
Line 125: 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 156: 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 241: Line 252:
 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 :-) 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>​ </​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.txt · Last modified: 2016/01/09 18:27 by razvan.deaconescu