Rozkazy nieefektywne i nielegalne: Różnice pomiędzy wersjami

Przejdź do nawigacji Przejdź do wyszukiwania
 
(Nie pokazano 2 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 46: Linia 46:
Obsługa niepodejmowanych skoków warunkowych już na etapie dekodowania jest ciekawym trikiem powodującym, że rozkazy te kończone są bardzo wcześnie,
Obsługa niepodejmowanych skoków warunkowych już na etapie dekodowania jest ciekawym trikiem powodującym, że rozkazy te kończone są bardzo wcześnie,
co skraca dla nich czas cyklu do niezbędnego minimum. Taki rozkaz nie tylko nie przejdzie do fazy wykonania,
co skraca dla nich czas cyklu do niezbędnego minimum. Taki rozkaz nie tylko nie przejdzie do fazy wykonania,
ale nie będą dla niego również obliczane argumenty. To ma kolejną ciekawą konsekwencję: jego argumentem (natychmiastowym, bezpośrednim czy pośrednim) może być komórka pamięci nie należąca do żadnego
ale nie będą dla niego również obliczane argumenty. To ma kolejną ciekawą konsekwencję: jego argumentem może być adres nie objęty żadnym ze skonfigurowanych obszarów pamięci,
ze skonfigurowanych obszarów, a rozkaz mimo to nie zakończy się błędem dostępu do pamięci.
a rozkaz mimo to nie zakończy się błędem dostępu do pamięci.


== Rozkazy wejścia/wyjścia ==
== Rozkazy wejścia/wyjścia ==
Linia 55: Linia 55:
=== Wieloargumentowość rozkazów IN i OU ===
=== Wieloargumentowość rozkazów IN i OU ===


Rozkazy IN i OU wymagają czterech dodatkowych argumentów umieszczonych bezpośrednio za rozkazem. Są one adresami, pod które nastąpi skok w różnych przypadkach zakończenia operacji wejścia/wyjścia. Ponieważ obsługa rozkazów nieefektywnych nie obejmuje takiego scenariusza, to należy zapewnić, aby rozkazy IN lub OU nie stały się w trakcie wykonywania programu nieefektywne. Zaniedbanie tego wymogu może skutkować tym, że argument zostanie potraktowany jako rozkaz i wykonany, a to może mieć nieprzewidziane konsekwencje.
Rozkazy IN i OU wymagają czterech dodatkowych argumentów umieszczonych bezpośrednio za rozkazem. Są one adresami, pod jeden z których nastąpi skok w zależności od sposobu zakończenia operacji wejścia/wyjścia. Ponieważ obsługa rozkazów nieefektywnych nie obejmuje scenariusza z czterema dodatkowymi argumentami, to należy zapewnić, aby rozkazy IN lub OU nie stały się w trakcie wykonywania programu nieefektywne. Zaniedbanie tego wymogu może skutkować tym, że argument zostanie potraktowany jako rozkaz i wykonany, a to może mieć nieprzewidziane konsekwencje.


W praktyce sprowadza się to do dwóch ograniczeń:
W praktyce sprowadza się to do dwóch ograniczeń:
# Bezpośrednio przed rozkazami IN i OU nie należy używać rozkazów ustawiających wskaźnik przeskoku P
# Bezpośrednio przed rozkazami IN i OU nie należy używać rozkazów ustawiających wskaźnik przeskoku P
# Nie należy używać rozkazów IN i OU w programie użytkowym, jeśli komputer, na którym jest on uruchamiany traktuje takie rozkazy jako nielegalne, a system operacyjny maszyny nie obsługuje takiej sytuacji wyjątkowej.
# Nie należy używać rozkazów IN i OU w programie użytkowym, jeśli komputer, na którym jest on uruchamiany traktuje takie rozkazy jako nielegalne, a system operacyjny maszyny nie obsługuje takiej sytuacji wyjątkowej. Należy tu jednak zauważyć, że w standardowym wykonaniu pakietu P-D rozkazy IN i OU są legalne w trybie użytkownika.


=== Nielegalność rozkazów IN i OU w trybie użytkownika ===
=== Nielegalność rozkazów IN i OU w trybie użytkownika ===


Obsługa nielegalności rozkazów IN i OU w trybie użytkownika niesie ze sobą jeszcze jedną pułapkę. Jeśli taki rozkaz będzie dwusłowowy, to, ponieważ jest nielegalny, nie zostanie dla niego wykonane dodatkowe zwiększenie licznika rozkazów o 1. W konsekwencji kolejnym miejscem w pamięci, z którego zostanie pobrany rozkaz programu, będzie argument rozkazu IN/OU. Rezultat, podobnie jak wyżej, jest trudny do przewidzenia.
Obsługa nielegalności rozkazów IN i OU w trybie użytkownika niesie ze sobą jeszcze jedną pułapkę. Jeśli taki rozkaz będzie dwusłowowy, to, ponieważ jest nielegalny, nie zostanie dla niego wykonane dodatkowe zwiększenie licznika rozkazów o 1. W konsekwencji kolejnym miejscem w pamięci, z którego zostanie pobrany rozkaz programu, będzie argument rozkazu IN/OU. Rezultat, podobnie jak wyżej, jest trudny do przewidzenia.
== Rozkazy rozgałęzień ==
Wszystkie rozkazy rozgałęzień: BB, BM, BS, BC, BN, BLC, BRC, IB, TRB mają tę cechę, że przypadek pominięcia następnego rozkazu obarczony jest dodatkowym wydatkiem czasowym (~1.5us) związanym z koniecznością pobrania tego rozkazu z pamięci (mimo, iż nie zostanie on i tak wykonany). Może to mieć zauważalne konsekwencje wydajnościowe w ciasnych pętlach używających rozgałęzień do określenia przypadku wyjścia z pętli. Cecha ta dotyczy również innych rozkazów ustawiających flagę "P": IS, GIU i GIL, ale w ich przypadku kwestie wydajnościowe nie będą grały tak istotnej roli.

Menu nawigacyjne