Rozkazy nieefektywne i nielegalne: Różnice pomiędzy wersjami
Przejdź do nawigacji
Przejdź do wyszukiwania
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 3: | Linia 3: | ||
będzie zaniechane. Dzieje się to wcześnie, bo na etapie dekodowanie rozkazu, | będzie zaniechane. Dzieje się to wcześnie, bo 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. | ||
= Warunki wystąpienia = | |||
Wszystkie rozkazy, dla których nie zostanie podjęta faza wykonania nazywane są rozkazami nieefektywnymi. Sygnał NEF na pakiecie P-D ma dla takich przypadków wartość "1". | Wszystkie rozkazy, dla których nie zostanie podjęta faza wykonania nazywane są rozkazami nieefektywnymi. Sygnał NEF na pakiecie P-D ma dla takich przypadków wartość "1". | ||
Linia 23: | Linia 25: | ||
* Rozkazy skoków, jeśli nie są spełnione warunki wymagane do podjęcia danego skoku (np. nie jest ustawiona flaga zera "Z" w trakcie dekodowania skoku JZ). | * Rozkazy skoków, jeśli nie są spełnione warunki wymagane do podjęcia danego skoku (np. nie jest ustawiona flaga zera "Z" w trakcie dekodowania skoku JZ). | ||
= Obsługa = | |||
W przypadku napotkania rozkazu nieefektywnego procesor | W przypadku napotkania rozkazu nieefektywnego zawartość licznika rozkazów jest zwiększana o 1, jak w przypadku wszystkich innych rozkazów. Dzieje się to już w fazie pobrania rozkazu. Następnie procesor kończy bieżący cykl rozkazowy, wykonując jednak kilka dodatkowych czynności "porządkowych": | ||
dodatkowych czynności "porządkowych": | |||
# Jeśli rozkaz był nielegalny i nie był ustawiony wskaźnik przeskoku P (XI & ~P), zapalane jest przerwanie 6 (nieprawidłowy rozkaz). | # Jeśli rozkaz był nielegalny i nie był ustawiony wskaźnik przeskoku P (XI & ~P), zapalane jest przerwanie 6 (nieprawidłowy rozkaz). | ||
# Dla nieefektywnych rozkazów dwusłowowych może nastąpić zwiększenie zawartości licznika rozkazów o 1, tak, aby ominąć również argument natychmiastowy rozkazu, znajdujący się w drugim słowie. Dzieje się to w dwóch przypadkach: | # Dla nieefektywnych rozkazów dwusłowowych może nastąpić kolejne zwiększenie zawartości licznika rozkazów o 1, tak, aby ominąć również argument natychmiastowy rozkazu, znajdujący się w drugim słowie. Dzieje się to w dwóch przypadkach: | ||
#* Jeśli rozkaz nie był nielegalny (WMI & ~XI) - jest to przypadek legalnych rozkazów skoku z argumentem w drugim słowie, np JZ 0x1234 | #* Jeśli rozkaz nie był nielegalny (WMI & ~XI) - jest to przypadek legalnych rozkazów skoku z argumentem w drugim słowie, np JZ 0x1234 | ||
#* Lub jeśli ustawiony był wskaźnik przeskoku P (WMI & P) - jest to przypadek przeskoku przez dowolny rozkaz dwusłowowy | #* Lub jeśli ustawiony był wskaźnik przeskoku P (WMI & P) - jest to przypadek przeskoku przez dowolny rozkaz dwusłowowy | ||
Linia 38: | Linia 36: | ||
Po tej operacji rozpoczynany jest kolejny cykl rozkazowy. | Po tej operacji rozpoczynany jest kolejny cykl rozkazowy. | ||
= Konsekwencje praktyczne = | |||
To, jakie rozkazy mogą być nieefektywne i w jaki sposób są obsługiwane, ma kilka nieoczywistych konsekwencji praktycznych, o których warto pamiętać pisząc oprogramowanie MERY-400. | |||
== Skoki == | |||
Obsługa niepodejmowanych skoków 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, | |||
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 | |||
ze skonfigurowanych obszarów, a rozkaz mimo to nie zakończy się błędem dostępu do pamięci. | |||
== Rozkazy wejścia/wyjścia == |