EMAS: Różnice pomiędzy wersjami

Przejdź do nawigacji Przejdź do wyszukiwania
Dodane 1712 bajtów ,  1 gru 2021
Nie podano opisu zmian
 
(Nie pokazano 9 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
EMAS jest assemblerem skrośnym dla komputera MERA 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-a dostępne jest pod adresem: https://github.com/jakubfi/emas
Repozytorium źródeł EMAS-a dostępne jest pod adresem: https://github.com/jakubfi/emas
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 ===
=== .ifdef, .ifndef ===
Linia 408: Linia 389:
== Rozkazy ==
== Rozkazy ==


Patrz: [[Lista rozkazów]].
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