Re: Konwerter kodu Bin na NKD



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "serwis" <serwis_at_nospam_adomed.com.pl>
Subject: Re: Konwerter kodu Bin na NKD
Date: Thu, 17 May 2001 11:27:52 +0200


Nie podałes na jakim procku chcesz to konwertowac- listy rozkazow bywaja
rozne...

Zasadniczy, bardzo prosty (choc nie najszybszy) algorytm wymaga dzielenia,
oto on:

1. Znajac maksymalna dlugosc liczby binarnej wiesz jaka bedzie max. dlugosc
liczby dziesietnej: to ok. 0,3*dlugosc liczby binarnej (wynik
zaokraglony w gore!) - niech to bedzie N.

2. Trzeba teraz wykonać N-1 dzieleń przez kolejne podstawy dziesiętne,
przykladowo dla bin. 16-o bitowej to N=5 (a wlasciwie 15-o bitowej, bo
najstarsza pozycja to znak), czyli dzielimy kolejno przez: 10000, 1000,
100 i 10 (to sa wartosci dziesietne! musisz sobie je przetworzyc do
postaci binarnej lub zrobi to za ciebie assembler).

3. Algorytm wyglada nastepujaco (polecam pisac go nie jako petle lecz
"ciurkiem" ale z wykorzystaniem podprogramu dzielenia i przesuwania):
a) dzielisz licz. binarna przez najwieksza z podstaw (tu 10000),
b) wynik dzielenia to dla ciebie najwieksza cyfra w wyniku dziesietnym
(N-ta), reszta z dzielenia idzie do dalszej obrobki (ta reszta staje sie
liczba binarna do dalszych dzielen),
c) dzielisz przez nastepna podstawe (tu 1000) wynik znow do kodu
dziesietnego na nastepna mlodsza pozycje, reszta do dalszego dzielenia,
itd.
d) ostatnie dzielenie jest przez 10 - wynik idzie na pozycje dziesiatek
reszta idzie na najmlodsza pozycje (jednostki).

4. Po tym algorytmie wynik dziesietny otrzymujemy jako kolejne (od
najstarszej do najmlodszej) jego cyfry dziesietne. Jak teraz chcemy je
dalej widziec to musimy napisac malenki program adaptacyjny - jesli w kodzie
BCD to nalezy je poupychac kolejno po 4 bity na bajt, jesli chcemy w postaci
znakowj ASCII, to nalezy dodac do kazdego bajtu cyfry wartosc kodu ASCII
liczby 0 (czyli 30hex) itp..

5. Przed rozpoczeciem konwersji trzeba i warto rozdzielic nastepujace
szczegolne wypadki:
a) binarna jest = 0 to od razu wyjsc z wynikiem dziesietnym tez 0,
b) jest dodatnia - przelecieć algorytm jak wyzej,
c) jest ujemna - najpierw trzeba ja zanegowac (przy tym dac jakis znacznik
ujemnosci dla przyszlej liczby dziesietnej) i wykonac algorytm jak wyzej.
Uwaga: to ma byc negacja arytmetyczna (NEG), jesli wykorzystujemy negacje
logiczna (COM) to zaraz nalezy dodac jeden (INC).
d) ostatni wyjatek to najwieksza (dla danej dlugosci) liczba ujemna:
10000000000.. ona nie daje sie zanegowac!!! Na te okolicznosc algorytm
powinien miec przygotowanego gotowca w postaci odpowiadajacej jej
najwiekszej ujemnej liczby dziesietnej, np. dla 16-o bitowych ta liczba
to: -32768.

To byl uniwersalny algorytm do konwersji liczb ZE ZNAKIEM.
Tobie zas chodzi o liczby naturalne, wtedy binarne 1111111111111111 ma byc
traktowane jako dziesietne 65535, a nie -1.
Problem polega na tym, ze prockowe rozkazy dzielenia czy mnozenia traktuja
liczby binarne jako liczby ze znakiem. Aby powyzszy (niezly) algorytm
zadzialal na liczbie binarnej BEZ ZNAKU mamy dwa sposoby:
1. Zaemulowac rozkaz dzielenia bezznakowego podprogramikiem skladajacym sie
z petli odejmowan i przesuniec, przy czym wskaznikiem przepelnienia/pozyczki
powinien byc tylko bit przeniesienia C (mam nadzieje, ze tu dasz sobie sam
rade) - jesli twoj procek nie mial rozkazu dzielenia (DIV) to i tak jestes
skazany na to rozwiazanie. Oczywiscie dyskusja z punktu 5 c) i d) jest
bezprzedmiotowa.
2. Zasosowac powyzszy algorytm bez zmian, ale jesli wynik koncowy jest
ujemny DODAC DZIESIETNIE poprawke w postaci 2 do potegi N, dla 16-o
bitowcow znaczy to, ze poprawiasz wtedy koncowy ujemny wynik dodajac 65536.
Uwaga: bedzie to operacja na odzielnych cyfrach BCD - musisz tu troche
poglowkowac (poniewaz wynik byl ujemny wykonasz wlasciwie odjecie od 65536
tej liczby BCD traktowanej bezznakowo).

Powodzenia

Romi





Użytkownik "Bierutek" <bierut2_at_nospam_poczta.onet.pl> napisał w wiadomości
news:9drhrv$eol$1_at_nospam_news.tpi.pl...
Potrzebuje program przetwarzający kod binarny na naturalny kod dziesiętny