🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
22 messages
22 total messages Started by Remek Tue, 28 Jun 2011 16:47
Debugger
#2480
Author: Remek
Date: Tue, 28 Jun 2011 16:47
11 lines
1131 bytes
Witam

Czy ma ktos namiary na SoftIce, albo inny debugger o podobnej
funkcjonalności pod Windows XP? Znalazłem w sieci i ściągnąłem SoftIce for
XP, a co okazało się trojanem. Mam GoBug, który pod XP nie chce się
uruchomić.

A z innej beczki. Jest jakaś procedura w assemblezrze służąca do
pierwiastkowania?

Pozdrawiam  Remek
Re: Debugger
#2481
Author: Michoo
Date: Tue, 28 Jun 2011 23:13
19 lines
1491 bytes
W dniu 28.06.2011 18:47, Remek pisze:
> Witam
>
> Czy ma ktos namiary na SoftIce, albo inny debugger o podobnej
> funkcjonalności pod Windows XP? Znalazłem w sieci i ściągnąłem SoftIce for
> XP, a co okazało się trojanem. Mam GoBug, który pod XP nie chce się
> uruchomić.
Co rozumiesz przez "podobnej"? Że rezydentny w kernelu? Imo w większości 
przypadków klasyczny debugger starcza - czy OlyDbg, czy IDA (wersja demo 
nie pozwala zapisywać, ale debugg  dla hobbisty wystrarczy).


> A z innej beczki. Jest jakaś procedura w assemblezrze służąca do
> pierwiastkowania?
Może być fsqrt?

-- 
Pozdrawiam
Michoo
Re: Debugger
#2482
Author: Remek
Date: Wed, 29 Jun 2011 02:51
34 lines
2409 bytes
Użytkownik "Michoo" napisał:

> Co rozumiesz przez "podobnej"?

Możliwości i sposobu obsługi (drugorzędne).

> Imo w większości przypadków klasyczny debugger starcza - czy OlyDbg, czy
IDA (wersja demo
> nie pozwala zapisywać, ale debugg  dla hobbisty wystrarczy).

To ja teraz zapytam. Co to znaczy "klasyczny debuger"? Dla mnie klasyczne są
dwa. Debug i SoftIce :) SoftIce to niedościgniona potęga. Podobno IDA
dorównuje, a nawet przewyższa. Mało używałem IDA, bo mam za mało
dokumentacji, a jak dla mnie obsługa jest skomplikowana. Reszta tej parze
nie dorasta nawet do pięt, chociaż czasem wystarcza. Np. GoBug ma tę zaletę,
że nie kładzie łapy na całym systemie i nie przeszkadza w pracy innym
programom.

> > w assemblezrze służąca do  pierwiastkowania?

> Może być fsqrt?

To jest instrukcja koprocesora, a mnie chodzi o "ręczną" procedurę dla CPU.
Takie procedury stosuję w swoim kalkuratorze. Mogę np. dzielić duże liczby
bez ograniczenia dzielnika do wielkości rejestru. A tego nie da się zrobić
przy pomocy div. Jakiś czas temu ktoś na grupie podrzucił mi kawałek takiej
procedury dzielenia z wykorzystaniem przesunięć i obrotów. Jest genialna i
co ciekawe nie spotkałem jej nigdzie w literaturze, czy tutorialach w sieci.
Nie do końca rozumiem jej działanie, ale co najważniejsze nie ma
ograniczenia dzielnika. Mogę dzielić liczby dowolnej (w sensownych
granicach) wielkości. Póki co rozbudowałem kalkulator do dzielenia liczb 128
bajtowych.

