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.

  1. Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference Manual [PDF]. [cit. 2017-11-23]. Dostupné online. 
  2. Motorola MC68000 Family Programmer's Reference Manual [PDF]. [cit. 2017-11-23]. Dostupné v archivu pořízeném dne 2015-09-24. 
  3. 8080/8085 Assembly Language Programming Manual [PDF]. Intel, 1977, 1978, 1979, 1981 [cit. 2017-11-23]. Dostupné v archivu pořízeném dne 2017-11-17. 

Související články