Article View: pl.comp.lang.asm
Article #2559Re: Konwersja dużych liczb
From: Kamil
Date: Tue, 10 Sep 2013 20:27
Date: Tue, 10 Sep 2013 20:27
68 lines
4232 bytes
4232 bytes
Użytkownik "Bogdan (bogdro)" napisał:
>> [code]
>>
>> pobieraj:
>> mov bl, [esi]
>> cmp bl, 0
>> jz _do_ret
>> cmp bl, 20h
>> jz pomin
>> cmp bl, 40h
>> ja _blad1
>
> Jeśli chciałeś tym odfiltrować tylko cyfry, to jest w tym drobny
> błędzik. Jeśli dobrze pamiętam, znak dwukropka przejdzie ten test, bo
> dwukropek to 3A. '9' < 3a < 40h. Tak więc powinno być pewnie
> cmp bl, '9'
> ja _blad1
> Ale może tak to było zaprojektowane (może inny mechanizm w kontrolce
> nie pozwoli na wpisanie innego znaku).
> Jeśli faktycznie miały być brane tylko cyfry, to czytelniej, moim
> zdaniem, będzie tak:
>
> cmp bl, ' '
> jz pomin
> cmp bl, '0'
> jb _blad1
> cmp bl, '9'
> ja _blad1
>
> Kompilator sam wstawi odpowiednie wartości bajtów w miejsce spacji ('
> '), znaku '0' i '9'.
To akurat nie moja procedura. Ściągnąłem ją z sieci i nie ruszałem.
Faktycznie można wyrzucić te sprawdzenie bo kontrolkę mam zadeklarowaną jako
ES_NUMBER i oprócz cyfr niczego nie przyjmie.
>> Można się załamać szukając tak prostej przyczyny. Czy teraz jest już
>> wystarczająca ilość adc? Ile ich powinno być, aby być całkowicie pewnym?
> A tak mi się coś właśnie wydawało, że te bufory jakichś dziwnych
> długości były, ale nie przyjrzałem się dość dokładnie.
Jakich dziwnych d ługości? :) 512B. Na wszelki. Jak mnożę dwie liczby po
128B to już mam wynik co najmniej 256B. Od przybytku ...
> Dodawanie (ADD i ADC) będzie tylko w mnożeniu i dodawaniu.
> Wynik mnożenia może mieć co najwyżej tyle bitów, ile bitów miały
> łącznie wszystkie czynniki. Jeśli mnożysz dwie liczby 32-bitowe, wynik
> nie przekroczy 64 bitów (więc mieści się w EDX:EAX). Jeśli mnożysz
> dwie liczby 128-bitowe (po 4 dwordy każda), wynik nie przekroczy 256
> bitów (8 dwordów).
> Innymi słowy, gdy pobierasz liczbę np. dwa razy (w dwóch częściach) -
> z [ESI] i [ESI+4], instrukcje dodawania (pierwsze ADD i dalsze ADC)
> musisz powtórzyć 4 razy, np. do [EDI], [EDI+4], [EDI+8] i [EDI+12].
> Jeśli po ostatniej z tych instrukcji flaga CF jest ustawiona, to masz
> przepełnienie.
> A w dodawaniu instrukcje ADD/ADC powtarzasz tyle razy, ile ma dłuższy
> ze składników sumy. Dla liczb 128-bitowych (4 dwordy) piszesz łącznie
> 4 instrukcje - jedną ADD i trzy ADC, jak w przykładzie powyżej.
Właśnie. Jakieś zaćmienie. Swego czasu śledziłem w debuggerze jakieś duże
mnożenie i musiałem dodawać dużo ADC. Lepiej dać jedno więcej, niż o jedno
za mało. W programie, który ma kilka tysięcy linii kodu plus kilkanaście
funkcji wywoływanych z DLL-k łatwo coś przeoczyć, a asembler tego nie
wybacza.
Pozdrawiam i jeszcze raz dziękuję.
Technical Details
Message-ID:
<522f80e7$1$1253$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!newsfeed.pionier.net.pl!feeder.erje.net!eu.feeder.erje.net!newsfeed.fsmpi.rwth-aachen.de!feeder1-2.proxad.net!proxad.net!feeder2-2.proxad.net!nx02.iad01.newshosting.com!newshosting.com!newsfeed.neostrada.pl!unt-exc-02.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> <522b5a7a$0$1263$65785112@news.neostrada.pl> <522c61b4$0$1470$65785112@news.neostrada.pl> <522dfbe2$0$1267$65785112@news.neostrada.pl> <522ef313$0$1261$65785112@news.neostrada.pl> <522f5be5$0$1450$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!newsfeed.pionier.net.pl!feeder.erje.net!eu.feeder.erje.net!newsfeed.fsmpi.rwth-aachen.de!feeder1-2.proxad.net!proxad.net!feeder2-2.proxad.net!nx02.iad01.newshosting.com!newshosting.com!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail From: "Kamil" <nospam@tlen.pl> Newsgroups: pl.comp.lang.asm References: <52239cda$0$1225$65785112@news.neostrada.pl> <522a0fcd$0$1459$65785112@news.neostrada.pl> <522a4a2c$0$1268$65785112@news.neostrada.pl> <522b5a7a$0$1263$65785112@news.neostrada.pl> <522c61b4$0$1470$65785112@news.neostrada.pl> <522dfbe2$0$1267$65785112@news.neostrada.pl> <522ef313$0$1261$65785112@news.neostrada.pl> <522f5be5$0$1450$65785112@news.neostrada.pl> Subject: Re: Konwersja dużych liczb Date: Tue, 10 Sep 2013 22:27:38 +0200 MIME-Version: 1.0 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.2180 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 Lines: 69 Message-ID: <522f80e7$1$1253$65785112@news.neostrada.pl> Organization: Telekomunikacja Polska NNTP-Posting-Host: 83.7.27.51 X-Trace: 1378844903 unt-rea-a-02.news.neostrada.pl 1253 83.7.27.51:2494 X-Complaints-To: abuse@news.neostrada.pl Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit