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 24: Linia 24:


* Dowolny rozkaz, jeśli poprzedni rozkaz ustawił flagę przeskoku (P=1).
* Dowolny rozkaz, jeśli poprzedni rozkaz ustawił flagę przeskoku (P=1).
* 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 warunkowych, 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 =
= Obsługa =
Linia 32: Linia 32:
# 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ć 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:
# 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 warunkowego 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
# Bezwarunkowo - wyzerowanie wewnętrznych wskaźników: B-modyfikacji (WBI), premodyfikacji (WPI), rozkazu dwusłowowego (WMI), przeskoku (P), oraz licznika premodyfikacji (MC).
# Bezwarunkowo - wyzerowanie wewnętrznych wskaźników: B-modyfikacji (WBI), premodyfikacji (WPI), rozkazu dwusłowowego (WMI), przeskoku (P), oraz licznika premodyfikacji (MC).
Linia 42: Linia 42:
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.
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 ==
== Skoki warunkowe ==


Obsługa niepodejmowanych skoków 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 (natychmiastowym, bezpośrednim czy pośrednim) może być komórka pamięci nie należąca do żadnego
Linia 50: Linia 50:


== Rozkazy wejścia/wyjścia ==
== Rozkazy wejścia/wyjścia ==
W przypadku [[Instrukcje wejścia-wyjścia|rozkazów IN i OU]] należy zwrócić uwagę na dwie kwestie.
=== 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.
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
# 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.
=== 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.

Menu nawigacyjne