EMAS: Różnice pomiędzy wersjami

Z MERA 400 wiki
Przejdź do nawigacji Przejdź do wyszukiwania
(Nie pokazano 32 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
EMAS jest assemblerem dla MERRY 400, używającym, w odróżnieniu od [[ASSEM]], składni bliższej współczesnym assemblerom, oraz mnemoników MERY 400 (bez przyrostków zależnych od lokalizacji argumentu, patrz: [[Lista rozkazów]]).
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]]).
 
Repozytorium źródeł EMAS: https://github.com/jakubfi/emas


= Wywołanie =
= Wywołanie =
Linia 5: Linia 7:
Wywołanie EMAS z linii poleceń ma postać:
Wywołanie EMAS z linii poleceń ma postać:


emas [opcje] [wejście [wyjście]]
emas [opcje] [wejście]


Gdzie:
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''
* '''wejście''' - nazwa wejściowego pliku źródłowego. Jeśli nie zostanie podana, EMAS czyta program ze standardowego wejścia
* '''wyjście''' - nazwa wyjściowego pliku binarnego. Jeśli nie zostanie podana, przyjmowana jest nazwa ''out.bin''
* '''opcje''' - dowolne z:
* '''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''.
** '''-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''.
** '''-O <otype>''' - wybierz typ pliku wyjściowego. Możliwe wybory to:
** '''-I <katalog>''' - dodaj katalog do listy katalogów, w których poszukiwane będą pliki dołączane dyrektywą .include
*** ''raw'' - binarny obraz gotowy do umieszczenia w pamięci i uruchomienia (domyślny wybór)
*** ''debug'' - plik tekstowy opisujący zawartość kolejnych komórek pamięci (przydatny w przypadku programowania komputera z pulpitu technicznego)
*** ''emelf'' - obiekt dla konsolidatora (opcja nie zaimplementowana)
** '''-v''' - wyświetl informacje o wersji i zakończ działanie
** '''-v''' - wyświetl informacje o wersji i zakończ działanie
** '''-h''' - wyświetl pomoc 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 [[Rejestry i wskaźniki|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
Wewnętrznie EMAS operuje na 32-bit liczbach ze znakiem. Kiedy ostateczna wartość będąca wynikiem operacji ma zostać umieszczona w obiekcie wynikowym, jej zakres jest sprawdzany i użytkownik jest informowany o ewentualnym jego przekroczeniu. 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. Znaki pojedyncze oraz dwuznaki obejmują cały zakres znaków ASCII i można je podawać również używając sekwencji unikowych. Trójznaki pozwalają kodować jedynie znaki poprawne dla [[CROOK-5 - Interpretator zleceń użytkownika - XOSL#Kod R40|kodu R40]].
Znaki w pojedynczych cudzysłowach:
'a', '\n', '\xa1', '\0177'
kodowane są jako ich wartość w kodzie ASCII na młodszym bajcie słowa. Dwuznaki:
'ab', '\r\n', '\xaa\0001'
kodowane są jako wartości podanych znaków w kodzie ASCII odpowiednio na starszym i młodszym bajcie słowa. Trójznaki:
'abc', 'XYZ', '#_1'
kodowane są w słowie za pomocą [[CROOK-5 - Interpretator zleceń użytkownika - XOSL#Kod R40|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 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
* \x'''yy''' - 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 ===
Poniższa tabela przedstawia operatory arytmetyczne i bitowe, w kolejności malejących priorytetów
{| class="wikitable"
! Operatory !! Działanie
|-
| ~ || negacja bitowa
|-
| \ || skalowanie
|-
| *, /, % || mnożenie, dzielenie, reszta z dzielenia
|-
| +, - || dodawanie, odejmowanie
|-
| <<, >> || przesunięcie bitowe w lewo i w prawo
|-
| &, <nowiki>|</nowiki>, ^ || logiczny iloczyn, suma i suma wykluczająca
|}
Operator skalowania realizuje funkcję dokładnie taką samą, jak przesunięcie bitowe, jest tylko innym sposobem jego zapisu. Poniższe zapisy są równoznaczne:
3\7  =  3 << (15-7)
Skalowanie można rozumieć jako: "umieść liczbę 3 od 7 pozycji bitowej w górę. Bity dla tego zapisu numerowane są od 0 (bit najstarszy) do 15 (bit najmłodszy). Wynikiem będzie więc liczba:
0000001100000000
== Dyrektywy assemblera ==
=== .cpu ===
'''Składnia:''' .cpu <mera400|mx16>
Odpowiednik przełącznika ''-c'' linii poleceń EMAS-a. Pozwala określić typ procesora, dla którego ma być generowany kod wynikowy. Użycie ''mx16'' sprawia, że:
* mnemoniki '''CRON''', '''SINT''', '''SIND''' są rozpoznawane i poprawnie assemblowane
* maksymalny rozmiar wynikowego pliku binarnego wynosi 64k słowa (32k dla ''mera400'')
=== .file ===
'''Składnia:''' .file ''nazwa_pliku''
Ustala nazwę assemblowanego pliku. Jeśli assembler będzie chciał użyć w komunikatach nazwy pliku, to domyślna nazwa (zgodna z nazwą assemblowanego pliku) zostanie od momentu wydania dyrektywy zastąpiona podaną.
=== .line ===
'''Składnia:''' .line ''numer_linii''
Ustala numer bieżącej linii assemblacji (poczynając od linii następującej po dyrektywie). Dalsze linie będą numerowane kolejno od podanej wartości.
=== .include ===
'''Składnia:''' .include ''nazwa_pliku''
Powoduje dołączenie do assemblacji pliku o podanej nazwie.
=== .equ ===
'''Składnia:''' .equ ''nazwa_zmiennej'' ''wartość''
Ustala wartość zmiennej assemblacji. Może być ona w dalszej części programu zmieniana.
=== .const ===
'''Składnia:''' .const ''nazwa_zmiennej'' ''wartość''
Ustala wartość stałej assemblacji. Wartość ta nie może ulec zmianie.
=== .lbyte ===
'''Składnia:''' .lbyte ''liczba_8_bit'' [, ...]
Zapisuje w programie wynikowym na lewych pozycjach (MSB) kolejnych słów podane wartośći 8-bit.
=== .rbyte ===
'''Składnia:''' .rbyte ''liczba_8_bit'' [, ...]
Zapisuje w programie wynikowym na prawych pozycjach (LSB) kolejnych słów podane wartośći 8-bit.
=== .word ===
'''Składnia:''' .word ''liczba_16_bit'' [, ...]
Zapisuje w programie kolejne słowa 16-bit o podanej wartości.
=== .dword ===
'''Składnia:''' .dword ''liczba_32_bit'' [, ...]
Zapisuje w programie wynikowym pary słów 16-bit tworzące podaną liczbę 32-bit.
=== .float ===
'''Składnia:''' .float ''liczba_zmiennoprzecinkowa'' [, ...]
Zapisuje w programie wynikowym trójki słów 16-bit tworzące podaną 48-bit liczbę zmiennoprzecinkową w notacji używanej przez arytmometr wielokrotnej precyzji MERY-400.
=== .ascii ===
'''Składnia:''' .ascii ''łańcuch''
Zapisuje w programie wynikowym podany łańcuch, kodując go po dwa znaki ASCII na słowo maszynowe.
=== .asciiz ===
'''Składnia:''' .asciiz ''łańcuch''
Zapisuje w programie wynikowym podany łańcuch, kodując go po dwa znaki ASCII na słowo maszynowe. Łańcuch terminowany jest 8-bit wartością '0'.
=== .r40 ===
'''Składnia:''' .r40 ''łańcuch_r40''
Zapisuje w programie wynikowym podany łańcuch, kodując go po trzy znaki R40 na słowo maszynowe. '''UWAGA:''' W kodzie R40 można użyuwać jedynie liter, liczb i znaków specjalnych: _, #, %.
=== .res ===
'''Składnia:''' .res ''rozmiar'' [,''liczba_16_bit'']
Rezerwuje w programie wynikowym obszar o podanym rozmiarze (w słowach), wypełniając go zerami. Jeśli podany jest drugi argument, jego wartość używana jest do wypełnienia zamiast zera.
=== .org ===
'''Składnia:''' .org ''adres''
Ustala nową bieżącą pozycję assemblacji. Następne wygenerowane słowo zostanie umieszczone już pod podanym, nowym adresem.
=== .entry ===
'''Składnia:''' .entry ''adres''
Dyrektywa ma efekt wyłącznie w przypadku generowania pliku wynikowego jako obiektu EMELF. Określa adres wejścia do programu.
=== .global ===
'''Składnia:''' .global ''nazwa_etykiety''
Dyrektywa ma efekt wyłącznie w przypadku generowania pliku wynikowego jako obiektu EMELF. Wskazuje, że etykieta będzie miała zasięg globalny.
== Rozkazy ==

Wersja z 09:21, 26 lut 2016

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

Repozytorium źródeł EMAS: https://github.com/jakubfi/emas

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

Wewnętrznie EMAS operuje na 32-bit liczbach ze znakiem. Kiedy ostateczna wartość będąca wynikiem operacji ma zostać umieszczona w obiekcie wynikowym, jej zakres jest sprawdzany i użytkownik jest informowany o ewentualnym jego przekroczeniu. 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. Znaki pojedyncze oraz dwuznaki obejmują cały zakres znaków ASCII i można je podawać również używając sekwencji unikowych. Trójznaki pozwalają kodować jedynie znaki poprawne dla kodu R40.

Znaki w pojedynczych cudzysłowach:

'a', '\n', '\xa1', '\0177'

kodowane są jako ich wartość w kodzie ASCII na młodszym bajcie słowa. Dwuznaki:

'ab', '\r\n', '\xaa\0001'

kodowane są jako wartości podanych znaków w kodzie ASCII odpowiednio na starszym i młodszym bajcie słowa. Trójznaki:

'abc', 'XYZ', '#_1'

kodowane są 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 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

Poniższa tabela przedstawia operatory arytmetyczne i bitowe, w kolejności malejących priorytetów

Operatory Działanie
~ negacja bitowa
\ skalowanie
*, /, % mnożenie, dzielenie, reszta z dzielenia
+, - dodawanie, odejmowanie
<<, >> przesunięcie bitowe w lewo i w prawo
&, |, ^ logiczny iloczyn, suma i suma wykluczająca

Operator skalowania realizuje funkcję dokładnie taką samą, jak przesunięcie bitowe, jest tylko innym sposobem jego zapisu. Poniższe zapisy są równoznaczne:

3\7  =  3 << (15-7)

Skalowanie można rozumieć jako: "umieść liczbę 3 od 7 pozycji bitowej w górę. Bity dla tego zapisu numerowane są od 0 (bit najstarszy) do 15 (bit najmłodszy). Wynikiem będzie więc liczba:

0000001100000000

Dyrektywy assemblera

.cpu

Składnia: .cpu <mera400|mx16>

Odpowiednik przełącznika -c linii poleceń EMAS-a. Pozwala określić typ procesora, dla którego ma być generowany kod wynikowy. Użycie mx16 sprawia, że:

  • mnemoniki CRON, SINT, SIND są rozpoznawane i poprawnie assemblowane
  • maksymalny rozmiar wynikowego pliku binarnego wynosi 64k słowa (32k dla mera400)

.file

Składnia: .file nazwa_pliku

Ustala nazwę assemblowanego pliku. Jeśli assembler będzie chciał użyć w komunikatach nazwy pliku, to domyślna nazwa (zgodna z nazwą assemblowanego pliku) zostanie od momentu wydania dyrektywy zastąpiona podaną.

.line

Składnia: .line numer_linii

Ustala numer bieżącej linii assemblacji (poczynając od linii następującej po dyrektywie). Dalsze linie będą numerowane kolejno od podanej wartości.

.include

Składnia: .include nazwa_pliku

Powoduje dołączenie do assemblacji pliku o podanej nazwie.

.equ

Składnia: .equ nazwa_zmiennej wartość

Ustala wartość zmiennej assemblacji. Może być ona w dalszej części programu zmieniana.

.const

Składnia: .const nazwa_zmiennej wartość

Ustala wartość stałej assemblacji. Wartość ta nie może ulec zmianie.

.lbyte

Składnia: .lbyte liczba_8_bit [, ...]

Zapisuje w programie wynikowym na lewych pozycjach (MSB) kolejnych słów podane wartośći 8-bit.

.rbyte

Składnia: .rbyte liczba_8_bit [, ...]

Zapisuje w programie wynikowym na prawych pozycjach (LSB) kolejnych słów podane wartośći 8-bit.

.word

Składnia: .word liczba_16_bit [, ...]

Zapisuje w programie kolejne słowa 16-bit o podanej wartości.

.dword

Składnia: .dword liczba_32_bit [, ...]

Zapisuje w programie wynikowym pary słów 16-bit tworzące podaną liczbę 32-bit.

.float

Składnia: .float liczba_zmiennoprzecinkowa [, ...]

Zapisuje w programie wynikowym trójki słów 16-bit tworzące podaną 48-bit liczbę zmiennoprzecinkową w notacji używanej przez arytmometr wielokrotnej precyzji MERY-400.

.ascii

Składnia: .ascii łańcuch

Zapisuje w programie wynikowym podany łańcuch, kodując go po dwa znaki ASCII na słowo maszynowe.

.asciiz

Składnia: .asciiz łańcuch

Zapisuje w programie wynikowym podany łańcuch, kodując go po dwa znaki ASCII na słowo maszynowe. Łańcuch terminowany jest 8-bit wartością '0'.

.r40

Składnia: .r40 łańcuch_r40

Zapisuje w programie wynikowym podany łańcuch, kodując go po trzy znaki R40 na słowo maszynowe. UWAGA: W kodzie R40 można użyuwać jedynie liter, liczb i znaków specjalnych: _, #, %.

.res

Składnia: .res rozmiar [,liczba_16_bit]

Rezerwuje w programie wynikowym obszar o podanym rozmiarze (w słowach), wypełniając go zerami. Jeśli podany jest drugi argument, jego wartość używana jest do wypełnienia zamiast zera.

.org

Składnia: .org adres

Ustala nową bieżącą pozycję assemblacji. Następne wygenerowane słowo zostanie umieszczone już pod podanym, nowym adresem.

.entry

Składnia: .entry adres

Dyrektywa ma efekt wyłącznie w przypadku generowania pliku wynikowego jako obiektu EMELF. Określa adres wejścia do programu.

.global

Składnia: .global nazwa_etykiety

Dyrektywa ma efekt wyłącznie w przypadku generowania pliku wynikowego jako obiektu EMELF. Wskazuje, że etykieta będzie miała zasięg globalny.

Rozkazy