This shows you the differences between two versions of the page.
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] (current) 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]] | ||
+ |