Article View: pl.comp.lang.asm
Article #1509Re: Longhand Division in Binary
From: Bogdan (bogdro)
Date: Thu, 11 Oct 2007 15:48
Date: Thu, 11 Oct 2007 15:48
134 lines
5171 bytes
5171 bytes
Remek pisze:
> > Użytkownik "Bogdan (bogdro)"
> >
>> >> 1. Źle przetłumaczone linie
> >
>> >> QuotAdrs db 128 dup (0)
>> >> RmndrAdrs db 128 dup (0)
> >
>> >> Var, jak w Pascalu, oznacza wskaźnik. Ale patrząc na resztę kodu,
>> >> chyba nie robi to problemów, o ile wynik bierzesz z QuotAdrs i
> > RmndrAdrs.
> >
> > Jak powinny być zadeklarowane te linie? Uznałem je za bufory
łańcuchowe.
Jak wskaźnik, to DD.
QuotAdrs dd addr Quotient ; czy "offset" czy jak to tam jest.
Jak się nie da zainicjować w czasie kompilacji, wstawia się tam
ręcznie. Po prostu do procedury był przekazywany adres zmiennych,
które mają otrzymać wynik. Ty masz te wynikowe zmienne widoczne od
razu, więc nie musisz stosować tych wskaźników. Dlatego powiedziałem,
że nie robi to problemów, bo zapisujesz bezpośrednio do zmiennych
wynikowych i pomieszczą one wynik.
>> >> 2. Nieprzetłumaczone są linie
> >
>> >> mov( 0, eax ); // Set the remainder to zero.
>> >> mov( eax, Remainder[0] );
>> >> mov( eax, Remainder[4] );
>> >> mov( eax, Remainder[8] );
>> >> mov( eax, Remainder[12]);
> >
> > Są przetłumaczone w innym miejscu, w procedurze czyszczenia wszystkich
> > buforów.
Dobrze. Byleby ta procedura czyszcząca uruchamiana była za każdym
razem (ostatnimi razy była, jak pamiętam).
>> >> 3. Linia
>> >> cmp dword ptr dword ptr Divisor[12], eax
>> >> zawiera coś zbędnego, ale to też nie problem.
> >
> > No tak. Przepuściłem to. Dziwne, że kompilator nie protestuje. Używany
> > przeze mnie edytor tekstowy czasem robi mi takie numery.
> >
> > Sam znalazłem już jeden błąd. Linie:
> >
> > shl Dividend, 1
> > rcl Dividend+4, 1
> > rcl Dividend+8, 1
> > rcl Dividend+12, 1
> >
> > rcl Remainder, 1
> > rcl Remainder+4, 1
> > rcl Remainder+8, 1
> > rcl Remainder+12, 1
> >
> > kompilator przetłumaczył na:
> >
> > shl byte Dividend, 1
> > rcl byte Dividend+4, 1
> > rcl byte Dividend+8, 1
> > rcl byte Dividend+12, 1
> >
> > rcl byte Remainder, 1
> > rcl byte Remainder+4, 1
> > rcl byte Remainder+8, 1
> > rcl byte Remainder+12, 1
> >
> > co powodowało oczywiście nieprawidłowe działanie
To jest właśnie minus pamiętania typów. W NASMie by to nie przeszło.
Trzeba byłoby jawnie napisać typ danych i człowiek by się zastanowił.
Zapisz swoje zmienne jako tablice dwordów, nie bajtów:
Remainder dd 4 dup(0)
I tak z każdą. Może błąd się sam naprawi. Choć czytaj najpierw niżej,
bo odkopałem coś jeszcze.
> > i teraz jest obrabiany cały dword, ale i tak wyniki są złe. Muszę
szukać
> > dalej. Nie rozumiem np. po co są potrzebne linie:
> >
> > ;mov edi, QuotAdrs ; oryginał
> > lea edi, QuotAdrs ; moje tłumaczenie
> >
> > mov eax, dword ptr Quotient
> > mov [edi], eax
[...]
> > Po co przenosić z bufora1 do bufora2? Mogę równie dobrze pobrać te
> > same dane zarówno z bufor1 jak i z bufor2. Chyba, że źle to rozumiem
> > i to może być przyczyna.
Napisałem wcześniej, jak to miało być z tą procedurą - założenie
(prawidłowe) jest, że nie widzi ona zmiennych, do których ma zapisać
wynik, a jedynie adres do nich i stąd to zapisywanie. Prototyp wygląda
tak:
procedure div128
( Dividend: t128; Divisor: t128; var QuotAdrs: t128; var RmndrAdrs:
t128);
Co po przełożeniu na C daje
void div128 (t128 Dividend, t128 Divisor, t128 * QuotAdrs, t128 *
RmndrAdrs);
Tak sobie jeszcze myślę: masz samotną dyrektywę .if
.if ;( #{
Jak byłbym MASMem32, mógłbym ją zinterpretować jako
.if 0
i kod między .if a .endif byłby zawsze pomijany w programie.
Zakomentuj .if i .endif, bo i tak są niepotrzebne.
Ponadto, blok _true, czyli "Remainder := Remainder - Divisor" źle
przerobiłeś - to nie jest odejmowanie wielokrotnej precyzji, a w
oryginale tak było.
--
Pozdrawiam/Regards - Bogdan (Linux & FreeDOS)
Kurs asemblera x86 (DOS & Linux): http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Technical Details
Message-ID:
<felgkn$3ij$1@inews.gazeta.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailReferences:
<feggr4$9v0$1@inews.gazeta.pl> <fej2ar$7u6$1@inews.gazeta.pl> <fejgi7$j05$1@inews.gazeta.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> Newsgroups: pl.comp.lang.asm Subject: Re: Longhand Division in Binary Date: Thu, 11 Oct 2007 17:48:37 +0200 Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 134 Message-ID: <felgkn$3ij$1@inews.gazeta.pl> References: <feggr4$9v0$1@inews.gazeta.pl> <fej2ar$7u6$1@inews.gazeta.pl> <fejgi7$j05$1@inews.gazeta.pl> NNTP-Posting-Host: echo931.server4you.de Mime-Version: 1.0 X-Trace: inews.gazeta.pl 1192117722 3667 85.25.141.60 (11 Oct 2007 15:48:42 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Thu, 11 Oct 2007 15:48:42 +0000 (UTC) X-User: bog.d In-Reply-To: <fejgi7$j05$1@inews.gazeta.pl> User-Agent: Thunderbird 2.0.0.6 (X11/20070728) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit