Article View: pl.comp.lang.asm
Article #2553Re: Konwersja dużych liczb
From: Bogdan (bogdro)
Date: Sat, 07 Sep 2013 16:55
Date: Sat, 07 Sep 2013 16:55
68 lines
4534 bytes
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-mailReferences:
<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