Remek
Re: Debugger
#2483
Author: Michoo
Date: Wed, 29 Jun 2011 22:35
45 lines
2689 bytes
W dniu 29.06.2011 04:51, Remek pisze:
> Użytkownik "Michoo" napisał:
>
>> Co rozumiesz przez "podobnej"?
>
> Możliwości i sposobu obsługi (drugorzędne).
>
>> Imo w większości przypadków klasyczny debugger starcza - czy OlyDbg, czy
> IDA (wersja demo
>> nie pozwala zapisywać, ale debugg  dla hobbisty wystrarczy).
>
> To ja teraz zapytam. Co to znaczy "klasyczny debuger"? Dla mnie klasyczne są
> dwa. Debug i SoftIce :)
Klasyczny uruchamia się jako proces w systemie i debuguje odpalony przez 
siebie inny proces (lub dołącza się do niego). Kernel mode debuger 
ładuje się jako sterownik i może pracować w RT - m.i. debugować system 
operacyjny, śledzić wywołania "głębiej".

> SoftIce to niedościgniona potęga.
Zaczynałem od softice i w sumie nie wspominam go jako specjalnie dobrego 
debuggera - było to przydatne narzędzie w crackowaniu, ale samo 
debuggowanie wspominam jako upierdliwe.

> Podobno IDA
> dorównuje, a nawet przewyższa. Mało używałem IDA, bo mam za mało
> dokumentacji, a jak dla mnie obsługa jest skomplikowana.
IDA ma taką funkcjonalność jak choćby rysowanie grafów przepływu 
sterowania - bywa to bardzo przydatne w zrozumieniu "jak ten kod działa".

Niestety ostatnio bardziej niskopoziomowo na x86 grzebałem w liceum, 
więc jak dokładnie wygląda teraz sytuacja na rynku debuggerów ciężko mi 
powiedzieć.

>>> w assemblezrze służąca do  pierwiastkowania?
>
>> Może być fsqrt?
>
> To jest instrukcja koprocesora, a mnie chodzi o "ręczną" procedurę dla CPU.
Możesz użyć funkcji wykładniczej - jeżeli masz ją już zaimplementowaną.
Jeżeli nie to istnieje kilka metod iteracyjnych - np metoda babilońska:
http://pl.wikipedia.org/wiki/Metody_obliczania_pierwiastka_kwadratowego

-- 
Pozdrawiam
Michoo
Re: Debugger
#2484
Author: Remek
Date: Thu, 30 Jun 2011 13:00
15 lines
1634 bytes
Użytkownik "Michoo" napisał:

> http://pl.wikipedia.org/wiki/Metody_obliczania_pierwiastka_kwadratowego

Dzięki za ten link. Ciekawy materiał. Wymaga czasu do przestudiowania. Póki
co w moim kalkulatorze zastosowałem pierwszą metodę tzn. wstępnego
szacowania. Działa, ale przy większych liczbach widać wyraźne wydłużenie
czasu działania. Sądz, że teoretycy matematycy - informatycy opracowali już
bardziej wydajne (szybsze) algorytmy. Upieram się przy poszukiwaniu metody
wykorzystującej przesunięcia i obroty. Takie procedury sąa bardzo szybkie.

Drugą (babilońską) metodę mam zaimplementowaną, ale tylko do liczby o
wielkości rejestru. Może da się ja rozbudować.

Remek
Re: Debugger
#2485
Author: Michoo
Date: Thu, 30 Jun 2011 15:18
11 lines
1364 bytes
W dniu 30.06.2011 15:00, Remek pisze:
> Upieram się przy poszukiwaniu metody
> wykorzystującej przesunięcia i obroty. Takie procedury sąa bardzo szybkie.
Dla liczb całkowitych liczysz w czasie liniowym względem liczby bitów:
- lecisz od najstarszego bitu do najmłodszego
- jeżeli wynik podniesiony do kwadratu jest mniejszy od wejścia to go 
zostawiasz, jak większy - gasisz. przechodzisz do następnego.

-- 
Pozdrawiam
Michoo
Re: Debugger
#2486
Author: Remek
Date: Thu, 30 Jun 2011 15:25
12 lines
1585 bytes
Użytkownik "Michoo" napisał:

> jeżeli wynik podniesiony do kwadratu jest mniejszy od wejścia to go
> zostawiasz, jak większy - gasisz. przechodzisz do następnego.

