Numărul bcd-urilor ambalate

Așa cum am menționat mai devreme, numerele BCD ambalate pot fi adăugate și scăzute. Pentru a efectua alte acțiuni asupra lor, acestea trebuie să fie în plus convertite fie în format neambalat, fie într-o reprezentare binară. Astfel, numerele BCD ambalate în sine nu sunt foarte interesante pentru programator, așa că le vom examina pe scurt.







În primul rând, să analizăm esența problemei și să încercăm să adăugăm două coduri BCD împachetate în două cifre:

După cum puteți vedea, în formă binară, rezultatul este 1 101 1 100 (sau 220 în reprezentare zecimală), ceea ce este incorect. Acest lucru se datorează faptului că procesorul nu suspectează existența numerelor BCD și le adaugă în conformitate cu regulile de adăugare a numerelor binare. De fapt, rezultatul înregistrării zecimale codate binar trebuie să fie 0001 0100 0010 (sau 142 în notație zecimală). Acest exemplu ilustrează necesitatea ajustării rezultatelor operațiilor aritmetice cu numere BCD ambalate, ca în cazul numerelor BCD neambalate. Pentru a corecta rezultatul adăugării de numere împachetate în scopul prezentării în formă zecimală, procesorul furnizează comanda DAA (Decimal Adjust for Addition).

Comanda DAA convertește conținutul registrului AL în două cifre zecimale (conform algoritmului din Anexa A, unde această comandă este descrisă mai detaliat). Unitatea rezultantă (dacă rezultatul adăugării este mai mare de 99) este stocată în stegulețul CF, luând astfel în considerare transferul la cel mai înalt bit.

Să ilustrăm acest lucru cu un exemplu de adăugare a două numere BCD din două cifre într-un format ambalat (a se vedea Lista 8.12).

Listing 8.12. Adăugarea de numere BCD împachetate

<3> .date, segment de date;

<4> b db 17h, ambalat numărul 17

<5> cu db 45h, ambalat cu numărul 45

<6> suma db 2 dup (0)

<7> .cod, segment de cod

<8> : punct de intrare la program

<10> mov, b

<13> jnc $ + 6; trecerea prin comanda, în cazul în care rezultatul <= 99

<14> suma sumelor + l, ah, contabilitate pentru reportul adăugat (rezultat> 99)







<15> mov sum.al; cifrele junior pentru rezultate ambalate

Similar cu adăugarea, atunci când se scade, procesorul consideră numerele BCD ambalate ca numere binare. Stragem 67 - 75. Deoarece procesorul efectuează scăderea prin adăugare, atunci vom urmări acest lucru:

După cum puteți vedea, rezultatul este 28 în sistemul zecimal, ceea ce este absurd. În zecimale codate binar, rezultatul ar trebui să fie 0000 1000 (sau 8 în notație zecimală). La programarea scăderii numerelor BCD ambalate, programatorul, precum și atunci când se scad numerele BCD neambalate, trebuie să controleze semnul. Acest lucru se face folosind pavilionul CF, care fixează împrumutul din rândul superior. Scăderea foarte mare a numerelor BCD se face prin comanda obișnuită de scădere SUB sau SBB. Corecția rezultatului de scădere pentru reprezentarea sa în formă zecimală este efectuată de comanda DAS (DecimalAdjustforSubstraction).

Aplicația descrie un algoritm prin care comanda DAS convertește conținutul registrului AL în două cifre zecimale ambalate.

Procesorul are instrumente destul de puternice pentru implementarea operațiunilor de calcul. Pentru a face acest lucru, are un bloc de operațiuni întregi și un bloc de operațiuni cu un punct plutitor. Pentru majoritatea sarcinilor care folosesc limbajul de asamblare, aritmetica întregului este suficientă.

Comenzile operațiilor întregi funcționează cu date de două tipuri: numere binare și zecimale binare (numere BCD).

Datele binare pot avea sau nu un semn. Procesorul, de fapt, nu distinge numerele cu și fără semn. Ajută doar la urmărirea schimbării de stat a unor biți ai operanzilor și a stării de steaguri individuale. Operațiile de adăugare și scădere a numerelor semnate și nesemnate sunt efectuate de un singur dispozitiv și de reguli unice.

Controlul asupra corectitudinii rezultatelor și a interpretării lor corecte revine în întregime programatorului. Acesta trebuie să monitorizeze starea semnelor CF și OF ale registrului EFLAGS în timpul procesului de calcul.

Pentru operațiunile cu numere întregi nesemnate, este necesar să se verifice indicatorul CF. Setarea la 1 indică faptul că numărul a depășit bitmap-ul operanzilor.

Pentru numerele cu un semn, setarea semnului OF la 1 înseamnă că, ca rezultat al adăugării numerelor aceluiași semn, rezultatul depășește limita valorilor permise ale numerelor cu un semn în formatul dat și rezultatul însuși schimbă semnul (ordinea dispare).

Ca urmare a efectuării operațiilor aritmetice, sunt de asemenea setate steagurile PF, ZF și SF.

Spre deosebire de comenzile adunării și scăderii, comenzile de multiplicare și de divizare permit examinarea semnelor operand.

Comenzile aritmetice sunt foarte "capricioase" pentru dimensionalitatea operanzilor, astfel încât setul de instrucțiuni pentru procesoare include comenzi speciale care vă permit să urmăriți această caracteristică.

Deși gama de valori de date binare este destul de mare, pentru aplicațiile comerciale nu este suficientă, astfel încât arhitectura procesorului a introdus instrumente pentru a lucra cu așa-numitele date binare-zecimale (BCD).

Datele zecimale binare sunt prezentate în două formate, ambalate și neambalate. Cel mai universal este formatul neambalat.







Articole similare

Trimiteți-le prietenilor: