🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
17 messages
17 total messages Started by Remek Tue, 09 Oct 2007 18:23
Longhand Division in Binary
#1506
Author: Remek
Date: Tue, 09 Oct 2007 18:23
11 lines
1254 bytes
Witam

Pod poniższym linkiem są dwa pliki. Jeden z oryginalną procedurą z Art of
Assembly Language - Figure 4.4 w dziale Advanced Arithmetic, i drugi z
moją implementacją tej procedury do składni Masm32. Wyniki działania
programu są nieprawidłowe. Proszę kogoś znającego składnię HLA o
porównanie obydwu procedur i wskazanie ewentualnych błędów.

http://remek62.republika.pl/Tymcz/procedura.zip

Pozdrawiam  Remek
Re: Longhand Division in Binary
#1507
Author: Bogdan (bogdro)
Date: Wed, 10 Oct 2007 17:32
41 lines
2279 bytes
Remek pisze:
> Witam
> 
> Pod poniższym linkiem są dwa pliki. Jeden z oryginalną procedurą z Art of
> Assembly Language - Figure 4.4 w dziale Advanced Arithmetic, i drugi z
> moją implementacją tej procedury do składni Masm32. Wyniki działania
> programu są nieprawidłowe. Proszę kogoś znającego składnię HLA o
> porównanie obydwu procedur i wskazanie ewentualnych błędów.

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.

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]);

  Jak uruchomisz procedurę więcej niż jeden raz bez zerowania, to klops.

3. Linia

            cmp dword ptr dword ptr Divisor[12], eax

   zawiera coś zbędnego, ale to też nie problem.

 Jak to nie pomoże, to się pomyśli więcej. Słowo "remainder" w
kontekście dzielenia matematycznego oznacza resztę.

-- 
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
Re: Longhand Division in Binary
#1508
Author: Remek
Date: Wed, 10 Oct 2007 21:37
94 lines
3325 bytes
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.

> 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.

> 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. Zmieniłem to na:

   shl dword ptr Dividend, 1
   rcl dword ptr Dividend+4, 1
   rcl dword ptr Dividend+8, 1
   rcl dword ptr Dividend+12, 1

   rcl dword ptr Remainder, 1
   rcl dword ptr Remainder+4, 1
   rcl dword ptr Remainder+8, 1
   rcl dword ptr Remainder+12, 1

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

    mov eax, dword ptr Quotient[4]
    mov [edi+4], eax

    .....

    ;mov edi, RmndrAdrs
    lea edi, RmndrAdrs

    mov eax, dword ptr Remainder
    mov [edi], eax
    mov eax, dword ptr Remainder[4]
    mov [edi+4], 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.

Pozdrawiam  Remek
Re: Longhand Division in Binary
#1509
Author: Bogdan (bogdro)
Date: Thu, 11 Oct 2007 15:48
134 lines
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
Re: Longhand Division in Binary
#1510
Author: Remek
Date: Fri, 12 Oct 2007 00:29
74 lines
3086 bytes
Użytkownik "Bogdan (bogdro)" napisał:

> > > 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.

W Masmie

zmienna dd ?

oznacza dworda, który może min. zawierać wskaźnik. Czy o to idzie?

>  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)

Zrobiłem tak jak poniżej i efekt jest bez zmian tzn. błędny wynik.

Dividend1   dd ?
Dividend2   dd ?
Dividend3   dd ?
Dividend4   dd ?

Remainder1  dd ?
Remainder2  dd ?
Remainder3  dd ?
Remainder4  dd ?

Po obróbce te zmienne przerzucam do buforów łańcuchowych typu:

Quotient  db 128 dup (0)
Remainder db 128 dup (0)

To nie ma znaczenia w sumie, bo gdzie jest wynik widzę i potrafię go
pobrać. Chodzi o to, że jest błędny. Czegoś nie rozumiem. Póki co
działanie procedury wydaje mi się bezsensowne. Min. po pierwszym skoku
_true:

            mov eax, dword ptr [Divisor]
            sub dword ptr [Remainder], eax

            mov eax, dword ptr [Divisor+4]
            sbb dword ptr [Remainder+4], eax

            mov eax, dword ptr [Divisor+8]
            sbb dword ptr [Remainder+8], eax

            mov eax, dword ptr [Divisor+12]
            sbb dword ptr [Remainder+12], eax

pierwsze odejmowanie jest od zera i cały bufor oprócz pierwszych czterch
bajtów zapełnia się wartością:

........FFFFFFFFFFFFFFFFFFFFFFFF

A pierwsze cztery bajty zależą od tego co jest wpisane jako dzielnik.


>  Ponadto, blok _true, czyli "Remainder := Remainder - Divisor" źle
> przerobiłeś - to nie jest odejmowanie wielokrotnej precyzji, a w
> oryginale tak było.

Mea culpa. Nie wiem dlaczego? Sprawdzam sto razy i nie widzę takiego
poważnego błędu.

Spróbuję zainstalować HLA, skompilować i zobaczyć jak to działa.
Poprawioną procedurę wrzuciłem na swoją stronę.

Pozdrawiam  Remek
Re: Longhand Division in Binary
#1511
Author: Remek
Date: Sun, 14 Oct 2007 09:57
7 lines
1339 bytes
W HLA nie udaje mi się niczego skompilować. Może ktoś tego używa i
podeśle mi jakiś uniwersalny plik wsadowy? Jeśli chodzi o przedmiotową
procedurę. Nie potrafię znaleźć więcej błędów. Jedyna możliwość jaka mi
pozostała to ewentualne błędy w konstrukcji bloków i logiki skoków. Nie
śmiem podejrzewać błędu w oryginale.

Pozdrawiam  Remek
Re: Longhand Division in Binary
#1512
Author: Bogdan (bogdro)
Date: Sat, 20 Oct 2007 14:00
21 lines
1957 bytes
Remek pisze:
> W HLA nie udaje mi się niczego skompilować. Może ktoś tego używa i
> podeśle mi jakiś uniwersalny plik wsadowy?

 Może nie ustawiłeś np. ścieżek dostępu do programów? Bez komunikatów
trudno cokolwiek powiedzieć. Poczytaj instrukcje instalacji.

> Jeśli chodzi o przedmiotową
> procedurę. Nie potrafię znaleźć więcej błędów. Jedyna możliwość jaka mi
> pozostała to ewentualne błędy w konstrukcji bloków i logiki skoków. Nie
> śmiem podejrzewać błędu w oryginale.

 HLA 1.x przetwarza pliki .hla na pliki MASMa, FASMa i pewnie innych.
Wystarczy tylko podać, by nie kasował plików pośrednich (lub
wygenerował tylko je) i problem z głowy.

-- 
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
Re: Longhand Division in Binary
#1513
Author: Remek
Date: Sat, 20 Oct 2007 18:49
25 lines
1976 bytes
Użytkownik "Bogdan (bogdro)" napisał:

>  Może nie ustawiłeś np. ścieżek dostępu do programów? Bez komunikatów
> trudno cokolwiek powiedzieć. Poczytaj instrukcje instalacji.

Ustawiłem ścieżki zgodnie z instrukcją.

> HLA 1.x przetwarza pliki .hla na pliki MASMa, FASMa i pewnie innych.
> Wystarczy tylko podać, by nie kasował plików pośrednich (lub
> wygenerował tylko je) i problem z głowy.

Tego się doczytałem. Mam:

- na C: katalog HLA i Masm32 (w katalogach oczywiście wszystkie potrzebne
składniki).
- mam plik example.hla

Jak ma wyglądać składnia komendy wpisanej w wierszu poleceń, lub pliku
wsadowym, aby skompilowało się do example.exe, lub choćby do example.obj?

Pozdrawiam  Remek

PS Przepraszam za brak niektórych polskich znaków. To mój OE coś się
biesi uparcie usuwając "ogonki" mimo, że je wpisuję. Skonfigurowany jest
prawidłowo i to zjawisko występuje losowo.
Re: Longhand Division in Binary
#1514
Author: Bogdan (bogdro)
Date: Sun, 21 Oct 2007 09:09
42 lines
2544 bytes
Remek pisze:
> Użytkownik "Bogdan (bogdro)" napisał:
> 
>>  Może nie ustawiłeś np. ścieżek dostępu do programów? Bez komunikatów
>> trudno cokolwiek powiedzieć. Poczytaj instrukcje instalacji.
> 
> Ustawiłem ścieżki zgodnie z instrukcją.

 Czyli zmienne środowiskowe PATH, LIB, HLAINC i HLALIB?

