Asembler PMC


Podrozdziały

 

W niniejszym rozdziale omówione zostały wszystkie zasady tworzenia poprawnego programu w asemblerze procesora PMC. Omówiono również zasady kompilowania i uruchamiania programów.

 

Edytor programów PMC

Program symulatora PMC wyposażony został w edytor tekstowy, w którym można tworzyć programy. Jest to właściwie zintegrowane środowisko programowania, gdyż w jednym programie zawarto edytor, kompilator oraz symulator.

Obsługa edytora nie różni się zasadniczo od obsługi typowego programu edycji tekstu. Funkcje edycyjne możemy uaktywniać poprzez menu, przyciski narzędziowe na pasku narzędziowym lub za pomocą kombinacji różnych klawiszy. W menu mamy następujące polecenia:

 

Plik - opcje związane z tekstem programu
Edycja - polecenia edycyjne
Projekt - polecenia związane z kompilacją, sprawdzeniem oraz informacją o tworzonym projekcie
Program - polecenia dla symulatora

 

Po kliknięciu myszką polecenia Plik (lub naciśnięciu kombinacji klawiszy lewy Alt + P) otworzą się opcje dla tekstu programu w edytorze. Są one następujące:
 

Nowy - tworzy nowy tekst w edytorze. Tekst jest wstępnie sformatowany, aby uprościć rozpoczęcie pracy nad programem dla PMC. Jeśli przed wywołaniem tego polecenia w edytorze znajduje się tekst programu, który nie został jeszcze zapamiętany na dysku, to program zaproponuje zapisanie tego tekstu przed utworzeniem nowego. Ma to na celu zabezpieczenie przed utratą danych - w edytorze może być edytowany tylko jeden tekst programu. Do polecenia Nowy możemy szybko dostać się z poziomu edytora naciskając kombinację klawiszy Ctrl + N (ang. New).

Otwórz - pozwala odczytać tekst programu z pliku tekstowego przechowywanego na dysku. Pliki dla PMC są zwykłymi plikami tekstowymi, lecz posiadają rozszerzenie nazwy pmc (np. suma.pmc). Polecenie to otwiera standardowe okienko dialogowe odczytu pliku. Do polecenia Otwórz dostajemy się z poziomu edytora również poprzez kombinację klawiszy Ctrl + O (ang. Open).

Zapisz - umożliwia zapis tekstu programu na dysku. Jeśli jest to pierwszy zapis pliku, to pojawi się okienko dialogowe umożliwiające wybranie nazwy oraz katalogu docelowego dla pliku tekstu programu PMC. Przy kolejnym wywołaniu tego polecenia komputer automatycznie zapisze plik w miejscu, które użytkownik określił za pierwszym razem. Polecenie Zapisz wywołujemy szybko z poziomu edytora za pomocą kombinacji klawiszy Ctrl + S (ang. Save).

Zapisz Jako - pozwala zapisać plik tekstu programu PMC pod inną nazwą oraz w wybranym miejscu na dysku. Zawsze powoduje pojawienie się okienka dialogowego zapisu pliku.

Drukuj - jeśli komputer, na którym uruchomiono symulator PMC, ma dostęp do drukarki dowolnego typu, to wywołanie polecenia Drukuj utworzy wydruk pliku tekstu programu dla PMC. Polecenie wywołujemy szybko z poziomu edytora kombinacją klawiszy Ctrl + P (ang. Print)

Koniec - kończy działanie symulatora PMC i usuwa program z pamięci. Jeśli edytowany tekst programu został zmieniony, a zmiany nie były jeszcze zapisane w pliku na dysku, to program przed zakończeniem swojej pracy zaproponuje użytkownikowi zapis edytowanego tekstu programu. Z poziomu edytora możemy szybko zakończyć pracę programu kombinacją klawiszy Ctrl + F4 lub lewy Alt + F4.

 

Po kliknięciu myszką polecenia Edycja lub po naciśnięciu klawiszy lewy Alt + E otworzy się menu z opcjami edycyjnymi:

 

