Intel BCD operační kód - Intel BCD opcode
The Intel BCD opcodes jsou sada šesti x86 instrukce které pracují s binárně kódováno desítkově čísla. The základ slouží k reprezentaci čísel v x86 procesory je 2. Tomu se říká a binární číselná soustava. Procesory x86 však mají omezenou podporu pro desetinný číselný systém.
Kromě toho x87 část podporuje jedinečný 18místný (desetibajtový) formát BCD, který lze načíst do a uložit z plovoucí bod registry, odkud lze provádět běžné výpočty FP.[1]
Celočíselné pokyny BCD již nejsou podporovány dlouhý režim.
Používání
Číselné vyjádření
Čísla BCD mohou být v celočíselných registrech zastoupena dvěma způsoby: zabalené desítkové a rozbalené desítkové.
- Zabaleno (4 bity)
- V zabaleném desítkovém vyjádření a desetinná číslice je uložen v jednom okusovat.
- Hodnoty 10 až 15 se nepoužívají.[2]
- Rozbaleno (8 bitů)
Hodnoty se obecně považují za uložené v dolních 8 bitech registru, např. AL.
Přidávání
Mohou být pouze desetinná čísla od 0 do 99 přidané přímo.
Nejprve jsou čísla přidána jako obvykle pomocí přidat (nebo příd pokud potřebujete nést vlajku ). Procesor nastaví nastavovací příznak, pokud je součet obou nižších nibbles 16 nebo vyšší, a nosný příznak, pokud je součet obou bytů 256 nebo vyšší.
Poté je výsledek upraven v závislosti na číselném vyjádření.
- Zabaleno
- Výsledek se upravuje pomocí daa (desítková úprava po přidání): Pokud je nejméně významná okusování výsledku 10 nebo vyšší, nebo pokud je nastaven příznak úpravy, procesor přidá k výsledku 6 a zahodí jakékoli přetečení okusování.
- Pak, pokud je nejvýznamnější okusování výsledku 10 nebo vyšší, nebo pokud je nastaven příznak přenosu, přidá procesor k výsledku 96 (6krát 16) a nastaví příznak přenosu.[2][3]
- Rozbaleno
- Výsledek se upravuje pomocí aaa (Úprava ASCII po přidání): Pokud je nejméně významná nibble výsledku 10 nebo vyšší, procesor k ní přidá 6 a zahodí jakékoli přetečení nibble a uloží jej do nejméně významného bajtu.
- Nejvýznamnější bajt je zvýšen.
- Všimněte si, že v tomto okamžiku nejvýznamnější bajt nemusí obsahovat platné desetinné číslo.[2][3]
Odčítání
Mohou být pouze desetinná čísla od 0 do 99 odečteno Nejprve jsou čísla odečteno jako obvykle pomocí sub (nebo sbb pokud potřebujete vlajku). Procesor nastaví příznak úpravy, pokud došlo k výpůjčce v nejméně významném okusování, a příznak přenosu, pokud došlo k výpůjčce v nejvýznamnějším okusování.
- Zabaleno
- Výsledek se upravuje pomocí das (desítková úprava po odečtení): Pokud je nejméně významná okusování výsledku 10 nebo vyšší, nebo pokud je nastaven příznak úpravy, procesor od výsledku odečte 6.
- Pak, pokud je nejvýznamnější okusování výsledku 10 nebo vyšší, nebo pokud je nastaven příznak přenosu, procesor odečte od výsledku 96 (6krát 16) a nastaví příznak přenosu.[2][3]
- Rozbaleno
- Výsledek se upravuje pomocí aas (Úprava ASCII po odečtení): Pokud je nejméně významná okusování výsledku 10 nebo vyšší, procesor od ní odečte 6 a uloží jej do nejméně významného bajtu.
- Nejvýznamnější bajt je snížen.
- Všimněte si, že v tomto okamžiku nejvýznamnější bajt nemusí obsahovat platné desetinné číslo.[2][3]
Násobení
Podporována je pouze rozbalená reprezentace. Mohou být pouze dvě jednociferná čísla znásobeno.
Nejprve se číslice vynásobí obvyklým způsobem mul.
Poté je výsledek upraven pomocí aam (ASCII adjust for multiplication): Procesor vydělí výsledek deseti a uloží kvocient (jen integrální část) v nejvýznamnějším bajtu výsledku a zbytek v nejméně významném bajtu výsledku.[2][3]
Divize
Podporována je pouze rozbalená reprezentace. Příkazy musí spadat do rozsahu 0 až 99.
Nejprve jsou operandy převedeny na normální binární reprezentaci pomocí aad (ASCII adjust before division): Procesor převede čísla vynásobením nejvýznamnějšího bajtu číslem 10 a přidáním nejméně významného bajtu. Kvocient a zbytek divize jsou získány obvyklým způsobem div, a bude přítomen v normálním binárním vyjádření.[2][3]
V x87
The x87 koprocesor má podporu BCD ve formě instrukcí dvojice zátěží (FBLD) a ukládání a vyskakování (FBSTP). První načte 80bitové celé číslo BCD do FPU, zatímco druhý zapíše hodnotu FPU jako 80bitovou celočíselnou hodnotu do paměti. Uvnitř FPU jsou hodnoty uloženy jako obvykle Plováky s prodlouženou přesností x87. Na rozdíl od celočíselných verzí zůstávají tyto dvě pokyny k dispozici v dlouhém režimu.[1]
80bitový formát je rozdělen na následující:
79 | 78 .. 72 | 71 .. 0 |
---|---|---|
Podepsat | Nepoužitý (0) | 18 zabalených číslic |
K dispozici je speciální „neurčitá“ hodnota kódovaná jako FFFFC000000000000000h.
aplikace
Binárně kódované desetinné místo Čísla (BCD) se používají k ukládání desetinných čísel, zejména ve finančním softwaru.[2]
The opcodes výše uvedené poskytují základní podporu x86 x86.[2]
Alternativy
Přidávání čísel BCD pomocí těchto operačních kódů je složitý úkol a vyžaduje mnoho pokynů k přidání i skromných čísel. Může také vyžadovat velké množství paměti.[2] Pokud provádíme pouze celočíselné výpočty, pak jsou všechny celočíselné výpočty přesné, takže radix číselného vyjádření není pro přesnost důležitý. Na procesoru x86 jsou výpočty s binárními čísly obvykle mnohem rychlejší než stejné výpočty s čísly BCD.[2]
Viz také
Reference
- ^ A b "4,7 BCD a plná celá čísla BCD". Příručka pro vývojáře softwaru Intel 64 a IA-32 Architectures, svazek 1: Základní architektura (PDF). Verze 072. 1. Intel Corporation. 2020-05-27 [1997]. s. 3–2, 4–9–4–11 [4–10]. 253665-072US. Archivováno (PDF) z původního dne 2020-08-06. Citováno 2020-08-06.
[…] Při provozu na Celá čísla BCD v univerzální registry, hodnoty BCD mohou být rozbaleno (jedna číslice BCD na bajt) nebo zabaleno (dvě BCD číslice na bajt). Hodnota nerozbaleného celého čísla BCD je binární hodnota minima poloviční bajt (bity 0 až 3). Vysoký půlbajt (bity 4 až 7) může mít jakoukoli hodnotu během sčítání a odčítání, ale během násobení a dělení musí být nulový. Zabalená celá čísla BCD umožňují obsazení dvou číslic BCD v jednom bajtu. Zde je číslice ve vysokém půlbajtu významnější než číslice ve spodním půlbajtu. […] Při provozu na celá čísla BCD v x87 FPU datové registry, hodnoty BCD jsou zabaleny v 80bitovém formátu a označovány jako celá desetinná čísla. V tomto formátu obsahuje prvních 9 bajtů 18 číslic BCD, 2 číslice na bajt. The nejméně významná číslice je obsažen ve spodním půlbajtu bajtu 0 a nejvýznamnější číslice je obsažen v horní polovině bajtu bajtu 9. Nejvýznamnější bit bajtu 10 obsahuje znamení bit (0 = kladné a 1 = záporné; bity 0 až 6 bajtu 10 jsou je mi to jedno bitů). Záporná desetinná celá čísla nejsou uložena v doplněk dvou formulář; odlišují se od kladných celých desetinných čísel pouze znaménkovým bitem. Rozsah celých desetinných čísel, která lze v tomto formátu zakódovat, je −1018 + 1 až 1018 - 1. Desetinné celé číslo existuje pouze v paměti. Když je desítkové celé číslo načteno do datového registru FPU x87, je automaticky převedeno na formát s plovoucí desetinnou čárkou s dvojitou prodlouženou přesností. Všechna desetinná celá čísla jsou přesně reprezentovatelná ve formátu dvojité rozšířené přesnosti. […]
[1] - ^ A b C d E F G h i j k l Hyde, Randall (Září 2003). Desetinná aritmetika. Umění programování jazyků shromáždění. Žádný lis na škrob. Archivovány od originál dne 11. 11. 2008. Citováno 2008-10-18.
- ^ A b C d E F Svazek 2A: Reference instrukční sady, A-M (PDF). Příručka pro vývojáře softwaru Intel 64 a IA-32 Architectures. 2A. Intel Corporation. 17. 05. 2007. Archivovány od originál (PDF) dne 15. 3. 2008. Citováno 2007-06-27.