Nést vlajku - Carry flag

V počítačových procesorech je příznak přenosu (obvykle označen jako příznak C ) jeden bit v registru stavu systému / registru příznaků, který slouží k indikaci, kdy byl z nejvýznamnějšího aritmetického logického bloku (ALU) vygenerován aritmetický přenos nebo výpůjčka. pozice. Příznak carry umožňuje přidávání / odečítání čísel větších než jedna šířka ALU přenášením (přidáváním) binární číslice z částečného sčítání / odčítání do nejméně významné bitové pozice významnějšího slova. Používá se také k rozšíření bitových posunů a otáčení podobným způsobem na mnoha procesorech (někdy se provádí prostřednictvím vyhrazeného příznaku X ). U subtraktivních operací se používají dvě (opačné) konvence, protože většina strojů nastavuje příznak carry na zapůjčení, zatímco některé stroje (například 6502 a PIC ) místo toho resetují příznak carry na zapůjčení (a naopak).

Použití

Příznak carry je ovlivněn výsledkem většiny aritmetických (a obvykle několika bitových) pokynů a je také používán jako vstup pro mnoho z nich. Některé z těchto pokynů mají dvě podoby, které přečtou nebo ignorují nosení. V montážních jazycích jsou tyto pokyny reprezentovány mnemotechnickými pomůckami , jako ADD/SUB jsou ADC/SBC ( ADD/SUB včetně carry), SHL/SHR ( bitové posuny ), ROL/ROR (bitové RCR/RCL rotace ), (rotace prostřednictvím carry) atd. Použití příznaku carry tímto způsobem umožňuje operace přidávání, odečítání, posouvání a otáčení více slov .

Příkladem je to, co se stane, pokud bychom přidali 255 a 255 pomocí 8bitových registrů. Výsledkem by mělo být 510, což je 9bitová hodnota 111111110 v binárním formátu . 8 nejméně významných bitů vždy uložených v registru by bylo 11111110 binárních (254 desetinných míst), ale protože je prováděn bit 7 (osm bitů), je přenos nastaven, což naznačuje, že výsledek potřebuje 9 bitů. Platný 9bitový výsledek je zřetězení příznaku carry s výsledkem.

Pro x86 ALU velikost 8 bitů, interpretace komplementu 8bitových dvou, operace přidání 11111111 + 11111111 vede k 111111110 , Carry_Flag set, Sign_Flag set a Overflow_Flag clear.

Pokud 11111111 představuje celé číslo se znaménkem komplementu −1 ( ADD al,-1 ), pak je interpretace výsledku -2, protože Overflow_Flag je jasná a Carry_Flag je ignorována. Znaménko výsledku je záporné, protože Sign_Flag je nastaveno. 11111110 je forma dvojky celého čísla se znaménkem −2.

Pokud 11111111 představuje celé číslo bez znaménka binární číslo 255 ( ADD al,255 ), pak by interpretace výsledku byla 254, což není správné, protože nejvýznamnější bit výsledku šel do Carry_Flag , což tedy nelze ignorovat. A Overflow_Flag a Sign_Flag jsou ignorovány.

Dalším příkladem může být 8bitový registr s bitovým vzorem 01010101 a sadou příznaků přenosu; provedeme-li instrukci rotace doleva pomocí příkazu carry , bude výsledek 10101011 s příznakem carry vymazán, protože nejvýznamnější bit (bit 7) byl otočen do carry, zatímco carry byl otočen do nejméně významného bitu (bit 0).

Rané mikroprocesory Intel 4004 a Intel 8008 měly specifické pokyny pro výslovné nastavení a resetování příznaku carry. Pozdější Intel 8080 (a Z80 ) však nezahrnoval explicitní přenosový operační kód pro přenos, protože to lze provést stejně rychle pomocí jedné z bitových instrukcí AND, OR nebo XOR (které nepoužívají příznak carry).

Příznak carry se také často používá podle pokynů ke srovnání, které se obvykle provádějí subtraktivními operacemi, aby bylo možné rozhodnout o tom, která ze dvou porovnávaných hodnot je nižší než (nebo větší nebo rovna) druhé. Pokyny větve, které zkoumají příznak carry, jsou často reprezentovány mnemotechnickými pomůckami, jako je BCC a BCS to branch, pokud je carry jasný, nebo branch, pokud je carry nastaveno. Při použití tímto způsobem příznak carry poskytuje mechanismus pro porovnání hodnot jako nepodepsaná celá čísla. To je na rozdíl od příznaku přetečení, který poskytuje mechanismus pro porovnání hodnot jako celočíselné hodnoty se znaménkem.

Vs. půjčit vlajku

Zatímco příznak carry je dobře definován pro přidání, existují dva způsoby, jak se běžně používá příznak carry pro operace odčítání.

První používá bit jako příznak výpůjčky, nastavuje jej, pokud a < b při výpočtu a - b , a výpůjčky musí být provedeny. Pokud a b , bit je vymazán. Odečíst s půjčit si ( SBB instrukce) bude počítat s - B - C = - ( b + C ), zatímco odečíst bez půjčit ( ) působí jako v případě, že půjčit bit byly jasné. Mezi 8080 , Z80 , 8051 , x86 a 68k rodiny (mimo jiné) použití půjčit trochu. SUB

Druhý využívá identity - x = ne ( x ) +1 a počítá s - b jako je + ne ( b ) +1. Příznak carry je nastaven podle tohoto sčítání a odčítání s carry spočítá a + not ( b ) + C , zatímco odečítání bez carry působí, jako by byl nastaven bit carry. Výsledkem je, že přenosový bit je nastaven, pokud a b , a jasný, pokud a < b . System / 360 , 6502 , MSP430 , COP8 , ARM a PowerPC procesory používat tuto úmluvu. 6502 je obzvláště dobře známý příklad, protože nemá odečítání bez operace přenosu, takže programátoři musí zajistit, aby byl příznak přenosu nastaven před každou operací odečtení, kde není vyžadována výpůjčka.

Shrnutí různých použití příznaku carry při odečítání
Noste nebo
si půjčte bit
Odečtěte bez
přenášení / půjčování
Odečtěte
s půjčením
Odečíst
s carry
C = 0 a - b
= a + ne ( b ) + 1
a - b - 0
= a + ne ( b ) + 1
a - b - 1
= a + ne ( b ) + 0
C = 1 a - b - 1
= a + ne ( b ) + 0
a - b - 0
= a + ne ( b ) + 1

Nejčastěji se první alternativa označuje jako „odečíst s vypůjčením“, zatímco druhá se nazývá „odečíst s přenášením“. V obou směrech však existují výjimky; na VAX , NS320xx a Atmel AVR architektury využívají půjčit bit konvence, ale vyžadují jejich - b - C provoz "odečíst s carry" ( , a ). Tyto PA-RISC a PICmicro architektury využívají pro carry bit konvence, ale volat své si + ne ( b ) + C provoz "odečíst s půjčit" ( a ). SBWCSUBCSBCSUBBSUBWFB

Tyto ST6 8-bitové mikroprocesory jsou možná nejvíce matoucí ze všech. Ačkoli nemají jakýkoli druh instrukce „odečíst s carry“, mají bit carry, který je nastaven instrukcí pro odečtení, a konvence závisí na modelu procesoru. Procesor ST60 používá konvenci "carry", zatímco procesory ST62 a ST63 používají konvenci "půjčit".

Viz také

Reference

externí odkazy