EMAS: Różnice pomiędzy wersjami

Przejdź do nawigacji Przejdź do wyszukiwania
Dodane 3742 bajty ,  1 gru 2021
 
(Nie pokazano 16 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
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]]).
EMAS jest assemblerem skrośnym dla komputera MERA 400, używającym (w odróżnieniu od [[ASSEM]] i ASSM) składni bliższej współczesnym assemblerom.


Repozytorium źródeł EMAS: https://github.com/jakubfi/emas
Repozytorium źródeł EMAS-a dostępne jest pod adresem: https://github.com/jakubfi/emas


= Wywołanie =
= Wywołanie =
Linia 22: Linia 22:
*** ''emelf'' - nazwa pliku wejściowego z rozszerzeniem zamienionym na '.o'. Jeśli wejście nie jest plikiem, to wyjściem jest plik 'a.out'
*** ''emelf'' - nazwa pliku wejściowego z rozszerzeniem zamienionym na '.o'. Jeśli wejście nie jest plikiem, to wyjściem jest plik 'a.out'
*** ''debug'' i ''keys'' - standardowe wyjście
*** ''debug'' i ''keys'' - standardowe wyjście
** '''-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''. Opcja nadpisuje wybór dokonany w źródłe dyrektywą '''.cpu'''.
** '''-I <katalog>''' - dodaj katalog do listy katalogów, w których poszukiwane będą pliki dołączane dyrektywą .include
** '''-I <katalog>''' - dodaj katalog do listy katalogów, w których poszukiwane będą pliki dołączane dyrektywą .include
** '''-D <stała>[=wartość]''' - zdefiniuj stałą i opcjonalnie nadaj jej wartość
** '''-D <stała>[=wartość]''' - zdefiniuj stałą i opcjonalnie nadaj jej wartość
Linia 54: Linia 54:
=== Liczby całkowite ===
=== Liczby całkowite ===


Liczby całkowite można zapisywać w systemie binarnym, ósemkowym, dziesiętnym lub szesnastkowym, np:
Liczby całkowite można zapisywać w systemie binarnym, ósemkowym, dziesiętnym lub szesnastkowym. Dozwolone jest też rozdzielanie cyfr znakiem podkreślenia.


  0b1101110000
  0b1101110000
0b_1111_0000_1100_0011
  0177
  0177
  -931
  -931
Linia 80: Linia 81:
  'ab', '\r\n', '\xaa\0001'
  '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:
kodowane są jako wartości podanych znaków w kodzie ASCII odpowiednio na starszym i młodszym bajcie słowa.
 
'abc', 'XYZ', '#_1'
 
kodowane są w słowie za pomocą [[CROOK-5 - Interpretator zleceń użytkownika - XOSL#Kod R40|kodu R40]].


=== Liczby zmiennoprzecinkowe ===
=== Liczby zmiennoprzecinkowe ===
Linia 188: Linia 185:
  lw r2, zmienna.b
  lw r2, zmienna.b


=== Dostępność symboli na zewnątrz obiektu ===
=== Widoczność symboli dla konsolidatora ===


Wszystkie symbole definiowane są jako lokalne dla obiektu. Jeśli symbol ma być widoczny dla konsolidatora, należy go zadeklarować jako zewnętrzny dyrektywą '''.global'''. Zmiana zasięgu może nastąpić przed, lub po definicji:
Wszystkie symbole definiowane są jako widoczne wyłącznie w ramach asemblowanego obiektu. Jeśli symbol ma być widoczny dla konsolidatora, należy go zadeklarować jako zewnętrzny dyrektywą '''.global'''. Zmiana zasięgu może nastąpić przed, lub po definicji:


  .global printf
  .global printf
Linia 274: Linia 271:


Ustala wartość stałej assemblacji. Wartość ta nie może ulec zmianie.
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.
Zapisuje w programie wynikowym na prawych pozycjach (LSB) kolejnych słów podane wartośći 8-bit.
Linia 316: Linia 303:


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'.
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 ===
=== .res ===
Linia 345: Linia 326:
'''Składnia:''' .global ''nazwa_etykiety''
'''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.
Dyrektywa ma efekt wyłącznie w przypadku generowania pliku wynikowego jako obiektu EMELF. Wskazuje, że symbol będzie widoczny dla linkera.
 
=== .ifdef, .ifndef ===
 
Dyrektywa pozwala na asemblację warunkową podejmowaną istnieniem (bądź nie) zdefiniowanego symbolu.
 
.ifdef SYMBOL
... kod asemblowany, jeśl SYMBOL jest zdefiniowany ...
.else
... kod asemblowany, jeśli SYMBOL nie jest zdefiniowany ...
.endif
 
.ifndef SYMBOL
... kod asemblowany, jeśli SYMBOL nie jest zdefiniwoany
.endif
 
