EMAS
EMAS jest assemblerem skrośnym dla MERRY 400, używającym, w odróżnieniu od ASSEM, składni bliższej współczesnym assemblerom, oraz mnemoników MERY 400 (ale bez przyrostków zależnych od lokalizacji argumentu, patrz: Lista rozkazów).
Wywołanie
Wywołanie EMAS z linii poleceń ma postać:
emas [opcje] [wejście]
Gdzie:
- wejście - nazwa wejściowego pliku źródłowego. Jeśli nie zostanie podana, EMAS czyta program ze standardowego wejścia, a wyjściem staje się plik out.bin
- opcje - dowolne z:
- -o <wyjście> - nazwa wyjściowego pliku binarnego. Jeśli nie zostanie podana, przyjmowana jest nazwa out.bin
- -O <otype> - wybierz typ pliku wyjściowego. Możliwe wybory to:
- -c <cpu> - wybierz procesor, dla jakiego assembler produkuje binaria. Możliwe wybory to: mera400, mx16. Ustawienie procesora na MX-16 pozwala na użycie dodatkowych instrukcji oraz poszerza przestrzeń adresową programu z 32 do 64k słów. Domyślnie przyjmowany procesor to mera400.
- raw - binarny obraz gotowy do umieszczenia w pamięci i uruchomienia
- debug - plik tekstowy opisujący zawartość kolejnych komórek pamięci (przydatny w przypadku programowania komputera z pulpitu technicznego)
- emelf - konsolidowalny obiekt EMELF (domyślny wybór)
- -I <katalog> - dodaj katalog do listy katalogów, w których poszukiwane będą pliki dołączane dyrektywą .include
- -v - wyświetl informacje o wersji i zakończ działanie
- -h - wyświetl pomoc i zakończ działanie
Opis języka
Komentarze
EMAS pozwala na użycie komentarzy jedo- i wieloliniowych:
; samotny komentarz jednoliniowy lw r1, 2 ; komentarz jednoliniowy na końcu dowolnej linii /* komentarz wieloniniowy */ lw r1, 2 /* komentarz wieloliniowy, choć tak naprawdę w jedej linii */ /* można też tak */ lw r1, 2
Stałe
Stałymi w programie mogą być liczby całkowite, liczby zmiennoprzecinkowe oraz łańcuchy znaków.
Liczby całkowite
Liczby całkowite można zapisywać w systemie binarnym, ósemkowym, dziesiętnym lub szesnastkowym, np:
0b1101110000 0177 -931 0xffa9
Istnieje jeszcze jeden sposób zapisu stałych całkowitoliczbowych, wynikający z ułożenia wskaźników w rejestrze R0, gdzie poszczególnym bitom przypisany jest jednoliterowy symbol ze zbioru (Z, M, V, C, L, E, G, Y, X). Można dzięki niemu zapisać liczbę szesnastobitową z ustawionymi na 1 bitami, które odpowiadają danym wskaźnikom. Przykłady takiego zapisu stałych:
?ZM ?GVZ
EMAS przechowuje liczby całkowite jako 32-bit liczby w kodzie U2 i na takich liczbach operuje. W trakcie umieszczania liczb w obiekcie wynikowym są one obcinane do 16 najmłodszych bitów. Wyjątkiem jest argument dyrektywy .dword, który jest 32-bit liczbą w kodzie U2.
Liczby zmiennoprzecinkowe
Akceptowane są następujące sposoby zapisu liczb zmiennoprzecinkowych:
9 1.2 0.003 -9.125e-2 1e4
Jedynym miejscem w programie, w którym może wystąpić liczba zmiennoprzecinkowa, jest argument dyrektywy .float.
Łańcuchy
Łańcuchy znaków są ciągami 8-bit znaków ujętymi w podwójne cudzysłowy. Poszczególne znaki można zapisywać dosłownie, lub używając jednej z sekwencji unikowych:
- \0yyy - gdzie yyy jest ósemkowym kodem znaku
- \xyy - gdzie yy jest szesnastkowym kodem znaku
- \y - umożliwia zakodowanie jednego znaków specjalnych (wartości y inne niż poniżej są niepoprwane):
- \n - nowa linia
- \t - tabulacja pozioma
- \r - powrót karetki
- \f - wysuw strony
- \\ - dosłowny ukośnik w tył
- \" - dosłowny podwójny cudzysłów
Przykłady poprawnych łańcuchów znaków:
"MERA-400\n" "\xab\xac\xad" "\"napis\""
Umieszczając łańcuchy w programie wynikowym EMAS lokuje każde dwa kolejne sąsiadujące ze sobą znaki kolejno w starszej i młodszej połówce 16-bit słowa. Jeśli łańcuch zawiera nieparzystą liczbę znaków, to w ostatnim słowie na pozycji młodszego bajtu znajdzie się wartość 0.
Symbole
Symbolem jest ciąg znaków zaczynający się od małej lub dużej litery, z następującą dowolną ilością małych lub dużych liter, liczb lub znaku podkreślenia. Symbolowi przypisywana jest w trakcie asemblacji wartość oraz atrybuty. Symbol może być:
- niezdefiniowany - wystąpiła deklaracja symbolu, ale nie został on (jeszcze) zdefiniowany,
- lokalny lub globalny - widoczny tylko w granicach obiektu, w którym występuje, bądź również poza nim,
- zmienny lub stały - wartość symbolu może, bądź nie może ulec zmianie w trakcie asemblacji programu.
Symbol otrzymuje atrybuty zgodne z tym w jakim kontekście został zdefiniowany bądź zadeklarowany.
Zmienne assemblera
Zmienne assemblera nie mają swojej reprezentacji w wynikowym obiekcie, są wartościami dostępnymi w trakcie asemblacji programu, a definiuje się je dyrektywą .equ. Symbol, który jest zmienną assemblera jest zawsze zmienny. Przykłady zmiennych:
.equ a 10 .equ b a+2
Stałe assemblera
Stałe assemblera również nie mają swojej reprezentacji w wynikowym obiekcie, są wartościami dostępnymi w trakcie asemblacji programu, a definiuje się je dyrektywą .const. Symbol, który jest zmienną assemblera jest zawsze stały. Przykłady stałych:
.const a 10 .const b a+9
Etykiety
Etykieta opisuje pozycję względem początku obiektu (jest nią wartość licznika rozkazów w danym momencie asemblacji). Przykład definicji etykiety:
etykieta:
Zasięg symboli
Wszystkie symbole definiowane są jako lokalne. Jeśli symbol ma być widoczny dla konsolidatora, należy go zadeklarować jako globalny dyrektywą .global. Zmiana zasięgu może nastąpić przed, lub po definicji:
.global printf .global snprintf .global strdup
printf: ... snprintf: ... strdup:
procedura: .global procedura
Wyrażenia
Dyrektywy assemblera
.cpu .file .line .include .equ .const .lbyte .rbyte .word .dword .float .ascii .asciiz .res .org .entry .global