3012
edycji
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ą | rozkazów, które mimo, że zostaną pobrane z miejsca programu wskazanego licznikiem rozkazów, to ich wykonanie | ||
będzie zaniechane. | 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 | ** 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 | ** 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 | 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 | 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. |