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

Przejdź do nawigacji Przejdź do wyszukiwania
 
(Nie pokazano 1 pośredniej wersji utworzonej przez tego samego użytkownika)
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