Příznak polovičního přenosu
Příznak polovičního přenosu (anglicky Half-carry flag, Adjust flag nebo Auxiliary flag) je bit v registru příznaků (stavovém slově) mikroprocesorů, který slouží pro podporu výpočtů s binárně kódovanými desítkovými čísly (BCD). Používají jej mimo jiné mikroprocesory Intel 8080, Zilog Z80, řada mikroprocesorů x86[1] a Motorola 68000[2]. Příznak indikuje, že došlo k přenosu nebo výpůjčce z bitu 3.
Použití
Prakticky všechny moderní procesory používají binární aritmetiku. Při sčítání dvou 8bitových čísel tak používají pravidla pro binární sčítání. Například sečtení 2516 a 4816 dává 6D16. Pro binárně kódované desítkové (BCD) hodnoty, kde každá polovina bytu (anglicky nibble) reprezentuje jednu desítkovou číslici, je sčítání složitější. Například při sčítání desítkových čísel 25 a 48, která jsou zakódována pomocí BCD hodnot 2516 a 4816, dává binární sčítání 6D16; protože nižší čtyři bity výsledku (D) nejsou desítkovou číslicí, je třeba výsledek upravit přičtením hodnoty 0616. Tím získáme správný BCD výsledek 7316, který reprezentuje desítkovou hodnotu 73.
0010 0101 25 + 0100 1000 48 ----------- 0110 1101 6D, binární výsledek + 0110 06, úprava ----------- 0111 0011 73, upravený BCD výsledek
Podobně sečtení BCD hodnot 3916 a 4816 dává 8116. Tento výsledek sice nemá ve spodních čtyřech bitech nedesítkovou hodnotu, ale došlo při něm k přenosu z méně významné číslice (nižších čtyř bitů) do významnější číslice (horní čtyři bity), což je indikováno nastavením příznaku polovičního přenosu. Proto i tato hodnota musí být opravena přičtením 0616 až 8116 pro získání správného BCD výsledku 8716.
0011 1001 39 + 0100 1000 48 ----------- 1000 0001 81, binární výsledek + 0110 06, úprava ----------- 1000 0111 87, upravený BCD výsledek
Podobným způsobem se musí postupovat i u vyšší číslice v bytu: pokud sčítání dává nedesítkovou vyšší číslici, musí se k výsledku přičíst 6016 pro získání správného BCD výsledku. Například sečtení 7216 a 7316 dává E516. Protože významnější číslice tohoto součtu není desítková (E), je nutné výsledek opravit přičtením hodnoty 6016. Přitom nejvyšší číslice 1 bude uložena do příznaku přenosu.)
0111 0010 72 + 0111 0011 73 ----------- 1110 0101 E5, binární výsledek + 0110 60, úprava ----------- 1 0100 0101 145, upravený BCD výsledek
Shrnuto: jestliže binární sčítání nastaví příznak polovičního přenosu nebo výsledek obsahuje nedesítkovou nižší číslici, výsledek musí být opraven přičtením 0616; jestliže binární sčítání nastaví příznak přenosu nebo výsledek obsahuje nedesítkovou vyšší číslici, musí být výsledek opraven přičtením 6016. Tyto úpravy provádí instrukce DAA
(anglicky Decimal adjust after addition), kterou je třeba provést po sečtení každé dvojice bytů při výpočtech s binárně kódovanými desítkovými čísly.[3]
Odkazy
Reference
V tomto článku byl použit překlad textu z článku Half-carry flag na anglické Wikipedii.
- Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference Manual [PDF]. [cit. 2017-11-23]. Dostupné online.
- Motorola MC68000 Family Programmer's Reference Manual [PDF]. [cit. 2017-11-23]. Dostupné v archivu pořízeném dne 2015-09-24.
- 8080/8085 Assembly Language Programming Manual [PDF]. Intel, 1977, 1978, 1979, 1981 [cit. 2017-11-23]. Dostupné online.