Steagul de transport - Carry flag

În procesoarele de computer , steagul de transport (indicat de obicei ca steagul C ) este un singur bit într-un registru de stare a sistemului / registrul de steag utilizat pentru a indica când a fost generat un transport sau împrumut aritmetic din cel mai semnificativ bit de unitate logică aritmetică (ALU) poziţie. Semnalizatorul de transport permite adunarea / scăderea numerelor mai mari decât o singură lățime ALU prin transportarea (adăugarea) unei cifre binare dintr-o adunare / scădere parțială în poziția de biți cel mai puțin semnificativă a unui cuvânt mai semnificativ. De asemenea, este utilizat pentru a extinde schimbările de biți și se rotește în mod similar pe multe procesoare (uneori realizate printr-un flag X dedicat ). Pentru operațiile scăzute, sunt folosite două convenții (opuse), deoarece majoritatea mașinilor stabilesc semnul de transport pe împrumut, în timp ce unele mașini (cum ar fi 6502 și PIC ) resetează în schimb semnalul de transport pe împrumut (și invers).

Utilizări

Semnalizatorul de transport este afectat de rezultatul celor mai multe instrucțiuni aritmetice (și de obicei mai multe înțelepte) și este, de asemenea, utilizat ca intrare pentru multe dintre ele. Mai multe dintre aceste instrucțiuni au două forme care fie citesc, fie ignoră transportul. În limbile de asamblare, aceste instrucțiuni sunt reprezentate de mnemonice, cum ar fi ADD/SUB, ADC/SBC( ADD/SUBinclusiv carry), SHL/SHR( bit shifts ), ROL/ROR(bit rotates), RCR/RCL(rotate through carry) și așa mai departe. Utilizarea steagului de transport în acest mod permite operații de adăugare, scădere, deplasare și rotire cu mai multe cuvinte .

Un exemplu este ceea ce se întâmplă dacă s-ar adăuga 255 și 255 folosind registre pe 8 biți . Rezultatul ar trebui să fie 510, care este valoarea de 9 biți 111111110în binar. Cei 8 biți cel mai puțin semnificativi stocați întotdeauna în registru ar fi 11111110binari (254 zecimale), dar din moment ce există efectul din bitul 7 (cel de opt biți), transportul este setat, indicând că rezultatul are nevoie de 9 biți. Rezultatul valid pe 9 biți este concatenarea steagului de transport cu rezultatul.

Pentru dimensiunea ALU x86 de 8 biți, o interpretare complementară a celor doi biți pe 8, operația de adăugare 11111111+ 11111111are ca rezultat 111111110, Carry_Flagset, Sign_Flagset și Overflow_Flagclar.

Dacă 11111111reprezintă ADD al,-1numărul întreg semnat de complementul −1 ( ), atunci interpretarea rezultatului este -2 deoarece Overflow_Flageste clară și Carry_Flageste ignorată. Semnul rezultatului este negativ, deoarece Sign_Flageste setat. 11111110este forma complementului celor doi de număr întreg semnat −2.

Dacă 11111111reprezintă numărul binar întreg nesemnat 255 ( ADD al,255), atunci interpretarea rezultatului ar fi 254, ceea ce nu este corect, deoarece cel mai semnificativ bit al rezultatului a intrat în Carry_Flag, care, prin urmare, nu poate fi ignorat. Overflow_FlagPrecum și Sign_Flagsunt ignorate.

Un alt exemplu poate fi un registru de 8 biți cu modelul de biți 01010101și setul de semnalizare de transport; dacă executăm o rotație la stânga prin instrucțiunea de transport , rezultatul ar fi 10101011cu semnalizatorul de transport șters, deoarece bitul cel mai semnificativ (bitul 7) a fost rotit în carry, în timp ce transportul a fost rotit în bitul cel mai puțin semnificativ (bitul 0).

Microprocesoarele Intel 4004 și Intel 8008 au avut instrucțiuni specifice pentru a seta, precum și pentru a reseta în mod explicit semnalizatorul de transport. Cu toate acestea, Intel 8080 (și Z80 ) ulterior nu a inclus o resetare explicită a codului de operare de transport, deoarece acest lucru ar putea fi realizat la fel de repede prin intermediul uneia dintre instrucțiunile bit și AND, SAU sau XOR (care nu utilizează pavilionul de transport).

