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

Przejdź do nawigacji Przejdź do wyszukiwania
Nie podano opisu zmian
 
(Nie pokazano 7 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
__NOTOC__
__NOTOC__
W architekturze procesora MERY-400 rozróżniane są dwa szczególne przypadki
W architekturze procesora MERY-400 rozróżniane są dwa szczególne przypadki
rozkazów, które mimo, że zostaną przeczytane z miejsca programu wskazanego licznikiem rozkazów, to ich wykonanie
rozkazów, które mimo, że zostaną pobrane z miejsca programu wskazanego licznikiem rozkazów, to ich wykonanie
będzie zaniechane. Dzieje się to wcześnie, bo na etapie dekodowanie rozkazu,
będzie zaniechane. Decyzja taka podejmowana jest bardzo wcześnie, bo już na etapie dekodowanie rozkazu,
co w niektórych przypadkach staje się jednocześnie sprytnym skrótem do realizacji jego treści.
co w niektórych przypadkach staje się jednocześnie sprytnym skrótem do realizacji jego treści.


Linia 13: Linia 13:
* Rozkazy o kodach binarnych, które nie reprezentują żadnego z rozkazów na [[Lista rozkazów|liście rozkazów]]. Są to:
* Rozkazy o kodach binarnych, które nie reprezentują żadnego z rozkazów na [[Lista rozkazów|liście rozkazów]]. Są to:
** Wszystkie rozkazy, które w zapisie binarnym na dwóch najstarszych bitach mają wartość "0".
** Wszystkie rozkazy, które w zapisie binarnym na dwóch najstarszych bitach mają wartość "0".
** Niektóre rozkazy z [[Skorowidz kodów rozkazów#Rozkazy bez drugiego argumentu (grupa C)|grupy "C"]]. W tej grupie istnieją również rozkazy znajdujące się na liście rozkazów, ale nie obejmuje ona wszystkich możliwych kombinacji
** Niektóre rozkazy o kodach binarnych zaliczających się do [[Skorowidz kodów rozkazów#Rozkazy bez drugiego argumentu (grupa C)|grupy "C"]]. W tej grupie istnieją również rozkazy znajdujące się na liście rozkazów, ale nie obejmuje ona wszystkich możliwych kombinacji
** Niektóre rozkazy z [[Skorowidz kodów rozkazów#Rozkazy bezargumentowe (grupa S)|grupy "S"]], z przyczyn jak wyżej.
** Niektóre rozkazy o kodach binarnych zaliczających się do [[Skorowidz kodów rozkazów#Rozkazy bezargumentowe (grupa S)|grupy "S"]], z przyczyn jak wyżej.
* Rozkazy przeznaczone do wykonaywania wyłącznie w kontekście systemu operacyjnego (Q=0), jeśli próbę ich wywołania podjęto z programu użytkowego:
* Rozkazy przeznaczone do wykonaywania wyłącznie w kontekście systemu operacyjnego (Q=0), jeśli próbę ich wywołania podjęto z programu użytkowego:
** Wszystkie rozkazy istniejące w [[Skorowidz kodów rozkazów#Rozkazy bezargumentowe (grupa S)|grupie "S"]]: HLT, MCL, SIT, SIL, SIU, CIT, GIU, LIP, GIL, także rozkazy dodane w procesorze MX-16: CRON, SINT, SIND.
** Wszystkie rozkazy istniejące w [[Skorowidz kodów rozkazów#Rozkazy bezargumentowe (grupa S)|grupie "S"]]: HLT, MCL, SIT, SIL, SIU, CIT, GIU, LIP, GIL, także rozkazy dodane w procesorze MX-16: CRON, SINT, SIND.
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 przypadku, 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 nieprzewidywalny.
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