Intel BCD opcode - Intel BCD opcode

Na Intel BCD operační kódy jsou souborem šesti x86 instrukcí , které pracují s BCD čísel. Radix používá k reprezentaci čísel v x 86 procesorů je 2. To se nazývá binární číselné soustavy . Procesory x86 však mají pro systém s desítkovými číslicemi omezenou podporu .

Kromě toho, X87 část podporuje jedinečné 18-místné (deset bajt) BCD formátu, který může být vložen do a uloženou z plovoucí desetinnou čárkou registrů, odkud může být provedeno běžné FP výpočty.

Celočíselné instrukce BCD již nejsou v dlouhém režimu podporovány .

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)
  • Rozbaleno (8 bitů)
    • V rozbaleném desítkovém vyjádření je desetinná číslice uložena v jednom bajtu .
    • Hodnoty 10 až 255 se nepoužívají.
    • Horní okusování je ignorováno a může být buď nula, nebo úvodní okusování pro znak ASCII (hodnota 3).

Hodnoty se obecně považují za uložené v dolních 8 bitech registru, např. AL.

Přidávání

Přímo lze přidat pouze desetinná čísla od 0 do 99 .

Nejprve jsou čísla přidána jako obvykle pomocí add (nebo adc, pokud potřebujete příznak carry ). 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 je upraven 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, procesor přidá k výsledku 96 (6krát 16) a nastaví příznak přenosu.
  • Rozbaleno
    • Výsledek je upraven pomocí aaa (úprava ASCII po přidání): Pokud je nejméně významný nibble výsledku 10 nebo vyšší, procesor k němu 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.

Odčítání

Přímo lze odečíst pouze desetinná čísla od 0 do 99 . Nejprve se čísla odečtou jako obvykle pomocí sub (nebo sbb, pokud potřebujete příznak carry). 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 je upraven pomocí das (desítkové úpravy po odečtení): Pokud je nejméně významná okusování výsledku 10 nebo vyšší, nebo je-li nastaven příznak úpravy, procesor odečte od výsledku 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.
  • Rozbaleno
    • Výsledek je upraven pomocí aas (ASCII upravit po odečtení): Pokud je nejméně významná nibble 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.

Násobení

Podporována je pouze rozbalená reprezentace. Lze vynásobit pouze dvě jednociferná čísla .

Nejprve se číslice vynásobí jako obvykle pomocí mul .

Potom je výsledek upraven pomocí aam (ASCII adjust for multiplication): Procesor vydělí výsledek deseti a uloží kvocient (jen integrální část) do nejvýznamnějšího bajtu výsledku a zbytek do nejméně významného bajtu výsledku .

Divize

Podporována je pouze rozbalená reprezentace. Operandy musí spadat do rozsahu 0 až 99.

Nejprve jsou operandy převedeny na normální binární reprezentaci pomocí aad (ASCII upravit před rozdělením): Procesor převádí čí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 dělení se získají jako obvykle pomocí div a budou přítomny v normální binární reprezentaci.

V x87

X87 koprocesor má podporu BCD v podobě dvojice zatížení (FBLD) a store-and-pop (FBSTP) instrukcí. 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 normální 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.

80bitový formát se dělí 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á čísla (BCD) se používají k ukládání desetinných čísel, zejména ve finančním softwaru.

Výše uvedené operační kódy poskytují základní podporu x86 x86.

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. Pokud provádíme pouze celočíselné výpočty, pak jsou všechny celočíselné výpočty přesné, takže radix reprezentace čísla 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.

Viz také

Reference