Programowanie niskopoziomowe / Moduł 5: Techniki programowania asemblerowego: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 28: | Linia 28: | ||
|valign="top" width="500px"|[[Grafika:PNP_M5_S05.png]] | |valign="top" width="500px"|[[Grafika:PNP_M5_S05.png]] | ||
|valign="top"| | |valign="top"| | ||
... | Przykład pzedstawia trzy procedury, służące do wypisywania na konsoli danych 4-, 8- i 16-bitowych w postaci szesnastkowej. | ||
Procedura dla słowa 8-bitowego korzysta z procedury wypisywania tetrady, a procedura dla słowa 16-bitowego – z procedury dla bajtu. Argument wywołania jest przekazywany w rejestrze AX lub jego mniej znaczącej części - AL. | |||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> | ||
Linia 40: | Linia 42: | ||
|valign="top" width="500px"|[[Grafika:PNP_M5_S07.png]] | |valign="top" width="500px"|[[Grafika:PNP_M5_S07.png]] | ||
|valign="top"| | |valign="top"| | ||
... | W pierwszej wersji procedury używamy licznika pętli w jako indeksu danej. Wadami takiego rozwiązania są: konieczność użycia dodatkowej zmiennej jako licznika pętli i użycie złożonego trybu adresowania; zaletą – potrzeba inkrementacji tylko jednej zmiennej. | ||
W drugiej wersji pętla jest odliczana w dół. W porównaniu z wersją pierwszą mamy tu jeden rejstr użyty do zliczania iteracji i konieczność modyfikacji dwóch rejestrów w każdym obieu pętli. | |||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> | ||
Linia 46: | Linia 50: | ||
|valign="top" width="500px"|[[Grafika:PNP_M5_S08.png]] | |valign="top" width="500px"|[[Grafika:PNP_M5_S08.png]] | ||
|valign="top"| | |valign="top"| | ||
... | Wersja trzecia używa wskaźnika danych do określenia warunku wyjścia z pętli. W tym celu przed pętlą jest wyliczana wartość wskaźnika dla stanu po ostatniej iteracji. | ||
Wersja czwarta korzysta z instrukcji iteracyjnych x86. Instrukcja LODSB ładuje bajt spd adresu zawartego w rejestrze ESI do AL i inkrementuje ESI. Instrukcja LOOP dekrementuje ECX i wykonuje skok, jeśli nie osiągnięto wartości 0. Procedura jest krótka w zapisie, ale współczesne procesory x86 wykonują instrukcje iteracyjne na ogół wolniej, niż odpowiadające im sekwencje instrukcji prostych. | |||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> |
Wersja z 12:18, 18 paź 2006
![]() |
... |
![]() |
... |
![]() |
... |
![]() |
... |
![]() |
... |
![]() |
... |
![]() |
... |
![]() |
... |
![]() |
... |
![]() |
... |
![]() |
... |
![]() |
... |
![]() |
... |
![]() |
... |
![]() |
... |