3013
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. |