260
gram przesyła z powrotem ze stosu zawartości rejestru A, wskaźników i rejestrów H i I>, umożliwia akceptację nowego przerwania (bowiem samo przerwanie powoduje blokadę następnych przerwań) i powraca do programu głównego do miejsca, w którym nastąpiło przerwanie.
6.4.2. Język adresów symbolicznych
Po przyjrzeniu się przedstawionym wyżej przykładom (i po próbach samodzielnego ich rozwiązania) widać, że przygotowywanie programów w języku maszynowym Jest bardzo uciążliwe. Szczególnie kłopotliwa jest konieczność wypisywania ciągów liczb dwójkowych będących kodami rozkazów oraz konieczność późniejszego ustalenia adresów przy skokach, ponieważ w chwili pisania rozkazu najczęściej nie jest jeszcze znany dokładny adres rozkazu, do którego chcemy skoczyć. Nadzwyczaj kłopotliwa są też zmiany w istniejącym programie: np. wstawienie na początku jednego dodatkowego rozkazu wymaga weryfikacji adresów w całym programie.
Aby usunąć te i inne niedogodności języka maszynowego, wprowadzono inne języki programowania o różnym stopniu komplikacji, których celem jest ułatwienie programowania. Pisząc programy w Językach wysoko zorganizowanych nie musimy zupełnie zwracać uwagi na adresy, zmienne określamy przez nazwy i często wręcz nie musimy wiedzieć, na jakiej maszynie program będzie wykonywany.
Programy napisane w językach różnych od maszynowego zwane są źródłowymi. Przed ich wykonaniem muszą zostać przetłumaczone na Język maszynowy. Oczywiście nie ma sensu, aby tłumaczenie takie wykonywał człowiek i zawsze wykonuje je maszyna zaopatrzona w odpowiedni program tłumaczenia zwany translatorem.
Bardzo prostym i niewiele odbiegającym od języka maszynowego jest tzw. język adresów symbolicznych, który pomimo swej prostoty znacznie ułatwia przygotowanie programów.
W Języku tym nadal operujemy rozkazami maszynowymi podatnymi uprzednio w liście rozkazów, przy czym różni się on od Języka maszynowego głównie tym, że: _ .
1° liczby dwójkowe reprezentujące rozkazy i dane zastąpione zostają symbolami literowymi i liczbami dziesiętnymi lub szesnastkowymi,
2° liczby oznaczające adresy przy skokach zastąpione zostają umownymi nazwami, tzw. etykietami i te same nazwy pojawiają się przed rozkazami, do których ma się odbyć skok.
Poniżej omówimy skrótowo Język adresów symbolicznych procesora 8080. Ponieważ przygotowane w tym języku programy podlegają później zamianie na język maszynowy dokonywanej przez maszynę (program tłumaczący nazywa się tu assemblerem), dla uniknięcia niejednoznaczności muszą być zapisane w pewien ściśle określony sposób. Poszczególne rozkazy zapisywane są w pojedynczych wierszach i składają się z czterech oddzielnych części, tzw. pól, np.:
Pole etykiety. W pole to można wpisać dowolną etykietę służącą do określenia miejsca skoku. Etykieta może zawierać do 5 znaków zaczynających się od litery i nie może być nazwą rejestru, rozkazu ani dyrektywy. Po etykiecie musi nastąpić dwukropek. Etykieta w procesie tłumaczenia na język maszynowy zostanie zastąpiona przez określony adres.
Pole symbolu rozkazu. W pole to wpisuje się symbol rozkazu zgodnie z podaną wcześniej listą.
Pole ooerandów. W pole to wpisuje się dane lub adresy wymagane dla pełnego określenia użytego rozkazu. Jako operandy mogą być wymagane cztery różne informacje, które mogą być podane za pomocą dziewięciu różnych sposo-' bów, jak to pokazuje poniższa tabela.
Wymagana informacja
(a) rejestr
(b) para rejestrów
(c) dane zawarte w 2 lub w 2 i 3 bajcie rozkazu
(d) 16-bitowy adres
Etykieta
DRUK:
Symbol l?Szkazu OUT
Operand Komentarz
3 ; wywołanie wyniku
Sposoby podania informacji
(1) liczba szestnastkowa
(2) liczba dziesiętna
(3) liczba ósemkowa
(4) liczba dwójkowa
(5) bieżący stan licznika rozkazów
(6) stała w kodzie ASCII
(7) nazwa
(8) etykieta
(9) wyrażenie Informacja o operandzie może więc być podana jako:
(1), (2), (3), (4) - liczba w jednym spośród czterech systemów, przy czym: po liczbie szesnastkowej należy napisać literę H, po dziesiętnej można napisać literę D, po ósemkowej należy napisać literę Q lub 0, zaś po dwójkowej należy napisać literę B. Ponadto, jeżeli liczba szesnastkowa zaczyna się od litery, to należy ją poprzedzić zerem.
(5) - bieżący stan licznika rozkazów oznaczony przez $. Np.
JMP $ + 20
spowoduje skok do adresu większego o 20 od adresu, który posiadał wykonywany rozkaz JMP.
(6) - ciąg znaków ASCII ujęty w górne przecinki. Każdemu ze znaków odpowiadała będzie 8-bitowa liczba reprezentująca go w kodzie ASCII, np.:
UVI A, ’B’ ,• (A) 42H
(7) - nazwa (maksymalnie 5 znaków zaczynających się od litery), której w czasie tłumaczenia przyporządkowana zostaje zadana przez programistę wartość liczbowa (patrz dyrektywy).
Nazwom rejestrów i pamięci (M) assembler automatycznie przypisuje ustalone liczby jak niżej:
B=0, C=1, D=2, E=3, K=4, L=5, M=6, A=7.