Asembler x86/Jak używać debuggera ALD: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
optymalizacja
krok-po-kroku niezbyt jakoś dobrze brzmi
Linia 1:
<noinclude>{{Spis treści}}</noinclude>
==Wprowadzenie==
Debugger jest programem służącym do analizy kodu wykonywalnego. Pozwala zrozumieć to, co dzieje się w trakcie wykonywania skompilowanego programu jak również odnaleźć ewentualne błędy (z ang. ''bugs''). Wykorzystamy w tym celu program '''ald''' (''Assembly Language Debugger''). Jest to przykładowy debugger przeznaczony dla języka asembler. Pozwala on śledzić wykonywanie programu kroklinia po krokulinii, jak również zatrzymać się tylko w konkretnych miejscach (tzw. pułapkach), by oglądnąć zawartość rejestrów, pamięci i stosu. Dzięki temu w prosty sposób możemy odnaleźć miejsca programu, gdzie jego działanie poszło nie po naszej myśli.
 
==Instalacja==
Linia 112:
Widzimy, że pierwsze wiersze przykładowego listingu w ostatniej kolumnie do złudzenia przypominają niedawno kompilowany kod źródłowy napisany w języku asembler. Zauważamy jedynie, że używane etykiety często zastąpione są już konkretnymi adresami liczbowymi w używanej pamięci. Lewa kolumna zawiera kolejno adresy pamięci zajmowanej przez dane polecenie. Środkowa kolumna zawiera polecenia w kodzie maszynowym. W tym momencie nie chcemy znać zawartości dalszej pamięci, więc naciskamy klawisz '''q''' a następnie '''ENTER'''.
 
==Wykonanie krok-linia po-kroku linii==
Aby wykonać pierwszą instrukcję, naciskamy '''n''' po czym klawisz '''ENTER'''.
 
Linia 175:
 
==Wstrzymanie wykonania==
W przypadku dłuższych i bardziej skomplikowanych algorytmów wykonywanie kroklinia po krokulinii może być uciążliwe i czasochłonne. Aby usprawnić ten proces możemy ustawić pułapkę (tzw. ''breakpoint'') tylko w miejscu, w którym chcielibyśmy wykonanie programu wstrzymać, by odczytać jego stan i następnie prześledzić kroklinia po krokulinii, w którym miejscu następuje błąd wykonania.
 
Przykładowo poniższy program miał za zadanie wyświetlenie zawartości rejestru EAX w systemie dziesiętnym.
Linia 312:
</source>
 
Przede wszystkim interesują nas zawartości rejestrów EAX i EBX. Na tym etapie nie widać żadnych potencjalnych problemów, możemy więc kontynuować wykonanie programu kroklinia po krokulinii używając polecenia '''n''':
 
<source lang=bash>
Linia 343:
</source>
 
Na pierwszy rzut oka tym razem również wszystko jest w porządku. Jednak po wnikliwej analizie zawartości rejestrów zauważymy, że w rejestrze EDX znajdują się pozostałości z poprzedniego obiegu pętli. Aby uniknąć błędnych wyników, należy poprawić kod tak, aby zerowanie rejestru EDX przeprowadzać na początku każdego obiegu pętli przed wykonaniem operacji dzielenia. Spróbujemy mimo wszystko kontynuować działanie programu kroklinia po krokulinii.
 
Widzimy, że operacja przesunięcia nie została wykonana.