Differences

This shows you the differences between two versions of the page.

Link to this comparison view

soc:laboratoare:07 [2025/04/22 20:39]
stefan.maruntis [3. Detalii de implementare]
soc:laboratoare:07 [2025/04/22 20:47] (current)
stefan.maruntis [4. Status Register]
Line 17: Line 17:
 {{page>​soc:​laboratoare:​07:​implementation&​nofooter}} {{page>​soc:​laboratoare:​07:​implementation&​nofooter}}
  
-==== 4. Registrul SREG ====+==== 4. Status Register ​==== 
 + 
 +În urma calculelor făcute de UAL pot apărea anumite situații, precum overflow la adunare/​scădere,​ care este util să fie semnalate în cadrul sistemului. În acest scop procesoarele au un **registru de status** în care prin setarea unui bit anume este semnalat un anumit eveniment. Cel mai adesea, informațiile din registrul de status (sau **Status Register**) sunt folosite pentru a modifica fluxul de execuție al programului pe baza instrucțiunilor condiționale.  
 + 
 +Spre exemplu, procesorul calculează A + B și dorește să sară la o anumită etichetă dacă rezultatul este 0. UAL va calcula rezultatul lui A + B și va seta bitul **Z (Zero) din Status Register** dacă rezultatul adunării este 0. Instrucțiunea de salt **JZ (jump zero)** verifică bitul Z din Status Register și sare la eticheta data dacă bitul este 1, altfel execută instrucțiunea imediat următoare.  
 +   
 +În cadrul **x86** Status Register se numește **FLAGS** și are 16 biți. El are o extensie de 32 de biți numită **EFLAGS**. Biții din cele două registre au următoarea semnificație:​ 
 + 
 +{{:​soc:​laboratoare:​08:​eflags.png?​|x86 Status Register}} 
 + 
 +Un exemplu mai simplu este registrul de status pentru **Atmega324** (AVR în general), care se numește **SREG** și are 8 biți: 
 + 
 +{{:​soc:​laboratoare:​08:​sreg_avr.png?​700|SREG }} 
 + 
 +În ambele registre de status prezentate mai sus se regăsesc o serie de **biți de interes pentru UAL**:  
 +  * **''​CF''​ sau ''​C''​ (carry flag)** este setat pe 1 când operația executată pe UAL are carry. ​  
 +  * **''​ZF''​ sau ''​Z''​ (zero flag)** este setat pe 1 când rezultatul operației de pe UAL este 0.  
 +  * **''​N''​ (negative)** este setat pe 1 când rezultatul operației de pe UAL este un număr negativ (bitul de semn al rezultatului este 1).  
 +  * **''​OF''​ sau ''​V''​ (overflow flag)** este setat pe 1 când operația executată pe UAL produce overflow, mai exact există 2 cazuri:  
 +    * dacă adunăm 2 numere pozitive și bitul de semn al rezultatului este 1 (rezultatul este număr negativ)  
 +    * dacă adunăm 2 numere negative și bitul de semn al rezultatului este 0 (rezultatul este număr pozitiv)
  
 ===== TL;DR ===== ===== TL;DR =====
soc/laboratoare/07.1745343541.txt.gz · Last modified: 2025/04/22 20:39 by stefan.maruntis
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0