I tu mam zagwozkę. Dla liczby o wielkości dword mam "cmp", a jak porównywać
większe liczby? W tych wspomnianych przeze mnie procedurach robione to jest
jakos tak, że równolegle obracane i przesuwane są dzielnik i dzielna (w
procedurze dzielenia) i sygnałem do zakończenia działania jest odpowiednie
ustawienie flag. Nie jestem w stanie tego przeanalizować.

Remek
Re: Debugger
#2487
Author: Bogdan (bogdro)
Date: Thu, 30 Jun 2011 17:03
20 lines
2011 bytes
W dniu 30.06.2011 17:25, Remek pisze:
> Użytkownik "Michoo" napisał:
> 
>> jeżeli wynik podniesiony do kwadratu jest mniejszy od wejścia to go
>> zostawiasz, jak większy - gasisz. przechodzisz do następnego.
> 
> I tu mam zagwozkę. Dla liczby o wielkości dword mam "cmp", a jak porównywać
> większe liczby? W tych wspomnianych przeze mnie procedurach robione to jest
> jakos tak, że równolegle obracane i przesuwane są dzielnik i dzielna (w
> procedurze dzielenia) i sygnałem do zakończenia działania jest odpowiednie
> ustawienie flag. Nie jestem w stanie tego przeanalizować.


http://rudy.mif.pg.gda.pl/~bogdro/dos/a_kurs14.htm

-- 
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): miniurl.pl/bogdro-soft
Re: Debugger
#2488
Author: Remek
Date: Fri, 01 Jul 2011 08:39
28 lines
2040 bytes
Użytkownik "Bogdan (bogdro)" napisał:

> http://rudy.mif.pg.gda.pl/~bogdro/dos/a_kurs14.htm

Chodzi o to?

cmp eax, [arg2+12] ; porównujemy najstarsze części

Chyba telepatycznie mi to przekazałeś, bo w kilka minut po zadaniu pytania
sam na to wpadłem :) Dziwne jak czasem umykają najbardziej oczywiste reguły.
W przypadku mojej procedury wystarczy porównać najstarsze bajty w buforach.

To jeśli chodzi o porównywanie, bo przesunięcia i obroty mam opanowane.
Tyle, że to za mało aby je sprawnie implementować w procedurach konwersji,
dzielenia, mnożenia, czy pierwiastkowania.

Dzięki za odzew.

Remek

PS Na wskazanej stronie pod hasłem ROL jest kilka instrukcji, ale ROL nie
ma. Poza tym warto byłoby opisać różnice w działaniu ROL i RCL. Dokładniej
co prawda omówione są na stronie:

http://rudy.mif.pg.gda.pl/~bogdro/linux/linux13.html

ale jeśli ktoś sam w debuggerze nie zobaczył tych różnic, to z opisu
niekoniecznie zrozumie w czym rzecz.
Re: Debugger
#2489
Author: Bogdan (bogdro)
Date: Fri, 01 Jul 2011 17:01
55 lines
3202 bytes
W dniu 01.07.2011 10:39, Remek pisze:
> Użytkownik "Bogdan (bogdro)" napisał:
> 
>> http://rudy.mif.pg.gda.pl/~bogdro/dos/a_kurs14.htm
> 
> Chodzi o to?
> 
> cmp eax, [arg2+12] ; porównujemy najstarsze części
> 
> Chyba telepatycznie mi to przekazałeś, bo w kilka minut po zadaniu pytania
> sam na to wpadłem :)

 Tak, o to chodzi :)

> Dziwne jak czasem umykają najbardziej oczywiste reguły.
> W przypadku mojej procedury wystarczy porównać najstarsze bajty w buforach.

 To nie najgorzej.

> To jeśli chodzi o porównywanie, bo przesunięcia i obroty mam opanowane.
> Tyle, że to za mało aby je sprawnie implementować w procedurach konwersji,
> dzielenia, mnożenia, czy pierwiastkowania.
> 
> Dzięki za odzew.
> 
> Remek
> 
> PS Na wskazanej stronie pod hasłem ROL jest kilka instrukcji, ale ROL nie
> ma.

 Zgadza się. Jest tak dlatego, gdyż rotacja bitów w liczbach
wielokrotnej precyzji nie jest implementowana przy pomocy instrukcji
ROL. Potrzebujemy flagi CF do trzymania bitów "w pamięci", dlatego ROL
dla takich liczb implementuje się za pomocą kombinacji SHL+RCL i
dopisania ostatniego bitu.

> Poza tym warto byłoby opisać różnice w działaniu ROL i RCL. Dokładniej
> co prawda omówione są na stronie:
> 
> http://rudy.mif.pg.gda.pl/~bogdro/linux/linux13.html
> 
> ale jeśli ktoś sam w debuggerze nie zobaczył tych różnic, to z opisu
> niekoniecznie zrozumie w czym rzecz.

 Idąc po kolei w kursie, strona z wielokrotną precyzją jest tuż po tej
stronie, ale przy wejściu bezpośrednio do części 14. rzeczywiście coś
więcej można byłoby powiedzieć. Pomyślę nad tym. Na razie wpadłem na
to, aby w części 14. podać link do części 13, ale zobaczę, czy i jak
to dokładnie zrobić.

-- 
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): miniurl.pl/bogdro-soft
Re: Debugger
#2490
Author: Remek
Date: Sun, 03 Jul 2011 13:55
15 lines
1682 bytes
Użytkownik "Bogdan (bogdro)" napisał:

> > Na wskazanej stronie pod hasłem ROL jest kilka instrukcji, ale ROL nie
> > ma.

> Zgadza się. Jest tak dlatego, gdyż rotacja bitów w liczbach
> wielokrotnej precyzji nie jest implementowana przy pomocy instrukcji
> ROL.

Mam tzw. mieszane odczucia :) ROL to ROL - instrukcja procesora. Jak
instrukcje procesora implementować w procedurze i po co? Tym bardziej jeśli
chodzi o ROL to w procedurach wielokrotnej precyzji ma raczej małe
zastosowanie. I o to min. chodzi w opisie różnic. Np. ROR a R(Carry flag)R.

Remek
Re: Debugger
#2491
Author: Michoo
Date: Mon, 04 Jul 2011 09:19
18 lines
1607 bytes
W dniu 03.07.2011 15:55, Remek pisze:
> Mam tzw. mieszane odczucia :) ROL to ROL - instrukcja procesora.
ROL to operacja na liczbie.

> Jak
> instrukcje procesora implementować w procedurze i po co?
Bo na liczbie długości podwojonego słowa procesora ROR na na składowych 
nie zrobi tego o co chodzi.

> Tym bardziej jeśli
> chodzi o ROL to w procedurach wielokrotnej precyzji ma raczej małe
> zastosowanie.
No a jak ktoś jednak potrzebuje taką funkcjonalność?


-- 
Pozdrawiam
Michoo
Re: Debugger
#2492
Author: Remek
Date: Mon, 04 Jul 2011 13:16
48 lines
2794 bytes
Użytkownik "Michoo" napisał:

> > Jak
> > instrukcje procesora implementować w procedurze i po co?

> Bo na liczbie długości podwojonego słowa procesora ROR na składowych
> nie zrobi tego o co chodzi.

W związku z tym stosuje się procedurę wykorzystującą właściwe instrukcje.
Czy to oznacza implementację ROL???

> > Tym bardziej jeśli
> > chodzi o ROL to w procedurach wielokrotnej precyzji ma raczej małe
> > zastosowanie.

> No a jak ktoś jednak potrzebuje taką funkcjonalność?

Jak potrzebuje to zastosuje. Mógłbyś rzucić jakiś przykład operacji
wielokrotnej precyzji wykorzystującej ROL?

