🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #2553

Re: Konwersja dużych liczb

#2553
From: Bogdan (bogdro)
Date: Sat, 07 Sep 2013 16:55
68 lines
4534 bytes
W dniu 06.09.2013 23:33, Kamil pisze:
> Użytkownik "Bogdan (bogdro)" napisał:
> 
>> Trochę nie rozumiem, przyznaję. Po wczytaniu do pamięci lub rejestru
>> każda liczba jest w takiej postaci, jaką chcesz - możesz ją traktować
>> jako szesnastkową, dziesiętną, dwójkową itd.
> 
> Może podałem za mało danych. Chodzi o Windows i Masm32.
> 
> Mam kalkulator, który ma np. dodawać liczby dec. Funkcja
> GetDlgItemText wczytuje liczby dec z kontrolki zamieniając je na
> ASCII.

 Tak właściwie, to już są w ASCII. Funkcja po prostu umieszcza tekst w
buforze, nie konwertuje sama sobie np. cyfry "1" na wartość 31h, bo
to, co robi za cyfrę "1", już ma wartość 31h.

> Jeśli mam w kontrolce 123, to po ich wczytaniu w buforze jest
> już 313233. Taka postać nie nadaje się do dalszych obliczeń. Trzeba
> "oczyścić" te dane z ASCII, czyli doprowadzić do postaci 123, a
> następnie zamienić na hex czyli 7B, bo tylko taka postać nadaje się do
> dalszych działań. Po wykonaniu dodawania trzeba wynik przekształcić na
> dec, czyli jeśli wynikiem dodawania będzie F6h to trzeba to
> przekonwertować na 246 i następnie zrobić z tego ASCII - 323436 i to
> dopiero podać na ekran. Podałem liczby przykładowe, króre nie stanowią
> problemu bo mieszczą się w rejestrach. Natomiast pod to rozumowanie
> podstawmy liczby np 128 bajtowe i przeprowadźmy po kolei te wszystkie
> potrzebne konwersje.

 Dobrze, to kroki powinny być takie:

1. Oczyszczanie z ASCII: iterujemy po jednym znaku na raz:
 a) wczytaj kolejny znak z bufora (od przodu)
 b) odejmij 30h (kod zera w ASCII) lub po prostu '0' czy "0"
 c) bieżącą liczbę pomnóż przez 10 (mnożenie wielokrotnej precyzji z
mojej strony)
 d) do bieżącej liczby dodaj znak pomniejszony o 30h w punkcie b) - tu
nie trzeba dodawania wielokrotnej precyzji

2. Zamieniać na hex w pamięci już nie musisz. Tak, jak pisałem, liczba
otrzymana w punkcie 1 jest już w pamięci komputera (równocześnie w
systemie binarnym, szesnastkowym dziesiętnym, ósemkowym czy jaki tam
akurat trzeba). Bity to bity, a to, jak te dane potraktujesz, zależy
tylko od Ciebie. Gdybyś, na przykład wykonał kroki z punktu 1 dla
ciągu znaków "10", to w pamięci już po kroku pierwszym miałbyś 0A.

3. Mając tak przygotowane dane wejściowe, wykonujesz odpowiednie
działanie (dodawanie, odejmowanie itp.).

4. Zamieniać na postać dziesiętną w pamięci nie musisz.

5. Konwersja na ASCII: najlepiej też metoda po jednym znaku na raz:
 a) wyczyść bufor podręczny i wyjściowy
 b) jeśli liczba jest zerem, to przejdź do g)
 c) dzielimy liczbę przez 10 (dzielenie wielokrotnej precyzji)
 d) do RESZTY z dzielenia dodajemy '0' (lub 30h)
 e) zmienioną resztę z dzielenia zapisujemy w buforze podręcznym
 f) wracamy do punktu a)
 g) w buforze wyjściowym zapisz reszty z dzielenia znajdujące się w
buforze podręcznym, ale WSPAK (pierwszy bajt ma być ostatnim)
 h) wyświetl bufor wyjściowy


-- 
Pozdrawiam/Regards - Bogdan                     (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.Xiph.org   www.TorProject.org   Soft(EN): tinyurl.com/bogdro-soft
Technical Details
Message-ID: <522b5a7a$0$1263$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!diablo1.news.osn.de!news.osn.de!diablo2.news.osn.de!proxad.net!feeder2-2.proxad.net!nx02.iad01.newshosting.com!newshosting.com!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <52239cda$0$1225$65785112@news.neostrada.pl> <522a0fcd$0$1459$65785112@news.neostrada.pl> <522a4a2c$0$1268$65785112@news.neostrada.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!diablo1.news.osn.de!news.osn.de!diablo2.news.osn.de!proxad.net!feeder2-2.proxad.net!nx02.iad01.newshosting.com!newshosting.com!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
Date: Sat, 07 Sep 2013 18:55:21 +0200
From: "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl>
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130801 Thunderbird/17.0.8
MIME-Version: 1.0
Newsgroups: pl.comp.lang.asm
Subject: Re: Konwersja dużych liczb
References: <52239cda$0$1225$65785112@news.neostrada.pl> <522a0fcd$0$1459$65785112@news.neostrada.pl> <522a4a2c$0$1268$65785112@news.neostrada.pl>
In-Reply-To: <522a4a2c$0$1268$65785112@news.neostrada.pl>
Lines: 68
Message-ID: <522b5a7a$0$1263$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: rudy.mif.pg.gda.pl
X-Trace: 1378572923 unt-rea-a-02.news.neostrada.pl 1263 153.19.42.16:34669
X-Complaints-To: abuse@news.neostrada.pl
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit