This shows you the differences between two versions of the page.
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 ===== |