A co do porównywania dużych liczb. Procedura podana przez Bogdana nie
sprawdza się w mojej implementacji. Czego nie rozumiem? Pokazuję źródło.
Jest to próba sprawdzenia, czy wynik mnożenia jest większy od liczby na
wejściu.

 mov eax, dword ptr [wynikmn+8]
 cmp eax, dword ptr [wejscie+8]
 ja  obl_reszt

 mov eax, dword ptr [wynikmn+4]
 cmp eax, dword ptr [wejscie+4]
 ja  obl_reszt

 mov eax, dword ptr [wynikmn]
 cmp eax, dword ptr [wejscie]
 ja  obl_reszt

I jak to działa. Jeśli pierwsze sprawdzenie daje wynik negatywny to ja nie
jest wykonany. Kolejne sprawdzenie daje wynik pozytywny i ja jest wykonany.
I to jest błąd bo:

wejście = 8A9F 0F8C 33C4
wynikmn = 0A9F 2F8C 33C4

Podzieliłem to na dwordy, aby było lepiej widoczne. Liczby są przypadkowe,
ale obrazują problem. jak zrobić, aby było dobrze?

Remek
Re: Debugger
#2493
Author: Bogdan (bogdro)
Date: Mon, 04 Jul 2011 15:56
87 lines
4672 bytes
W dniu 04.07.2011 15:16, Remek pisze:
> Użytkownik "Michoo" napisał:
> 
>>> Jak
>>> instrukcje procesora implementować w procedurze i po co?
> 
>> Bo na liczbie długości podwojonego słowa procesora ROR na składowych
>> nie zrobi tego o co chodzi.
> 
> W związku z tym stosuje się procedurę wykorzystującą właściwe instrukcje.
> Czy to oznacza implementację ROL???

 Nie, bo ROL jest zaimplementowana w procesorze. To oznacza
implementację "operacji rotacji bitów na liczbie nie mieszczącej się w
rejestrze". Natomiast na procesorach nie posiadających instrukcji
robiącej to, co ROL na x86, oznaczałoby to implementację "operacji
rotacji bitów (która na procesorach x86 przyjmuje postać instrukcji ROL)".
 Nie implementujesz instrukcji procesora, bo od tego są producenci
procesorów. Piszesz procedurę, która imituje funkcjonalność pewnej
instrukcji procesora, dlatego, że ta ma swoje ograniczenia (np.
rozmiar lub typ rejestru), które trzeba w danym przypadku jakoś
przeskoczyć. Piszesz procedurę, która robi to, co zrobiłaby ta
instrukcja, gdyby mogła. Jest to, w jakimś sensie, implementacja
(oczywiście programowa) pewnej innej, "rozszerzonej" wersji
instrukcji, ale nie samej instrukcji.

>>> Tym bardziej jeśli
>>> chodzi o ROL to w procedurach wielokrotnej precyzji ma raczej małe
>>> zastosowanie.
> 
>> No a jak ktoś jednak potrzebuje taką funkcjonalność?
> 
> Jak potrzebuje to zastosuje. Mógłbyś rzucić jakiś przykład operacji
> wielokrotnej precyzji wykorzystującej ROL?

 Przesuwanie bitów w generowaniu liczb pseudolosowych (np. coś w stylu
LFSR)?

> A co do porównywania dużych liczb. Procedura podana przez Bogdana nie
> sprawdza się w mojej implementacji. Czego nie rozumiem? Pokazuję źródło.
> Jest to próba sprawdzenia, czy wynik mnożenia jest większy od liczby na
> wejściu.
> 
>  mov eax, dword ptr [wynikmn+8]
>  cmp eax, dword ptr [wejscie+8]
>  ja  obl_reszt
> 
>  mov eax, dword ptr [wynikmn+4]
>  cmp eax, dword ptr [wejscie+4]
>  ja  obl_reszt
> 
>  mov eax, dword ptr [wynikmn]
>  cmp eax, dword ptr [wejscie]
>  ja  obl_reszt
> 
> I jak to działa. Jeśli pierwsze sprawdzenie daje wynik negatywny to ja nie
> jest wykonany.

 Zgadza się.

