http://ci5.speccy.cz
LOAD "world"

SinDiKat

ZX Magazin

hw.speccy.cz

ShuCon

LOGOUT

Softhouse ZX Spectrum

http://ci5.speccy.cz/assembler/vypocet-procent-pro-32-bitova-cisla.php
Assembler
začínáme s assemblerem

Výpočet procent pro 32-bitová čísla
4. 6. 2006 20:04 – rubrika Assembler

Rutina, která nám vypočítá procentuální podíl mezi dvěma 32-bitovými čísly, která mohou reprezentovat čísla LBA sektorů.

Když jsem psal program MAKER, potřeboval jsem nějak zobrazit, kolik procent je z celého disku již naformátováno. Vzhledem k tomu, že se používá LBA číslo sektoru, klasické dělení dvou čísel nepřicházelo v úvahu, protože by to trvalo příliš dlouho. Nechtěl jsem zatěžovat uživatele, že bude koukat jen na dlouhá čísla a bude si to jen představovat.

Zeptal jsem se proto velkého mága Ziloga, který mi naznačil nějaký postup, ale u jeho výkladu jsem nebyl moc moudrý. Nakonec mi celý postup dokonale vyložil Baze, oběma borcům velice děkuji.

Postup výpočtu je poměrně jednoduchý a dává přiměřené výsledky. Má jistou nevýhodu, jeho početní rozsah je od 0% do 200%. Nelze jej tedy použít kdykoliv, ale na danou úlohu je perfektní.

Cílem je zjistit, z jakých menších částí (jejich procent) je hledaná hodnota složena. Například číslo 75 ze 100 je složena z 50 a 25. 100% si rozdělíme tak, že ho budeme dělit dvěma (v assembleru jednoduché). Bude to následující řada:

100, 50, 25, 12.5, 6.25, 3.125, 1.5625, …

A my se budeme snažit spočítat, z jakých těchto částí je naše číslo složeno. Číslo, které máme jako proměnlivou hodnotu, nazveme PARTIAL a číslo, které reprezentuje 100% (a které taky známe) nazveme TOTAL. Hodnotu, kterou chceme vypočítat, nazveme VYSLEDEK a bude mít počáteční hodnotu 0.

Odečteme PARTIAL-TOTAL. Je-li výsledek kladný (tj. PARTIAL se do TOTAL vejde a jeste zbyde) je z něho hodnota složena a VYSLEDEK=VYSLEDEK+100 a pak PARTIAL=zbytek. Pak TOTAL vydělime dvěma (bude 50%) a znova odečítáme, ale k dalšímu výsledku přičítáme jen 50 v dalším kole jen 25 atd. Vždy to číslo, které reprezentuje procentuelní stav čísla TOTAL.

Pokud bude výsledek odečítání záporný, pak z této hodnoty výsledek složený není a výsledku si nevšímáme, ale TOTAL vydělíme dvěma a PARTIAL necháváme být.

Zjišťujeme z jakých dílů čísla TOTAL je číslo PARTIAL složené a VYSLEDEK pak prostě zobrazíme. Čím je cyklů více, tím je výsledek přesnější.

Nyní rutina:

;vstupujici parametry:
;bcde = cislo aktualniho sektoru
;na adrese ENDSEC je cislo maximalni (tedy 100%)
PROCENTO:       ld      (PARTIAL),de    ;uloz si cislo
                ld      (PARTIAL+2),bc  ;do pameti
                ld      de,(ENDSEC)     ;zjisti si
                ld      bc,(ENDSEC+2)   ;cislo maximalni
                ld      (TOTAL),de      ;a to si uloz taky
                ld      (TOTAL+2),bc
                xor     a
                ld      (VYSLEDEK),a    ;vynuluj vysledek
                ld      hl,TABULKA      ;ukazatel na tabulku
                ld      b,7             ;7 hodnot
PROC2:          push    bc
                ld      ix,PARTIAL      ;ix=cast
                ld      de,(TOTAL)
                ld      bc,(TOTAL+2)    ;bcde=100%
                ld      a,(ix+0)        ;proved odecteni
                sub     e               ;TOTAL-PARTIAL
                ld      e,a             ;po jednotlivych
                ld      a,(ix+1)        ;bytech
                sbc     a,d
                ld      d,a
                ld      a,(ix+2)
                sbc     a,c
                ld      c,a
                ld      a,(ix+3)
                sbc     a,b
                ld      b,a             ;pokud je carry, je vysledek zaporny
                jr      c,PROC1
                ld      (PARTIAL),de    ;pokud je kladny,uloz vysledek
                ld      (PARTIAL+2),bc  ;na priste
                ld      a,(VYSLEDEK)    ;nacti jiz spocetene cislo
                add     a,(hl)          ;a pricti k ni hodnotu z tabulky
                ld      (VYSLEDEK),a    ;a uloz zpet pro dalsi kolo
PROC1:          inc     hl              ;posun se v tabulce
                ld      ix,TOTAL        ;cele cislo vydel dvema
                srl     (ix+3)
                rr      (ix+2)
                rr      (ix+1)
                rr      (ix+0)
                pop     bc
                djnz    PROC2           ;opakuj 7 krat
                ret

VYSLEDEK:       db      0
TABULKA:        db      100,50,25,12,6,3,1      ;tabulka hodnot procent

PARTIAL:        dw      0,0             ;cislo, ktere potrebujeme zjistit
TOTAL:          dw      0,0             ;hodnota, kterou odecitame
Vytisknout článek

Autor: SweetKomentářů: 3


Starší příspěvky:

Novější příspěvek: Programujeme pro MDOS3 (1) - 17. 6. 2006
Starší příspěvek: 9.díl:čísla – část druhá - 27. 3. 2005

Úplně prehistorické příspěvky najdete v archívu rubriky.


Komentáře:

[1] dex – 4.6.2006 22:02

Cool!

Po delší době na webu opět něco kapku nového (aspoň pro mne) a zajímavého (aspoň pro mne)...

[2] sweet (web) – 12.6.2006 22:18

Ahoj Dexi, jsem rád, že alespoň jednomu člověku moje rutina připadá zajímavá. To mě těší.

[3] z80 – 3.7.2006 22:55

Jeste malickost - jde to udelat bez ztraty presnosti - misto odcitani stale puleneho totalu budeme odecitat porad ten samy total, ale dvojnasobit ten zbytek ;>.


Přidání komentáře
Identifikace autora

Váš komentář

Nepoužívejte HTML značky ani entity, pouze text. URL začínající http:// nebo ftp:// budou zobrazeny jako odkazy (za URL nechejte mezeru, aby byl rozpoznán konec). Vložit můžete maximálně tři odkazy, jinak bude rozpoznán jako spam. Na jiné komentáře se odkazujte zápisem [XX], kde XX je číslo příspěvku. Jeden enter se zformátuje jako nový řádek, více enterů za sebou jako nový odstavec.