Symbol określający warunek może być zarówno etykietą, stałą lub zmienną zdefiniowaną w pliku źródłowym, jak również stałą zdefiniowaną podczas wywołania emas-a z opcją '-D'
 
=== .struct ===
 
Dyrektywa ta pozwala na stworzenie opisu struktury danych w celu uczynienia kodu źródłowego bardziej czytelnym. Nie formalizuje ona struktury, a jedynie ułatwia pracę z danymi. Przykład opisu struktury 'struktura':
 
.struct struktura:
    adres .res 1
    dluga_liczba .res 2
    tekst .res 64
.endstruct
 
Kolejne pozycje nazywają kolejne pola struktury i określają ich długość w słowach. Po asemblacji symbolom o tych nazwach przypisany zostanie offset w strukturze, a nazwie struktury - jej długość.
 
Użycie struktury w programie może wyglądać następująco:
 
moja_str: .res struktura
lw r3, moja_str
ld r3 + dluga_liczba
lw r7, moja_str + tekst
 
Definicja struktury z powyższego przykładu równoważna jest de facto następującemu ciągowi dyrektyw:
 
.const adres 0        ; offset pola 'adres'
.const dluga_liczba 1  ; offset pola 'dluga_liczba'
.const tekst 3        ; offset pola 'tekst'
.const struktura 67    ; rozmiar struktury 'struktura'
 
W strukturach można również zawęzić zakres nazewnictwa pól:
 
.struct struktura:
    .adres .res 1
    .dluga_liczba .res 2
    .tekst .res 64
.endstruct
 
Wtedy nazwy pól będą dostępne wyłącznie w kontekście danej struktury, a jej użycie wyglądać będzie następująco:
 
moja_str: .res struktura
lw r3, moja_str
ld r3 + struktura.dluga_liczba
lw r7, moja_str + struktura.tekst


== Rozkazy ==
== Rozkazy ==
EMAS używa mnemoników z [[Lista rozkazów|oryginalnej listy rozkazów]] MERY-400, ale wprowadza zmiany składniowe wynikające z innego zapisu argumentu normalnego. Nie używa przyrostków zależnych od lokalizacji argumentu. Czyli np. rozkaz ```LWn`` z listy rozkazów, gdzie ```n``` zmienia się w zależności od typu argumentu normalnego, ma zawsze mnemonik ```LW```. Lokalizację argumentu określa składnia dla rejestrów rB i rC. Poniższe przykłady ładowania wartości do rejestru r1 przedstawiają wszystkie możliwe postacie argumentu normalnego:
* LW r1, r2 - ładowana jest wartość z rejestru r2
* LW r1, r2+r3 - ładowana jest wartość z rejestru r2 B-modyfikowana (sumowana z) rejestrem r3
* LW r1, [r2] - ładowana jest wartość z komórki pamięci (D-modyfikacja) wskazanej zawartością rejestru r2
* LW r1, [r2+r3] - ładowana jest wartość z komórki pamięci (D-modyfikacja) wskazanej zawartością rejestru r2 B-modyfikowanego (sumowanego z) rejestrem r3
* LW r1, 0x1000 - ładowana jest wartość 0x1000
* LW r1, 0x1000+r2 - ładowana jest wartość 0x1000 B-modyfikowana zawartością (sumowana z) rejestru r2
* LW r1, [0x1000] - ładowana jest wartość z komórki pamięci (D-modyfikacja) o adresie 0x1000
* LW r1, [x1000+r2] - ładowana jest wartość z komórki pamięci (D-modyfikacja) o adresie 0x1000 B-modyfikowanym zawartością rejestru r2
= Pliki nagłówkowe =
Z assemblerem EMAS dostarczany jest [https://github.com/jakubfi/emas/tree/master/asminc zestaw plików nagłówkowych] definiujących stałe przydatne przy programowaniu w obszarze systemu operacyjnego i dla urządzeń wejścia-wyjścia:
* cpu.inc - stałe wynikające z architektury systemu ([[Mapa pamięci|zdefiniowane lokalizacje pamięci]], [[Przerwania|przerwania, maski przerwań]]),
* io.inc - podstawowe stałe przydatne przy konfigurowaniu pamięci, stałe dla systemu wejścia-wyjścia, komendy dla kanału znakowego i wspólne komendy dla urządzeń w nim pracujących,
* mega.inc - komendy dla [[Pamięć MEGA|pamięci mega]] Amepolu,
* multix.inc - stałe i komendy przydatne przy programowaniu procesora peryferyjnego [[MULTIX]].
Znaczenie poszczególnych stałych opisane jest w plikach nagłówkowych, ich rolę opisuje [[DTR|Dokumentacha Techniczno-Ruchowa]] minikomputera.

Menu nawigacyjne