> Kolejne sprawdzenie daje wynik pozytywny i ja jest wykonany.
> I to jest błąd bo:
> 
> wejście = 8A9F 0F8C 33C4
> wynikmn = 0A9F 2F8C 33C4
> 
> Podzieliłem to na dwordy, aby było lepiej widoczne. Liczby są przypadkowe,
> ale obrazują problem. jak zrobić, aby było dobrze?

 Po każdym JA dodajesz "JNE nie_obl_reszt". Aby "iść dalej" w
porównywaniu, na starszych pozycjach nie może być różnicy. W ten
sposób dla tych dwóch liczb, porównywanie skończy się po pierwszym
kroku, ale pierwszy skok JA nie zostanie wykonany. Jeśli miałbyś liczby:

wejście = 0A9F 0F8C 33C4
wynikmn = 0A9F 2F8C 33C4

to po pierwszym porównaniu nie zostaje wykonany ani JA, ani JNE i
porównywane są kolejne DWORDy, co doprowadzi do prawidłowej
odpowiedzi. Ale przyznaję się - nie napisałem tego w kursie, a raczej
powinienem był. W najbliższym czasie się poprawię.

-- 
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): miniurl.pl/bogdro-soft
Re: Debugger
#2494
Author: Remek
Date: Tue, 05 Jul 2011 16:01
80 lines
3708 bytes
Użytkownik "Bogdan (bogdro)" napisał:

> > Podzieliłem to na dwordy, aby było lepiej widoczne. Liczby są
przypadkowe,
> > ale obrazują problem. jak zrobić, aby było dobrze?

> Po każdym JA dodajesz "JNE nie_obl_reszt". Aby "iść dalej" w
> porównywaniu, na starszych pozycjach nie może być różnicy. W ten
> sposób dla tych dwóch liczb, porównywanie skończy się po pierwszym
> kroku, ale pierwszy skok JA nie zostanie wykonany. Jeśli miałbyś liczby:
>
> wejście = 0A9F 0F8C 33C4
> wynikmn = 0A9F 2F8C 33C4

> to po pierwszym porównaniu nie zostaje wykonany ani JA, ani JNE i
> porównywane są kolejne DWORDy, co doprowadzi do prawidłowej
> odpowiedzi.

To sprawdzenie mam w procedurze pierwiastkowania dużych liczb. Wygląda to
tak:

========================================

mnoz_dalej:

 call mnozenie
 jc  obl_reszt  ; to zabezpiecza program przed nieskończoną pętlą

 mov eax, dword ptr [wynikmn+4]
 cmp eax, dword ptr [wejscie+4]
 ja  obl_reszt
 jb  mnoz_dalej

 mov eax, dword ptr [wynikmn]
 cmp eax, dword ptr [wejscie]
 ja  obl_reszt

  .........

==========================================

I to działa z wyjątkiem przypadku kiedy oba dwordy są sobie równe :) Co
wtedy? Sprawdzę tak:

========================================

mnoz_dalej:

 call mnozenie
 jc  obl_reszt  ; to zabezpiecza program przed nieskończoną pętlą

 mov eax, dword ptr [wynikmn+4]
 cmp eax, dword ptr [wejscie+4]
 ja  obl_reszt
 jb  mnoz_dalej

 mov eax, dword ptr [wynikmn]
 cmp eax, dword ptr [wejscie]
 ja  obl_reszt

 jmp obl_reszt
  .........

==========================================

Czy to wystarczy? Przepraszam za trucie d..., ale ja nie potrafię analizować
kodu "na sucho", a przećwiczenie wszystkich reakcji programu na dane
wejściowe to robota dla jakiegoś programu, nie dla człowieka. Mam
kalkulator, który bez zarzutu działał przez dwa lata. Przypadkiem okazało
się, że wynik dzielenia 704/4 to zero??? Błąd w procedurze. Młodszy bajt
jest równy zero i cmp bajt, 0 powodowało wyjście z pętli. Paranoja. Trzeba
było odwrócić procedurę i sprawdzać od najstarszego bajtu.