Cofnij - umożliwia cofnięcie ostatniej operacji edycyjnej, takiej jak skasowanie znaku lub wiersza. Ten sam efekt osiągniemy naciskając klawisze Ctrl + Z.

Kopiuj - umożliwia skopiowanie do schowka Windows zaznaczonego fragmentu tekstu w edytorze. Jeśli nie został zaznaczony blok tekstu, to do schowka nie jest nic kopiowane. Z poziomu edytora kopiowanie do schowka uzyskujemy kombinacją klawiszy Ctrl + C (ang. Copy)

Wklej - umieszcza w tekście programu na pozycji kursora tekst ze schowka Windows. Tekst w schowku możemy umieszczać w innym programie. W ten sposób można przenosić do edytora programu PMC różne fragmenty procedur z innych programów, które edytujemy nawet przy pomocy notatnika. Wklejanie wywołujemy kombinacją klawiszy Ctrl + V

Wytnij - polecenie umieszcza w schowku zaznaczony blok tekstu z edytora. Blok ten po skopiowaniu do schowka zostaje usunięty (wycięty) z programu PMC. Wycięcie uzyskujemy kombinacją klawiszy Ctrl + X.

Usuń - usuwa zaznaczony fragment tekstu - ten sam efekt osiągniemy naciskając klawisz Delete.

Zaznacz wszystko - dokonuje wyboru całego tekstu programu w edytorze PMC. Funkcję szybko uzyskujemy po naciśnięciu kombinacji klawiszy Ctrl + A.

Szukaj - umożliwia odszukanie w tekście programu słowa lub frazy. Wyświetla odpowiednie okienko dialogowe, w którym wpisujemy tekst do znalezienia. Z poziomu edytora opcję wyszukiwania uzyskujemy po naciśnięciu kombinacji klawiszy Ctrl + F (ang. Find)

Szukaj Następny - gdy przy pomocy polecenia szukaj została określona fraza do odszukania w tekście programu PMC, to zostanie wyszukane następne wystąpienie tej frazy w tekście. Szukanie następnego wystąpienia frazy uzyskujemy przez naciśnięcie klawisza F3.

Zamień - opcja umożliwia wyszukanie i zamianę frazy tekstu na inną. Wyświetla odpowiednie okienko dialogowe, w którym podajemy frazę do odszukania oraz frazę do zastąpienia. Opcje uzyskujemy szybko kombinacją klawiszy Ctrl + R (ang. Replace)

Idź do wiersza - pozwala na szybkie przejście do wiersza programu o podanym numerze. Funkcję tę uzyskujemy kombinacją klawiszy Ctrl + G (Go to) lub klikając myszką w wiersz stanu u spodu okna edytora.

Rozmiar okna - zmniejsza lub powiększa okienko programu PMC. Opcja ta ma sens dla symulatora, gdzie zmniejszenie okienka znacznie przyspiesza wykonywanie programu PMC, gdyż symulator nie musi obsługiwać i odświeżać paneli rejestrów oraz pamięci i stosu. Szybko uzyskujemy naciskając klawisz F2.

 

Asembler

Informacje podane w poprzednim rozdziale na temat budowy instrukcji procesora PMC w zasadzie wystarczają do pisania programów. Instrukcje moglibyśmy składać z poszczególnych bitów i wprowadzać do pamięci PMC. Lecz tak programowano komputery w latach 40-tych ubiegłego wieku. Od tego czasu nastąpił pewien postęp i wymyślono asembler. Czym jest asembler? Jest prostym językiem programowania opartym bezpośrednio na instrukcjach procesora, które zapisujemy w sposób symboliczny. Zamiast bezpośrednio operować stanami bitów, których w każdej instrukcji PMC jest 16, będziemy stosować dla poszczególnych poleceń odpowiednio dobrane nazwy symboliczne. Nazwy te wprowadziliśmy już przy opisie poszczególnych instrukcji. Dużo prościej jest operować nazwami symbolicznymi niż bitami, które instrukcję faktycznie tworzą. Na przykład


ADD #15
wygląda dużo lepiej od 0111000000001111, nieprawdaż?

 

