User Tools

Site Tools


laboratoare:laborator-07

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-07 [2015/11/25 08:58]
catalin.vasile3004 [[2p] 1. Împărţiri cu puteri ale lui 2]
laboratoare:laborator-07 [2015/11/30 22:53] (current)
razvan.deaconescu [Laborator 07: Operaţii pe numere lungi]
Line 1: Line 1:
-====== Laborator 07: Operaţii pe numere lungi ======+====== Laborator 07: Operații pe numere lungi ====== 
 Există situaţii excepţionale în care aspecte ale arhitecturii pe care lucrăm devin un impediment. Una dintre aceste situaţii este când problemele, pe care încercăm să le rezolvăm printr-un program pe calculator, au ca input numere foarte mari care nu pot fi reprezentate pe câte un singur registru. De exemplu pot exista cazuri în care datele citite de la tastatură să nu poată fi reprezentate pe registrele de 32 biţi (dacă suntem pe o arhitectură x86) sau pe 64 de biţi (dacă suntem pe o arhitectură amd64). În astfel de situaţii suntem nevoiţi să reprezentăm datele pe mai mulţi bytes decât ar putea procesorul în cauză să proceseze printr-o singură instrucţiune.\\ ​ Există situaţii excepţionale în care aspecte ale arhitecturii pe care lucrăm devin un impediment. Una dintre aceste situaţii este când problemele, pe care încercăm să le rezolvăm printr-un program pe calculator, au ca input numere foarte mari care nu pot fi reprezentate pe câte un singur registru. De exemplu pot exista cazuri în care datele citite de la tastatură să nu poată fi reprezentate pe registrele de 32 biţi (dacă suntem pe o arhitectură x86) sau pe 64 de biţi (dacă suntem pe o arhitectură amd64). În astfel de situaţii suntem nevoiţi să reprezentăm datele pe mai mulţi bytes decât ar putea procesorul în cauză să proceseze printr-o singură instrucţiune.\\ ​
 În acest laborator vom învăţa cum să facem calcule pe date care pot depăşi dimensiunea registrelor puse la dispoziţie de arhitectură. În acest laborator vom învăţa cum să facem calcule pe date care pot depăşi dimensiunea registrelor puse la dispoziţie de arhitectură.
Line 109: Line 110:
     ; loop code:     ; loop code:
 for: for:
-    mov eax, byte [A + ecx*4] ; get a digit from A +    mov eax, dword [A + ecx*4] ; get a digit from A 
-    adc eax, byte [B + ecx*4] ; AL = A + B + Carry+    adc eax, dword [B + ecx*4] ; AL = A + B + Carry
     mov [result + ecx*4], eax ; store result     mov [result + ecx*4], eax ; store result
     inc ecx     inc ecx
Line 128: Line 129:
  
 ===== Sign bit. Left padding. ===== ===== Sign bit. Left padding. =====
 +
 După cum ştiţi, la numerele reprezentate în formă zecimală, se poate face padding în faţa numărului cu un set de cifre infinite de zero (de exemplu: 0000343 este fi acelaşi număr cu 343). Este perfect valabil şi la numerele reprezentate în binar, pot fi prefixate de oricâte cifre de zero (0010000100 este fix acelaşi număr ca 10000100).\\ ​ După cum ştiţi, la numerele reprezentate în formă zecimală, se poate face padding în faţa numărului cu un set de cifre infinite de zero (de exemplu: 0000343 este fi acelaşi număr cu 343). Este perfect valabil şi la numerele reprezentate în binar, pot fi prefixate de oricâte cifre de zero (0010000100 este fix acelaşi număr ca 10000100).\\ ​
-Apare în schimb o situaţie dubioasă la numerele negative datorită felului în care sunt reprezentate în binar. Dacă vă mai aduceţi aminte, acestea se reprezintă în complet ​faţă de 2.\\ +Apare în schimb o situaţie dubioasă la numerele negative datorită felului în care sunt reprezentate în binar. Dacă vă mai aduceţi aminte, acestea se reprezintă în complement ​faţă de 2.\\ 
 Înainte să vă zic un fact concret, haideţi să vedem cum evoluează reprezentarea numerelor negative la stânga, cu cât se apropie mai mult de zero:​\\ ​ Înainte să vă zic un fact concret, haideţi să vedem cum evoluează reprezentarea numerelor negative la stânga, cu cât se apropie mai mult de zero:​\\ ​
 {{:​laboratoare:​nr_negative.png|}}\\ ​ {{:​laboratoare:​nr_negative.png|}}\\ ​