> nie napisałem tego w kursie, a raczej
> powinienem był. W najbliższym czasie się poprawię.

Bez przesady :) Nie da się przewidzieć i opisać wszystkich zastosowań. Coś
jednak można wspomnieć.

Pozdrawiam  Remek
Re: Debugger
#2495
Author: Bogdan (bogdro)
Date: Wed, 06 Jul 2011 16:23
102 lines
4684 bytes
W dniu 05.07.2011 18:01, Remek pisze:
> Użytkownik "Bogdan (bogdro)" napisał:
> 
>>> Podzieliłem to na dwordy, aby było lepiej widoczne. Liczby są
> przypadkowe,
>>> ale obrazują problem. jak zrobić, aby było dobrze?
> 
>> Po każdym JA dodajesz "JNE nie_obl_reszt". Aby "iść dalej" w
>> porównywaniu, na starszych pozycjach nie może być różnicy. W ten
>> sposób dla tych dwóch liczb, porównywanie skończy się po pierwszym
>> kroku, ale pierwszy skok JA nie zostanie wykonany. Jeśli miałbyś liczby:
>>
>> wejście = 0A9F 0F8C 33C4
>> wynikmn = 0A9F 2F8C 33C4
> 
>> to po pierwszym porównaniu nie zostaje wykonany ani JA, ani JNE i
>> porównywane są kolejne DWORDy, co doprowadzi do prawidłowej
>> odpowiedzi.
> 
> To sprawdzenie mam w procedurze pierwiastkowania dużych liczb. Wygląda to
> tak:
> 
> ========================================
> 
> mnoz_dalej:
> 
>  call mnozenie
>  jc  obl_reszt  ; to zabezpiecza program przed nieskończoną pętlą
> 
>  mov eax, dword ptr [wynikmn+4]
>  cmp eax, dword ptr [wejscie+4]
>  ja  obl_reszt
>  jb  mnoz_dalej
> 
>  mov eax, dword ptr [wynikmn]
>  cmp eax, dword ptr [wejscie]
>  ja  obl_reszt
> 
>   .........
> 
> ==========================================
> 
> I to działa z wyjątkiem przypadku kiedy oba dwordy są sobie równe :) Co
> wtedy? Sprawdzę tak:
> 
> ========================================
> 
> mnoz_dalej:
> 
>  call mnozenie
>  jc  obl_reszt  ; to zabezpiecza program przed nieskończoną pętlą
> 
>  mov eax, dword ptr [wynikmn+4]
>  cmp eax, dword ptr [wejscie+4]
>  ja  obl_reszt
>  jb  mnoz_dalej
> 
>  mov eax, dword ptr [wynikmn]
>  cmp eax, dword ptr [wejscie]
>  ja  obl_reszt
> 
>  jmp obl_reszt
>   .........
> 
> ==========================================
> 
> Czy to wystarczy?

 Prawdopodobnie tak. Jeśli wynik mnożenia jest równy wejściowej
liczbie, to "obl_reszt" (co pewnie oznacza obliczanie reszty) powinno
zapewne zwrócić zero, więc powinno być dobrze. Ale mogę czegoś nie
wiedzieć, więc przetestuj choć dla jednego przypadku.

> Przepraszam za trucie d..., ale ja nie potrafię analizować
> kodu "na sucho", a przećwiczenie wszystkich reakcji programu na dane
> wejściowe to robota dla jakiegoś programu, nie dla człowieka.

 Po to właśnie robi się testy :) Ale nie takie, że ktoś wpisuje coś do
programu (choć te też), tylko raczej podstawia się dane i uruchamia
procedury "ręcznie".

> Mam
> kalkulator, który bez zarzutu działał przez dwa lata. Przypadkiem okazało
> się, że wynik dzielenia 704/4 to zero??? Błąd w procedurze. Młodszy bajt
> jest równy zero i cmp bajt, 0 powodowało wyjście z pętli. Paranoja. Trzeba
> było odwrócić procedurę i sprawdzać od najstarszego bajtu.

 Zdarza się. I w bardziej, i w mniej profesjonalnych programach.