Zapis liczb

W asemblerze PMC liczby możemy zapisywać w różnych systemach liczbowych w zależności od bieżących potrzeb.

 

Liczby dziesiętne:

Zapisujemy je w zwykły sposób jako wartości dodatnie lub ujemne:


123   15    0   -56
, itd.


Jednak z uwagi na fakt, iż liczby te będą później przechowywane w komórkach pamięci, zakres dopuszczalnych wartości ograniczony jest do zakresu 16 bitowych liczb w kodzie U2 i wynosi od -32768 do 32767. Liczba dziesiętna może składać się tylko z cyfr od 0 do 9. Każdy inny znak w zapisie spowoduje błąd kompilacji.

 

Liczby dwójkowe

Jeśli chcemy zapisać wartość dwójkową, to musimy poprzedzić cyfry parą znaków 0b (zero i "b") lub 0B. Wtedy zapis będzie wyglądał następująco:


0b1111  - wartość 15
0B1111111111111111 - wartość -1


Liczby dwójkowe również ograniczone są do 16 bitów, nie mogą więc posiadać więcej niż 16 cyfr (znaki 0b nie są wliczane). Liczba binarna może składać tylko z cyfr 0 i 1. Każdy inny znak spowoduje błąd kompilacji.

 

Liczby ósemkowe

Liczby w systemie ósemkowym poprzedzamy parą znaków 0q (zero i "q") lub 0Q, po których umieszczamy cyfry liczby ósemkowej od 0 do 7, np:


0q23 - wartość 19
0Q111 - wartość 73


Liczby ósemkowe ograniczone są do wartości 0q177777, która w zapisie dwójkowym ma 16 bitów. Jeśli zamiast cyfry ósemkowej pojawi się w zapisie liczby dowolny inny znak, to nastąpi błąd kompilacji.

 

Liczby szesnastkowe

Liczby szesnastkowe poprzedzamy parą znaków 0x (zero i "x") lub 0X, po których umieszczamy cyfry szesnastkowe 0 do 9 oraz a do f (lub A ... F), np:


0xFF - wartość 255
0Xff - też wartość 255.


Liczby szesnastkowe nie mogą posiadać więcej niż 4 cyfr. Jeśli w miejsce cyfry szesnastkowej wpisany zostanie inny znak, to spowoduje to błąd kompilacji.

 

Definiowanie stałych

Stała jest liczbą, którą zapisujemy symbolicznie za pomocą nazwy. Sens stosowania stałej widoczny jest wtedy, gdy w programie wielokrotnie używamy pewnej wartości liczbowej. Można w takim przypadku zdefiniować stałą i zamiast konkretnej liczby używać nazwy symbolicznej - program może wtedy stać się bardziej przejrzysty. Stałe definiujemy przy pomocy dyrektywy EQU (ang. equal - równe) w sposób następujący:


nazwa stałej
:  EQU  wartość stałej


nazwa stałej
- musi rozpoczynać się od litery (lub znaku podkreślenia) i nie może składać się z więcej niż 8 znaków. Dozwolone znaki to cyfry, litery oraz znak podkreślenia. Po nazwie stałej w definicji musi być obecny znak dwukropka. Jeśli w nazwie stałej użyty zostanie inny znak, to kompilacja zakończy się błędem. Po zdefiniowaniu stałej możemy używać ją w programie w identyczny sposób jak liczbę.


wartość stałej
- jest liczbą, stałą lub etykietą.

 

Przykład