Line 271: Line 273:
 Uitaţi-vă ce FLAG-uri activeză instrucţiunea **[[http://​www.jegerlehner.ch/​intel/​IntelCodeTable.pdf|inc]]**. Uitaţi-vă ce FLAG-uri activeză instrucţiunea **[[http://​www.jegerlehner.ch/​intel/​IntelCodeTable.pdf|inc]]**.
 </​note>​ </​note>​
-==== [2p] 3. Înmulţirea ​cu 2 a unui număr mare/​lung ​==== +==== [2p] 3. Înmulţirea ​corectă a 2 numere de lungimi diferite ​==== 
-Implementaţi înmulţirea unui număr cu 2, fără a folosi instrucţiunea **mul**+Scrieţi o secvenţă de cod astfel încât să înmulţiţi **nr1** cu **nr2** şi să depuneţi rezultat ​în variabila **result****Trebuie** să folosiţi registre de 8 biţi. 
-<note important>​ +<file asm mul.asm>
-  - Numărul ​**trebuie** să aibă cel puţin 5 bytes în alcătuirea sa. +
-  - Trebuie să folosiţi ​instrucţiunea OR. +
-</​note>​ +
-==== [2p] 4. Suma elementelor (fără semn) ale unui vector ==== +
-Pornind de la scheletul de cod următor, implementaţi suma elementelor ale unui vector folosind **registre de 8 biţi (obligatoriu)**:​ +
-<file asm sum.asm>+
 %include "​io.inc"​ %include "​io.inc"​
 section .data section .data
-    ​v: dB 1256, 93, 44, 55, 23, 44, 71, 43 +    ​nr1: dB 0x900x02 ; =656 
-    ​lendd $-v +    ​nr2dB 0x04 
-    ​sumdW 0+    ​resultdw 0
 section .text section .text
 global CMAIN global CMAIN
 CMAIN: CMAIN:
-    ; TODO sum vector of BYTE elements into "sum" ​WORD variable+    ; TODO multiply nr1 by nr2 using only 8bit registers 
 +    ;      store the result in the "result" variable
     ​     ​
-    PRINT_UDEC 2, sum ; should be 441 if result is correct+    PRINT_UDEC 2, result ​; should be 2624
     ​     ​
     xor eax, eax     xor eax, eax
     ret     ret
 </​file>​ </​file>​
-==== [2p] 5Înmulţirea corectă a 2 numere de lungimi diferite ​==== +==== [2p] 4Suma elementelor (fără semn) ale unui vector ​==== 
-Scrieţi o secvenţă ​de cod astfel încât să înmulţiţi **nr1** cu **nr2** şi să depuneţi rezultat în variabila **result**. **Trebuie** să folosiţi ​registre de 8 biţi. +Pornind de la scheletul ​de cod următor, implementaţi suma elementelor ale unui vector folosind ​**registre de 8 biţi (obligatoriu)**:​ 
-<file asm mul.asm>+<file asm sum.asm>
 %include "​io.inc"​ %include "​io.inc"​
 section .data section .data
-    ​nr1: dB 0x900x02 ; =656 +    ​v: dB 1256, 93, 44, 55, 23, 44, 71, 43 
-    ​nr2dB 0x04 +    ​lendd $-v 
-    ​resultdw 0+    ​sumdW 0
 section .text section .text
 global CMAIN global CMAIN
 CMAIN: CMAIN:
-    ; TODO multiply nr1 by nr2 using only 8bit registers +    ; TODO sum vector of BYTE elements into "sum" ​WORD variable
-    ;      store the result in the "result" variable+
     ​     ​
-    PRINT_UDEC 2, result ​; should be 2624+    PRINT_UDEC 2, sum ; should be 441 if result is correct
     ​     ​
     xor eax, eax     xor eax, eax
     ret     ret
 </​file>​ </​file>​
 +==== [2p] 5. Înmulţirea cu 2 a unui număr mare/lung ====
 +Implementaţi înmulţirea unui număr cu 2, fără a folosi instrucţiunea **mul**.
 +<note important>​
 +  - Numărul **trebuie** să aibă cel puţin 5 bytes în alcătuirea sa.
 +  - Trebuie să folosiţi instrucţiunea OR.
 +</​note>​
  
 ==== [1p] 6. BONUS: Suma elementelor (cu semn) ale unui vector ==== ==== [1p] 6. BONUS: Suma elementelor (cu semn) ale unui vector ====
Line 354: Line 356:
 </​file>​ </​file>​
 ==== [1p] 8. BONUS: Îmbunătăţire înmulţiri cu 2 ==== ==== [1p] 8. BONUS: Îmbunătăţire înmulţiri cu 2 ====
-[[http://​www.jegerlehner.ch/​intel/​IntelCodeTable.pdf|Observaţi]] şi utilizaţi instrucţiunile de rotire cu Carry, în locul celor de tip AND si OR, pentru a rezolva exerciţiului ​3.+[[http://​www.jegerlehner.ch/​intel/​IntelCodeTable.pdf|Observaţi]] şi utilizaţi instrucţiunile de rotire cu Carry, în locul celor de tip AND si OR, pentru a rezolva exerciţiului ​5.
 ==== [1p] 9. BONUS: Generalizare înmulţiri cu puteri ale lui 2 ==== ==== [1p] 9. BONUS: Generalizare înmulţiri cu puteri ale lui 2 ====
-Modificaţi exerciţiul ​astfel încât numărul să se poată înmulţi cu o variaţie mai mare de puteri ale lui 2 (cu aceleaşi limitări ca la 3).+Modificaţi exerciţiul ​astfel încât numărul să se poată înmulţi cu o variaţie mai mare de puteri ale lui 2 (cu aceleaşi limitări ca la 5).
  
laboratoare/laborator-07.1448434692.txt.gz · Last modified: 2015/11/25 08:58 by catalin.vasile3004