>> HLA 1.x przetwarza pliki .hla na pliki MASMa, FASMa i pewnie innych.
>> Wystarczy tylko podać, by nie kasował plików pośrednich (lub
>> wygenerował tylko je) i problem z głowy.
> 
> Tego się doczytałem. Mam:
> 
> - na C: katalog HLA i Masm32 (w katalogach oczywiście wszystkie potrzebne
> składniki).
> - mam plik example.hla
> 
> Jak ma wyglądać składnia komendy wpisanej w wierszu poleceń, lub pliku
> wsadowym, aby skompilowało się do example.exe, lub choćby do example.obj?

  Na stronie z instrukcjami widzę np.

	hla -v hw.hla

 hla /?, hla /h, hla -h ani hla --help nie działają?

> Pozdrawiam  Remek
> 
> PS Przepraszam za brak niektórych polskich znaków. To mój OE coś się
> biesi uparcie usuwając "ogonki" mimo, że je wpisuję. Skonfigurowany jest
> prawidłowo i to zjawisko występuje losowo.

 Pora na przesiadkę? www.thunderbird.pl

-- 
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
Re: Longhand Division in Binary
#1515
Author: Remek
Date: Sun, 21 Oct 2007 16:04
39 lines
2523 bytes
Użytkownik "Bogdan (bogdro)" napisał:

>  Czyli zmienne środowiskowe PATH, LIB, HLAINC i HLALIB?

W ten sposób:

set hlainc=c:\hla\include
set hlalib=c:\hla\hlalib\hlalib.lib

itd.

> Na stronie z instrukcjami widzę np.

> hla -v hw.hla

> hla /?, hla /h, hla -h ani hla --help nie działają?

Akurat żadna z podanych nie działa :) Działa hla -?. Nie działa natomiast
przekierowanie do pliku tekstowego (to osobny problem). Zrobiłem zrzuty z
ekranu. Prawdę mówiąc liczyłem na gotowca, bo chodzi mi o sprawdzenie
tylko tej jednej procedury dzielenia. Jakoś póki co nie bardzo mnie ten
HLA przekonuje. Udało mi się zmusić go do zrobienia z z pliku *.hla plik
*.asm. I co widzę? Jest to prosty meesagbox. Plik .asm pod Masm 32 ma 21
linijek ze wszystkimi includami i deklaracjami. W C i Pascalu taki plik
źródłowy ma jedną linijkę, a .asm wygenerowany przez HLA ma ich po
dodaniu niezbędnych includów 151. Coś jest nie tak. Masm32 robi z tego
pliku .obj, a linker wyrzuca komunikat:

LINK : error LNK2001: unresolved external symbol _start
tut02.exe : fatal error LNK1120: 1 unresolved externals

Plik tut02.asm wygenerowany z HLA jest tutaj:

http://remek62.republika.pl/Tymcz/tymcz.html

Linie z includami dodałem, bo było więcej błędów. Widocznie zmienne
środowiskowe są nie do końca dobrze zadeklarowane w Autoexec'u

Pozdrawiam  Remek
Re: Longhand Division in Binary
#1516
Author: Bogdan (bogdro)
Date: Mon, 22 Oct 2007 16:18
94 lines
4440 bytes
Remek pisze:
> > Użytkownik "Bogdan (bogdro)" napisał:
> >
>> >>  Czyli zmienne środowiskowe PATH, LIB, HLAINC i HLALIB?
> >
> > W ten sposób:
> >
> > set hlainc=c:\hla\include
> > set hlalib=c:\hla\hlalib\hlalib.lib
> >
> > itd.

 No i dobrze.

>> >> Na stronie z instrukcjami widzę np.
> >
>> >> hla -v hw.hla
> >
>> >> hla /?, hla /h, hla -h ani hla --help nie działają?
> >
> > Akurat żadna z podanych nie działa  :)  Działa hla -?.

 To było takie zgaduj-zgadula z mojej strony, bo nie mam HLA.

> > Nie działa natomiast
> > przekierowanie do pliku tekstowego (to osobny problem). Zrobiłem
zrzuty z
> > ekranu.

 Programik bodajże 'rerror' się nazywa. Przekierowuje wyjście stderr
na stdout, które to da się przekierować do pliku nawet w czymś tak
zaawansowanym jak command.com  :)  No chyba że pomijana jest warstwa
systemowa (w co wątpię).

> > Prawdę mówiąc liczyłem na gotowca, bo chodzi mi o sprawdzenie
> > tylko tej jednej procedury dzielenia.

 Gotowca dostaniesz, jak znajdziesz osobę używającą HLA i chcącą się
podzielić wiedzą. Ja to mogę tylko parę ogólnych rad podać, resztę
musisz doczytać w instrukcjach.