Steagul de transport este, de asemenea, adesea utilizat în urma instrucțiunilor de comparație, care sunt de obicei puse în aplicare prin operații scăzute, pentru a permite luarea unei decizii cu privire la care dintre cele două valori comparate este mai mică decât (sau mai mare sau egală cu) cealaltă. Instrucțiunile de ramificare care examinează steagul de transport sunt adesea reprezentate de mnemonice, cum ar fi BCCși de BCSa ramifica dacă transportul este liber, sau ramifica dacă transportul este setat. Atunci când este utilizat în acest mod, steagul de transport oferă un mecanism pentru compararea valorilor ca numere întregi nesemnate. Acest lucru este în contrast cu semnalizatorul de depășire care oferă un mecanism pentru compararea valorilor ca valori întregi semnate.

Vs. împrumuta steag

În timp ce semnalizatorul de transport este bine definit pentru adăugare, există două moduri în care se folosește semnalul de transport pentru operațiuni de scădere.

Primul folosește bitul ca indicator de împrumut, setându-l dacă a < b atunci când se calculează a - b și trebuie să se efectueze un împrumut. Dacă ab , bitul este șters. O scădere cuSBB instrucțiunea borrow ( ) va calcula a - b - C = a - ( b + C ), în timp ce o scădere fără împrumut ( SUB) acționează ca și cum bitul împrumutului ar fi clar. În 8080 , 6800 , Z80 , 8051 , x86 și 68K familii (printre altele) folosesc un pic de împrumut.

A doua utilizează identitatea care - x = ( nu x ) +1 în mod direct (adică fără a depozita transporta bit inversat) și calculează a - b ca un + (nu b ) +1. Semnalizatorul de transport este setat în funcție de această adăugare și scade cu calculele de transport a + nu ( b ) + C , în timp ce scăderea fără transport acționează ca și cum bitul de transport ar fi setat. Rezultatul este că bitul de transport este setat dacă ab și clar dacă a < b . System / 360 , 6502 , MSP430 , COP8 , ARM și PowerPC procesoare folosesc această convenție. 6502 este un exemplu deosebit de cunoscut, deoarece nu are o scădere fără operațiune de transport, astfel încât programatorii trebuie să se asigure că semnalizatorul de transport este setat înainte de fiecare operație de scădere în care nu este necesar un împrumut.

Rezumatul diferitelor utilizări ale steagului carry în scădere
Carry sau
împrumuta bit
Scădeți fără
transport / împrumut
Scade
cu împrumut
Se scade
cu carry
C = 0 a - b
= a + nu ( b ) + 1
a - b - 0
= a + nu ( b ) + 1
a - b - 1
= a + nu ( b ) + 0
C = 1 a - b - 1
= a + nu ( b ) + 0
a - b - 0
= a + nu ( b ) + 1

Cel mai frecvent, prima alternativă este denumită „scădere cu împrumut”, în timp ce a doua este numită „scădere cu transport”. Cu toate acestea, există excepții în ambele direcții; de VAX , NS320xx și Atmel AVR arhitecturi utilizează convenția de biți imprumute, dar apelul lor a - b - C operațiune "scade cu carry" ( SBWC, SUBCși SBC). Arhitecturile PA-RISC și PICmicro folosesc convenția carry bit, dar numesc operația lor a + not ( b ) + C „scăderea cu împrumutul” ( SUBBși SUBWFB).

Cele mai ST6 microcontrolere pe 8 biți sunt probabil cele mai confuze dintre toate. Deși nu au niciun fel de instrucțiune "scăderea cu carry", au un bit de carry setat de o instrucțiune de scădere, iar convenția depinde de modelul procesorului. Procesorul ST60 utilizează convenția „carry”, în timp ce procesoarele ST62 și ST63 folosesc convenția „împrumuta”.

Vezi si

Referințe

linkuri externe