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

Przejdź do nawigacji Przejdź do wyszukiwania
brak opisu edycji
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).


Ten ostatni przypadek jest ciekawym trikiem powodującym, że rozkazy niepodejmowanych skoków kończone są bardzo wcześnie,
= Obsługa =
co skraca czas ich wykonania do minimum. Nie tylko nie przechodzą one do fazy wykonania,
ale nawet nie są dla nich obliczane argumenty. To sprawia, że ich argumentem może być komórka pamięci nie należąca do żadnego
ze skonfigurowanych obszarów, a rozkaz nie zakończy się w takim przypadku błędem dostępu do pamięci.


W przypadku napotkania rozkazu nieefektywnego procesor natychmiast kończy bieżący cykl rozkazowy, wykonując jednak kilka
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 ==

Menu nawigacyjne