> > Jakoś póki co nie bardzo mnie ten
> > HLA przekonuje. Udało mi się zmusić go do zrobienia z z pliku
*.hla plik
> > *.asm. I co widzę? Jest to prosty meesagbox.

 Jak na windowsowy 'hello, world' przystało  :)  To przeszkadza?
Przecież sam piszesz progsy 32-bitowe z takimi messageboksami. Czy
chodzi o długość?

> > Plik .asm pod Masm 32 ma 21
> > linijek ze wszystkimi includami i deklaracjami. W C i Pascalu taki
plik
> > źródłowy ma jedną linijkę

 Choćbyś całe main() upakował w jedną linię, to #include musi być w
osobnej.  :)  Wiem, to miało być wyolbrzymienie. Zapominasz jednak, że
coś generowane przez automat czasem bywa nadmiarowe, bo nie sposób
wszystkiego przewidzieć.

> >, a .asm wygenerowany przez HLA ma ich po
> > dodaniu niezbędnych includów 151.

 Mnie to nie dziwi. Nie dość, że asemblerze w ogóle kod często jest
dłuższy, to jeszcze widać w nim np. sprawy związane z obsługą
wyjątków, prawda?

> > Coś jest nie tak. Masm32 robi z tego
> > pliku .obj, a linker wyrzuca komunikat:
> >
> > LINK : error LNK2001: unresolved external symbol _start
> > tut02.exe : fatal error LNK1120: 1 unresolved externals

 Tak nie powinno być. Ten symbol pewnie jest z bibliotek HLA. Jeśli
chcesz exe, pozwól, by HLA wykonał całą robotę - od przetwarzania po
linkowanie.

> > Plik tut02.asm wygenerowany z HLA jest tutaj:
> >
> > http://remek62.republika.pl/Tymcz/tymcz.html
> >
> > Linie z includami dodałem, bo było więcej błędów. Widocznie zmienne
> > środowiskowe są nie do końca dobrze zadeklarowane w Autoexec'u

 Możliwe. Albo nie dodajesz na linii poleceń wszystkiego, co potrzeba
linkerowi. Ale skoro już "kompilacja" działa, to czemu nie najedziesz
HLA na procedurę dzielenia, by zobaczyć wynik? To jest (chwilowo)
główny cel, co nie?

-- 
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
Re: Longhand Division in Binary
#1517
Author: Remek
Date: Mon, 22 Oct 2007 21:47
17 lines
1797 bytes
Użytkownik "Bogdan (bogdro)" napisał:

>  Możliwe. Albo nie dodajesz na linii poleceń wszystkiego, co potrzeba
> linkerowi.

Linker dostaje właściwe polecenie. Nie podoba mu się *.obj.

> Ale skoro już "kompilacja" działa, to czemu nie najedziesz
> HLA na procedurę dzielenia, by zobaczyć wynik? To jest (chwilowo)
> główny cel, co nie?

Tak, to jest cel i już próbowałem. Po to cała zabawa, aby zobaczyć *.asm.
Jednak na razie nie wychodzi. Wyskakują błędy. Muszę znaleźć sposób na
implementację samej procedury do jakiegoś gotowego *.hll, bo sam nie
jestem w stanie go zbudować.

Pozdrawiam  Remek
Re: Longhand Division in Binary
#1518
Author: Remek
Date: Mon, 22 Oct 2007 23:15
14 lines
1578 bytes
Napisałem:

> Muszę znaleźć sposób na implementację ...

Udało się. Moja zaimplementowana pod Masm'a i ta wygenerowana przez HLA
są tutaj:

http://remek62.republika.pl/Tymcz/divide128.zip

Wydaje się na pierwszy rzut oka, że są identyczne. Co by oznaczało, że
dobrze ją zaimplementowałem. Jednak działa niedobrze. Jakiś błąd w
założeniach.

 Pozdrawiam  Remek
Re: Longhand Division in Binary
#1519
Author: Bogdan (bogdro)
Date: Tue, 23 Oct 2007 15:12
32 lines
2497 bytes
Remek pisze:
> Napisałem:
> 
>> Muszę znaleźć sposób na implementację ...
> 
> Udało się. Moja zaimplementowana pod Masm'a i ta wygenerowana przez HLA
> są tutaj:
> 
> http://remek62.republika.pl/Tymcz/divide128.zip
> 
> Wydaje się na pierwszy rzut oka, że są identyczne.

 Też mi się tak wcześniej wydawało. Nie odpisałem wcześniej właśnie z
tej przyczyny - już nie widziałem różnic.

