User Tools

Site Tools


laboratoare:laborator-12

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-12 [2016/01/13 16:47]
razvan.deaconescu [[1p] 3. Împărțirea a două numere întregi cu rezultat fracționar]
laboratoare:laborator-12 [2016/01/15 19:25] (current)
razvan.deaconescu [[2p] 4. Extragere parte întreagă și fracționară]
Line 15: Line 15:
 Pentru a reprezenta valorile fracționare vom folosi **Reprezentarea în virgulă mobilă** (**Floating Point Representation**). În această reprezentare,​ numerele au următoarea structură: Pentru a reprezenta valorile fracționare vom folosi **Reprezentarea în virgulă mobilă** (**Floating Point Representation**). În această reprezentare,​ numerele au următoarea structură:
  
-{{:​laboratoare:​lab12-equation1.png?​500|}}+{{ :​laboratoare:​lab12-equation1.png?​500 |}}
  
 După cum putem observa mai sus, valorile trebuie transformate astfel încât partea întreagă să fie 1. Această formă poartă ​ După cum putem observa mai sus, valorile trebuie transformate astfel încât partea întreagă să fie 1. Această formă poartă ​
Line 21: Line 21:
  
 În forma binară, valorile se reprezintă astfel: În forma binară, valorile se reprezintă astfel:
-{{:​laboratoare:​2000px-ieee_754_double_floating_point_format.png?​600|}}+{{ :​laboratoare:​2000px-ieee_754_double_floating_point_format.png?​600 |}}
  
 **Semnul** este dat de primul bit din reprezentarea binară: 1 = negativ, 0 = pozitiv.\\ **Semnul** este dat de primul bit din reprezentarea binară: 1 = negativ, 0 = pozitiv.\\
Line 33: Line 33:
 Cele mai folosite standarde de reprezentare în virgulă mobilă sunt cu precizie simplă (**Single Precision**) și cu precizie dublă (**Double Precision**). Cele mai folosite standarde de reprezentare în virgulă mobilă sunt cu precizie simplă (**Single Precision**) și cu precizie dublă (**Double Precision**).
  
-Reprezentarea cu **precizie simplă** presupune folosirea a 32 de biți și corespunde valorilor float din limbajul C. În acest caz baza folosită este 2, exponentul are 8 biți, iar restul de 23 de biți corespund ​exponentului.+Reprezentarea cu **precizie simplă** presupune folosirea a 32 de biți și corespunde valorilor float din limbajul C. În acest caz baza folosită este 2, exponentul are 8 biți, iar restul de 23 de biți corespund ​mantisei.
  
-Reprezentarea cu **precizie dublă** presupune folosirea a 64 de biți și corespunde valorilor de tip double. În acest caz, baza este 2, exponentul are 11 biți, iar ultimii ​52 de biți sunt folosiți pentru exponent.+Reprezentarea cu **precizie dublă** presupune folosirea a 64 de biți și corespunde valorilor de tip double. În acest caz, baza este 2, exponentul are 11 biți, iar restul de 52 de biți corespund mantisei.
  
 <​note>​ <​note>​
 În ambele cazuri, exponentul folosit în calcul nu este cel extras din numărul în forma binară, ci este calculat astfel: În ambele cazuri, exponentul folosit în calcul nu este cel extras din numărul în forma binară, ci este calculat astfel:
-* În precizie simplă, exponentul este dat de valoarea (exponentul pe 23 de biți) - 127 +* În precizie simplă, exponentul este dat de valoarea ​''​(exponentul pe de biți) - 127''​ (adică se scade o valoare fixă din valoarea efectivă a exponentului) 
-* În precizie dublă, exponentul este dat de valoarea (exponentul pe 52 de biți) - 1023+* În precizie dublă, exponentul este dat de valoarea ​''​(exponentul pe 11 de biți) - 1023''​ (adică se scade o valoare fixă din valoarea efectivă a exponentului)
  
 </​note>​ </​note>​
Line 77: Line 77:
  
 ^ Instrucțiune ​     ^ Descriere ​         ^ ^ Instrucțiune ​     ^ Descriere ​         ^
-| fstp DWORD [registru] | Citește o valoare de tip float (octeți) din vârful stivei și o salvează la adresa indicată de registru. Valoarea este eliminată de pe stivă. |+| fstp DWORD [registru] | Citește o valoare de tip float (octeți) din vârful stivei și o salvează la adresa indicată de registru. Valoarea este eliminată de pe stivă. |
 | fst DWORD [registru] ​ | Similar cu instrucțiunea anterioară,​ dar valoarea rămâne în vârful stivei. | | fst DWORD [registru] ​ | Similar cu instrucțiunea anterioară,​ dar valoarea rămâne în vârful stivei. |
 | fstp QWORD [registru] ​ | Citește o valoare de tip double (8 octeți) din vârful stivei și o salvează la adresa indicată de registru, eliminând valoarea de pe stivă | | fstp QWORD [registru] ​ | Citește o valoare de tip double (8 octeți) din vârful stivei și o salvează la adresa indicată de registru, eliminând valoarea de pe stivă |
Line 91: Line 91:
 | ficom word [registru] | Compara prima valoare de pe stivă cu un număr întreg pe 2 octeți de la adresa indicată de registru | | ficom word [registru] | Compara prima valoare de pe stivă cu un număr întreg pe 2 octeți de la adresa indicată de registru |
 | ficom dword [registru] | Compară prima valoare de pe stivă cu un număr întreg pe 4 octeți de la adresa indicată de registru | | ficom dword [registru] | Compară prima valoare de pe stivă cu un număr întreg pe 4 octeți de la adresa indicată de registru |
