Programowanie niskopoziomowe / Moduł 5: Techniki programowania asemblerowego: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Akokno (dyskusja | edycje)
Nie podano opisu zmian
Akokno (dyskusja | edycje)
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


...


...


...


...


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.


...


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.


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.


...


...


...


...


...


...


...


...


...


...