>> nie napisałem tego w kursie, a raczej
>> powinienem był. W najbliższym czasie się poprawię.
> 
> Bez przesady :) Nie da się przewidzieć i opisać wszystkich zastosowań. Coś
> jednak można wspomnieć.

 Już wspomniałem :)

-- 
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): miniurl.pl/bogdro-soft
Re: Debugger
#2496
Author: identifikator: 20110701
Date: Sat, 16 Jul 2011 15:28
3 lines
1483 bytes
jak to jest kurdę, te pedały mają same szósteczki na Politechnice 
Warszawskiej a zadają takie kretyńskie pytania - jak to zrobić? przecież 
podał Ktoś tu link wiki 
Re: Debugger
#2497
Author: Michoo
Date: Sat, 16 Jul 2011 16:07
20 lines
1889 bytes
W dniu 16.07.2011 17:28, identifikator: 20110701 pisze:
> jak to jest kurdę, te pedały
Podrywaj potencjalnych partnerów na prv, a nie na publicznych grupach, ok?

> mają same szósteczki na Politechnice
> Warszawskiej
Masz poważny problem z myśleniem - zdaje się, że dyskusja się toczy 
między Łodzią, Gdańskiem i Poznaniem.

> a zadają takie kretyńskie pytania - jak to zrobić?
Ty zazwyczaj zadajesz kretyńskie pytania.

> przecież
> podał Ktoś tu link wiki
Jak jesteś za głupi, żeby zrozumieć o czym jest aktualna dyskusja to idź 
sobie na inną grupę, co?

-- 
Pozdrawiam
Michoo
Re: Debugger
#2498
Author: identifikator: 20110701
Date: Sat, 16 Jul 2011 16:25
1 lines
1381 bytes
sory, już cichnę 
Re: Debugger
#2499
Author: tusk, donald tusk
Date: Mon, 17 Feb 2014 16:54
1 lines
1485 bytes
odgrzewam kotleta, jest jakiś dobry debuger pod Win32/64? 
Re: Debugger
#2500
Author: Bogdan (bogdro)
Date: Mon, 17 Feb 2014 18:01
14 lines
2334 bytes
W dniu 17.02.2014 17:54, tusk, donald tusk pisze:
> odgrzewam kotleta, jest jakiś dobry debuger pod Win32/64?

 Już nie pamiętam, jakie odpowiedzi padły w tym wątku, ale OllyDbg?
GoBug (Go Tools)? Z płatnych pewnie IDA Pro?
 Osobiście używałem troszkę OllyDbg, dawał radę. Widać było wywołania
WinAPI na przykład.


-- 
Pozdrawiam/Regards - Bogdan                     (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux):            http://bogdro.ciki.me
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.Xiph.org www.TorProject.org  Soft(EN): http://bogdro.ciki.me/soft
Re: Debugger
#2505
Author: toslaw
Date: Wed, 19 Feb 2014 11:56
12 lines
2278 bytes
Bogdan (bogdro) <bogdan@poczta.gazeta.pl>:
>  W dniu 17.02.2014 17:54, tusk, donald tusk pisze:
> > odgrzewam kotleta, jest jakiś dobry debuger pod Win32/64?
>
>   Już nie pamiętam, jakie odpowiedzi padły w tym wątku, ale OllyDbg?
>  GoBug (Go Tools)? Z płatnych pewnie IDA Pro?
>   Osobiście używałem troszkę OllyDbg, dawał radę. Widać było wywołania
>  WinAPI na przykład.

OllyDBG to raczej standard przy analizie kodu asm, jak i IDA Pro zresztą. Można jeszcze pokusić się o polecenie Microsoftowego WinDBG [1], którym można debugować też kod ring0.

[1] - http://msdn.microsoft.com/en-us/windows/hardware/hh852365
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