-ficomp dword [registru] | Compară prima valoare de pe stivă cu un număr întreg pe octeți de la adresa indicată de registru | +ficom qword [registru] | Compară prima valoare de pe stivă cu un număr întreg pe octeți de la adresa indicată de registru | 
-| ficomp dword/word [registru] | Similar cu instrucțiunile anterioare, dar elimină și prima valoare de pe stivă |+| ficomp ​word/dword/qword [registru] | Similar cu instrucțiunile anterioare, dar elimină și prima valoare de pe stivă |
 | ftst | Compară prima valoare de pe stivă cu 0.0. | | ftst | Compară prima valoare de pe stivă cu 0.0. |
  
Line 147: Line 147:
  
     fld qword [n1]     fld qword [n1]
-    ​fld qword [n2]+    ​fadd qword [n2]
  
     sub esp, 8      ; rezervă loc pe stivă pentru rezultat, pasat ca argument funcției printf.     sub esp, 8      ; rezervă loc pe stivă pentru rezultat, pasat ca argument funcției printf.
-    fadd 
     fstp qword [esp]; mută rezultatul adunării în spațiul rezervat.     fstp qword [esp]; mută rezultatul adunării în spațiul rezervat.
  
Line 220: Line 219:
 ==== [1p] 1. Tutorial: Suma unui vector de numere fracționare ==== ==== [1p] 1. Tutorial: Suma unui vector de numere fracționare ====
  
-În fișierul ''​suma.asm''​ din directorul ​''​ex1''​ găsiți un exemplu de adunare a valorilor dintr-un vector de numere fracționare. La final, rezultatul este afișat folosind ''​printf''​. ​+În fișierul ''​suma.asm''​ din subdirectorul ​''​ex1/''​ găsiți un exemplu de adunare a valorilor dintr-un vector de numere fracționare. La final, rezultatul este afișat folosind ​funcția ​''​printf''​. ​
  
 Parcurgeți și înțelegeți exemplul dat. Deschideți-l folosind SASM și rulați-l. Parcurgeți și înțelegeți exemplul dat. Deschideți-l folosind SASM și rulați-l.
Line 228: Line 227:
 ==== [1p] 2. Media unui vector de numere fracționare ==== ==== [1p] 2. Media unui vector de numere fracționare ====
  
-Acum că am văzut cum putem calcula suma elementelor unui vector, ne propunem să calculăm media acestora. Pentru aceasta trebuie să calculăm mai întai suma (vă puteți inspira din exemplul anterior) și să împărțim la numărul de elemente.  +Acum că am văzut cum putem calcula suma elementelor unui vector, ne propunem să calculăm media acestora. Pentru aceasta trebuie să calculăm mai întai suma (vă puteți inspira din exemplul anterior) și să împărțim la numărul de elemente. 
-Urmăriți comentariile marcate cu TODO din fișierul ''​media.asm''​ din directorul ​''​ex2''​.+  
 +Urmăriți comentariile marcate cu ''​TODO'' ​din fișierul ''​media.asm''​ din subdirectorul ​''​ex2/''​ și completați corespunzător pentru calcularea mediei vectorului de elemente ''​vector''​.
  
 <note tip> <note tip>
-Împărțirea se face la un număr întreg. Folosiți instrucțiunea ''​fidiv''​ pentru a împărți valoarea din vârful stivei FPU la un număr cu reprezentare de număr întreg.+Împărțirea se face la un număr întreg ​(adică se împarte la lungimea vectorului ''​vector''​). Folosiți instrucțiunea ''​fidiv''​ pentru a împărți valoarea din vârful stivei FPU la un număr cu reprezentare de număr întreg.
 </​note>​ </​note>​
 ==== [1p] 3. Împărțirea a două numere întregi cu rezultat fracționar ==== ==== [1p] 3. Împărțirea a două numere întregi cu rezultat fracționar ====
Line 249: Line 249:
  
 <note tip> <note tip>
-Pentru a extrage partea întreagă puteți folosi instrucțiunea ''​FISTTP ​dword <​adresa>'',​ care extrage prima valoare din vârful stivei FPU, o trunchiază și o stochează ca un întreg la adresa specificată.+Pentru a extrage partea întreagă puteți folosi instrucțiunea ''​fisttp ​dword <​adresa>'',​ care extrage prima valoare din vârful stivei FPU, o trunchiază și o stochează ca un întreg la adresa specificată
 +</​note>​ 
 + 
 +<note tip> 
 +Instrucțiunea ''​fisttp''​ este o instrucțiune validă, chiar dacă nu este colorată în ''​SASM''​. 
 +</​note>​ 
 + 
 +<note tip> 
 +Instrucțiunea ''​fisttp''​ face și pop la valoarea din vârful stivei FPU. De aceea, pentru obținerea părții fracționare,​ va trebui să reîncărcați valoarea numărului fracționar ''​n''​ (folosind ''​fld''​) înainte de scădea valoarea întregii din acesta folosind instrucțiunea ''​fisub''​.
 </​note>​ </​note>​
 ==== [2p] 5. Media unui vector de întregi cu rezultat fracționar ==== ==== [2p] 5. Media unui vector de întregi cu rezultat fracționar ====
laboratoare/laborator-12.1452696430.txt.gz · Last modified: 2016/01/13 16:47 by razvan.deaconescu