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:49]
razvan.deaconescu [[1p] 1. Tutorial: Suma unui vector de numere fracționare]
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 250: 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.1452696588.txt.gz · Last modified: 2016/01/13 16:49 by razvan.deaconescu