> Co by oznaczało, że
> dobrze ją zaimplementowałem. Jednak działa niedobrze. Jakiś błąd w
> założeniach.

 To sprawdź założenia oraz (zwłaszcza?) metodę weryfikacji działania.

 A linkerowi podobał się .obj, tyle że brakowało jakiegoś symbolu
zewnętrznego. Znaczy to tyle, że nawet jeśli linia poleceń była
prawidłowa w sensie składniowym, to była niekompletna. Tak to było?
Skoro już sobie poradziłeś z kompilacją z HLA do EXE, to podaj tu
sposób/plik wsadowy, żeby Google zarchiwizowało dla potomności :)

-- 
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
Re: Longhand Division in Binary
#1520
Author: Remek
Date: Tue, 23 Oct 2007 15:55
28 lines
2408 bytes
Użytkownik "Bogdan (bogdro)" napisał:


> > Jakiś błąd w założeniach.

>  To sprawdź założenia oraz (zwłaszcza?) metodę weryfikacji działania.

Pisząc założenia mam na myśli np. format danych wejściowych. Nie wiem co
dokładnie może oznaczać te 128 bit. Dane traktuję jako liczby hex.
Próbowałem również potraktować dane wejściowe jako liczby binarne, ale
wyniki też są błędne.

>  A linkerowi podobał się .obj, tyle że brakowało jakiegoś symbolu
> zewnętrznego. Znaczy to tyle, że nawet jeśli linia poleceń była
> prawidłowa w sensie składniowym, to była niekompletna. Tak to było?
> Skoro już sobie poradziłeś z kompilacją z HLA do EXE, to podaj tu
> sposób/plik wsadowy, żeby Google zarchiwizowało dla potomności :)

Niestety do .exe nie udało mi się doprowadzić. Poleceniem:

hla\hlaparse.exe  -sm tut02.hla

utworzyłem plik .asm pod Masm32 (zgodnie z instrukcją zastosowałem
wariant via Masm32). Następnie już obrabiam go Masm'em. Po dodaniu
deklaracji includów Masm tworzy .obj, ale nie linkuje. Jak znajdę
przyczynę, wrzucę wszystko na grupę.

Pozdrawiam  Remek
Re: Longhand Division in Binary
#1521
Author: Remek
Date: Tue, 23 Oct 2007 16:00
9 lines
1641 bytes
> To sprawdź ... (zwłaszcza?) metodę weryfikacji działania.

Uzupełniam dla pewności. Wynikiem dzielenia jest zawsze 1 jaki bym nie
wpisał dzielnik i dzielną, aż do momentu kiedy dzielna i dzielnik osiągną
wartość czterech dwordów 0xFFFFFFFF. Wtedy wynikiem jest 0x80. Oczywiście
bezsensowne wyniki działania procedury.


Pozdrawiam  Remek
Re: Longhand Division in Binary
#1522
Author: Remek
Date: Wed, 24 Oct 2007 17:36
59 lines
2621 bytes
Użytkownik "Bogdan (bogdro)" napisał:

>  A linkerowi podobał się .obj, tyle że brakowało jakiegoś symbolu

W pliku .asm należało zmienić:

start:

na:

_start:

Podobno wg Masm'a dla pliku wyjściowego coff jest to wymagane. Jednak mam
na dysku setki plików *.asm tak samo asemblowanych i linkowanych i jakoś
dla nich nie jest to wymagane. No cóż, każdy może mieć swoje humory.
Ważne, że zadziałało.

> Skoro już sobie poradziłeś z kompilacją z HLA do EXE, to podaj tu
> sposób/plik wsadowy, żeby Google zarchiwizowało dla potomności :)

Operacje z *.hll do *.exe via Masm32:

____________________________

Build.bat

C:\hla\hlaparse.exe  -sm tut02.hla

____________________________

Powstaje plik .asm. Dodaję includy:

.........
.model flat, syscall
option noscoped

  include     C:\masm32\include\windows.inc
  include     C:\masm32\include\user32.inc
  include     C:\masm32\include\kernel32.inc
  includelib  C:\masm32\lib\user32.lib
  includelib  C:\masm32\lib\kernel32.lib
  includelib  C:\hla\hlalib\hlalib.lib

I dalej już w Masm.
____________________________

Asembly.bat


@echo off

set name=tut02

 C:\masm32\bin\ml.exe /c /coff /Cp /Sc /Sg %name%.asm
 C:\masm32\bin\link.exe /SUBSYSTEM:WINDOWS,4.0 /entry:start %name%.obj

____________________________

Pozdrawiam  Remek
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads