🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Konwersja dużych liczb

#2559
From: Kamil
Date: Tue, 10 Sep 2013 20:27
68 lines
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-mail
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>

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