RADIX:    EQU  10
...
  MUL #RADIX
  (równoważne MUL #10)

 

Definiowanie etykiet

Etykieta jest adresem komórki pamięci zapisanym symbolicznie w postaci nazwy. Etykiety używamy zamiast odwoływania się do adresów liczbowych, które mogą się zmieniać przy modyfikacji programu. Etykiety są dużo bardziej wygodne od adresów bezpośrednich. Pierwszą etykietą, którą napotykasz w programie PMC jest etykieta START. Wskazuje ona początek programu PMC.

Etykietę definiujemy umieszczając nazwę na początku wiersza. Nazwa musi rozpoczynać się od litery lub znaku podkreślenia. Nie może zawierać więcej niż 8 znaków. W etykiecie mogą występować tylko cyfry, litery oraz znak podkreślenia. Inne znaki spowodują błąd kompilacji. Za nazwą etykiety musi wystąpić znak dwukropka.

 

Przykład

START:  LDA #10
...

 

Etykieta START wskazuje adres komórki pamięci PMC zawierający instrukcję LDA #10.

 

Tworzenie zmiennych

Zmienna jest komórką (lub blokiem komórek) pamięci PMC, w której program przechowuje jakieś dane. Najczęściej komórka taka opatrzona jest etykietą, aby uzyskać dostęp do przechowywanych danych. Zawartość komórki definiujemy za pomocą dyrektywy DAT. Użycie jej jest następujące:


L1:   DAT  10
   - zdefiniowano zmienną o nazwie L1, w której początkowo będzie wartość 10

TEKST:   DAT "Witaj w PMC"    - zdefiniowano zmienną o nazwie TEXT, która zawiera napis. Każda literka napisu zajmuje jedną komórkę pamięci PMC. Literka W jest w komórce o adresie TEKST. Następna literka w następnej komórce, itd.

 

Instrukcje i tryby adresowania

W asemblerze PMC każda instrukcja posiada trzyliterową nazwę, zwaną mnemonikiem instrukcji. Nazwy instrukcji można pisać małymi lub dużymi literami. Rozpoznawane instrukcje są następujące:

 

Lp. mnemonik opis
1 LDA arg Załadowanie akumulatora daną arg
2 STA arg Umieszczenie akumulatora pod adresem arg
3 JMP arg Skok bezwarunkowy do komórki o adresie arg
4 JZR arg Skok przy zerze do komórki o adresie arg
5 JMI arg Skok przy minusie do komórki o adresie arg
6 JSR arg Skok do podprogramu o adresie arg
7 RTS arg Powrót z podprogramu, arg ignorowany
8 ADD arg Dodanie do akumulatora danej arg
9 SUB arg Odjęcie od akumulatora danej arg
10 MUL arg Pomnożenie akumulatora przez daną arg
11 DIV arg Podzielenie akumulatora przez daną arg
12 INC arg Zwiększenie o 1 komórki o adresie arg
13 RLA arg Obrót bitów akumulatora o arg pozycji
14 AND arg Iloczyn logiczny bitów akumulatora i danej arg
15 ORA arg Suma logiczna bitów akumulatora i danej arg
16 XOR arg Suma modulo 2 bitów akumulatora i danej arg

 

Za każdą instrukcją PMC musi być umieszczony argument tej instrukcji. W argumencie określamy tryb adresowania oraz dane lub adres komórki pamięci PMC. Sposób oznaczania poszczególnych trybów adresowania jest następujący:

 

Adresowanie natychmiastowe: instrukcja #dana

Dana (liczba, stała lub etykieta) poprzedzona jest znakiem "#". Oto przykłady trybu natychmiastowego:

LDA  #25
JMP  #START
ADD  #0XF5
XOR  #-1

 

Adresowanie bezpośrednie: instrukcja adres komórki

Adres komórki może być liczbą (0...1023) w systemie dziesiętnym, dwójkowym, ósemkowym lub szesnastkowym lub etykietą. Dane zawarte są we wskazanej adresem komórce pamięci PMC (lub w porcie wejścia/wyjścia, gdy adres jest mniejszy od 8). Oto odpowiednie przykłady adresowania bezpośredniego:


LDA  25
  - do akumulatora załadowana zostanie zawartość komórki o adresie 25, a nie liczba 25!
ADD L1  - do akumulatora dodana zostanie zawartość komórki opatrzonej etykietą L1


UWAGA
! Tryb bezpośredni jest często mylony przez uczniów z trybem natychmiastowym, co powoduje błędne działanie programów PMC. Należy szczególnie zwrócić uwagę na adresy skoków, które zwykle powinny być podawane jako wartość natychmiastowa, np.:


JMP #KONIEC
  - wykonuje skok do adresu KONIEC podanego bezpośrednio w instrukcji

JMP KONIEC - wykonuje skok do adresu, który przechowywany jest w komórce o etykiecie KONIEC.


W tym drugim przypadku skok nie zostanie prawdopodobnie wykonany do adresu KONIEC (o ile komórka o tej etykiecie nie przechowuje tego adresu). Jest to więc najprawdopodobniej błąd i przed etykietą należy dodać znak #. Z drugiej strony rozkazy skoków mogą pobierać adresy docelowe z komórek pamięci - daje to do ręki zdolnego programisty potężne narzędzie tzw. skoków wyliczanych, ale to już wyższa szkoła jazdy...

 

Adresowanie pośrednie z postinkrementacją:  instrukcja (adres komórki++)

Adres komórki może być liczbą lub etykietą. Po dostępie do danych zawartość wskazanej w adresie komórki jest zwiększana o 1. Oto przykłady:


LDA (TXPTR++)
STA (DEST++)
ADD (TABLICA++)

 

Adresowanie pośrednie z predekrementacją: instrukcja (--adres komórki)

Adres komórki może być liczbą lub etykietą. Przed dostępem do danych zawartość wskazanej w adresie komórki jest zwiększana o 1. Oto przykłady:


LDA (--TXPTR)
STA (--DEST)
ADD (--TABLICA)

 

Określanie adresu startowego programu PMC

Symulator PMC musi posiadać informację, w której komórce pamięci znajduje się pierwsza instrukcja programu. Informację tę przekazujemy za pomocą dyrektywy RUN, za którą umieszczamy etykietę (lub rzadziej adres liczbowy) startu programu. Jeśli korzystamy z szablonu, to etykieta ta nazywa się START i jest już wstawiona w odpowiednie miejsca:


           RUN START
...
START:
(tutaj rozpoczynamy umieszczanie instrukcji programu)
...

 

Jeśli program ma rozpocząć swoje wykonanie od innego adresu, to należy ten adres umieścić w dyrektywie RUN. Dyrektywa ta jest niezbędna dla każdego programu, bez niej nie jest możliwe skompilowanie programu i uruchomienie go na symulatorze.

 

Komentarze

Komentarz jest tekstem objaśnienia, który zawieramy wewnątrz tekstu tworzonego programu. Komentarze są bardzo cennym elementem programowani - dzięki nim możemy udokumentować tworzony program. Komentarz rozpoczyna się po znaku średnika. Jeśli stosujemy szablon programu, to zawiera on już kilka komentarzy, w których możemy umieścić różne dane na temat tworzonego programu PMC:

; Program : 
; Autor   : 
; Data    : 02-10-18  16:11:46          
; Wersja  : 1.00
; Opis    : 
;

        RUN START

START:
 

Kompilator programu PMC

Kompilator służy do przetłumaczenia programu w języku asemblera na instrukcje i dane dla procesora PMC, które zostaną wprowadzone do pamięci maszyny. Zanim program będzie mógł być wykonany w symulatorze, musi zostać skompilowany. W trakcie kompilacji sprawdzana jest poprawność składniowa każdego wiersza programu. Jeśli kompilator napotka jakiś błąd, to dalsza kompilacja zostaje wstrzymana i program wynikowy nie znajdzie się w pamięci PMC.

Musimy również pamiętać, iż kompilację należy wykonać przy każdej zmianie w programie PMC, gdyż inaczej w pamięci maszyny będzie wciąż poprzednia wersja programu. Dostęp do kompilatora mamy z poziomu opcji menu Projekt. Po kliknięciu jej ukażą nam się dalsze opcje związane z tworzonym projektem programu:

 

Kompiluj - uaktywnia kompilator, który analizuje tekst programu w edytorze i tworzy program wynikowy dla procesora PMC. Jeśli program źródłowy nie zawiera błędów składniowych, to program wynikowy zostaje umieszczony w pamięci PMC i jest gotowy do uruchomienia w symulatorze. W przypadku jakiegokolwiek błędu w trakcie kompilacji program wynikowy nie powstaje, a na ekranie ukaże się odpowiednie okienko z komunikatem o błędzie. Dodatkowo kursor tekstowy w edytorze zostaje umieszczony na początku wiersza, w którym wykryto ten błąd. Z poziomu edytora mamy szybki dostęp do kompilacji przy pomocy kombinacji klawiszy Ctrl + F9.

Informacja - uaktywnia okienko podające informacje o skompilowanym programie PMC (wcześniej musimy więc wywołać opcję kompilacji). Informację o kompilacji uzyskamy szybko naciskając klawisz F12.

 

Większość często potrzebnych funkcji edycji i kompilacji dostępna jest w formie przycisków na pasku narzędziowym umieszczonym ponad okienkiem edycji tekstu. Przytrzymanie przez chwilę kursora myszki nad przyciskiem przywołuje małe okienko z opisem spełnianej przez ten przycisk funkcji.

 

Również niektóre funkcje edycyjne uzyskamy z menu kontekstowego przywoływanego kliknięciem prawego przycisku myszki z kursorem wewnątrz okna edycji tekstu programu.

 

Dzięki tej różnorodności sposobów wywołań funkcji usługowych każdy użytkownik może znaleźć sposób przez siebie preferowany. Ja osobiście wolę stosować skróty klawiszowe, ponieważ pisząc na klawiaturze nie muszę się od niej odrywać, aby skorzystać z myszki. Ale jest to kwestią gustu.


Symulator PMC

Symulator PMC jest elementem wykonawczym programu umieszczonego w pamięci maszyny. Symuluje on działanie wszystkich elementów składowych, takich jak procesor, pamięć oraz urządzenia wejścia wyjścia. Do symulatora przechodzimy klikając zakładkę Symulator.

 


Widok symulatora Przykładowej Maszyny Cyfrowej


Okno robocze symulatora PMC podzielone jest na dwie części. U góry mamy widok urządzeń wejścia/wyjścia: wyświetlacza znakowego, bufora wejścia znakowego, panelu wyświetlaczy 7 segmentowych LED, ekraniku graficznego oraz wejścia/wyjścia bitowego. Działanie tych urządzeń zostało dokładnie omówione w poprzednim rozdziale.

W dolnej części okna mamy kolejno: panel rejestrów procesora, widok pamięci PMC pod kątem zawartego w niej programu dla procesora, widok pamięci PMC pod kątem jej zawartości liczbowej oraz widok wewnętrznego stosu adresów powrotnych z podprogramów. Na panelach tych jedna z komórek jest zawsze zaznaczona: panel pamięci programu - zaznaczenie wskazuje komórkę adresowaną rejestrem licznika rozkazów PCR, panel pamięci - zaznaczenie odnosi się do komórki danych, która jest adresowana przez wykonywaną właśnie instrukcję, panel stosu - zaznaczenie wskazuje komórkę, do której można wprowadzić dane, czyli komórkę stosu adresowaną rejestrem wskaźnika stosu SPR.

Sterowanie pracą symulatora jest bardzo proste. Podstawowe opcje dostępne są na pasku narzędziowym lub w menu Program.

 

Start - uruchamia program umieszczony w pamięci PMC. Klawisz skrótu F9.

Stop - zatrzymuje program. Wykonanie teraz polecenie Start uruchamia ten program od początku - wszystkie dane są przywracane do stanu wyjściowego. Klawisz skrótu F5.

Pauza - wstrzymuje wykonanie programu. Ponowny wybór tej opcji wznawia działanie. Można również użyć opcji Start. Klawisz skrótu F4.

Krok - program uruchomiony zostaje w trybie krokowym. Każde wykonanie tej opcji powoduje przejście do następnej fazy cyklu rozkazowego procesora PMC. Klawisz skrótu F7.

 

Symulator jest programem działającym niezależnie od pozostałych elementów PMC. Można w symulatorze uruchomić program i przejść do edytora, aby coś poprawić. Wykonanie programu jest przerywane w sytuacji, gdy:



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.