EMAS: Różnice pomiędzy wersjami

Z MERA 400 wiki
Przejdź do nawigacji Przejdź do wyszukiwania
Linia 86: Linia 86:
=== Łańcuchy ===
=== Ł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:
Ł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 (w przypadku dyrektyw '''.ascii''' i '''.asciiz''') używając jednej z sekwencji unikowych:
* \0'''yyy''' - gdzie '''yyy''' jest ósemkowym kodem znaku
* \0'''yyy''' - gdzie '''yyy''' jest ósemkowym kodem znaku
* \x'''yy''' - gdzie '''yy''' jest szesnastkowym kodem znaku
* \x'''yy''' - gdzie '''yy''' jest szesnastkowym kodem znaku
Linia 103: Linia 103:
  "\"napis\""
  "\"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.
To, w jaki sposób znaki umieszczane są w programie wynikowym zależy od dyrektywy, której łańcuch jest argumentem.


=== Bieżąca lokalizacja ===
=== Bieżąca lokalizacja ===

Wersja z 09:07, 6 mar 2014

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
  • opcje - dowolne z:
    • -o <wyjście> - nazwa wyjściowego pliku binarnego. Jeśli nie zostanie podana, przyjmowana jest nazwa a.out
    • -O <otype> - typ pliku wyjściowego. Możliwe wybory to:
      • 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)
    • -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.
    • -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
    • -d - drukuj informacje przydatne w śledzeniu błędów działania asemblera

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.

Znaki

EMAS pozwala na zapisywanie stałych całkowitoliczbowych również przy pomocy znaków, dwuznaków lub trójznaków. Jeden znak w pojedynczych cudzysłowach:

'a'

kodowany jest jako jego wartość w kodzie ASCII na młodszym bajcie słowa. Dwuznak:

'ab'

kodowany jest jako wartości podanych znaków w kodzie ASCII odpowiednio na starszym i młodszym bajcie słowa. Trójznak:

'abc'

kodowany jest w słowie za pomocą kodu R40.

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 (w przypadku dyrektyw .ascii i .asciiz) 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\""

To, w jaki sposób znaki umieszczane są w programie wynikowym zależy od dyrektywy, której łańcuch jest argumentem.

Bieżąca lokalizacja

Specjalną stałą jest "." (kropka), która w danym miejscu programu zawsze zwraca przesunięcie względem początku assemblowanego obiektu. Jej wartość jest zawsze >= 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

Operatory arytmetyczne

  • +, -, *, /, %

Operatory bitowe

  • |, &, ^, ~, <<, >>, \

Dyrektywy assemblera

.cpu

.file

.line

.include

.equ

.const

.lbyte

.rbyte

.word

.dword

.float

.ascii

.asciiz

.res

.org

.entry

.global

Rozkazy