3012
edycji
(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 | 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 | 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. |