EMAS: Różnice pomiędzy wersjami

Przejdź do nawigacji Przejdź do wyszukiwania
Dodane 2493 bajty ,  22 lut 2019
brak opisu edycji
Nie podano opisu zmian
(Nie pokazano 12 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]]) 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
Repozytorium źródeł EMAS-a dostępne jest pod adresem: https://github.com/jakubfi/emas


= Wywołanie =
= Wywołanie =
Linia 80: Linia 80:
  '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 157: Linia 153:
=== Zasięg symboli ===
=== 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:
EMAS pozwala na zawężenie zasięgu symbolu przez poprzedzenie go kropką. Tak zdefiniowany symbol dostępny jest w zakresie od poprzedniego do następnego symbolu globalnego. Dzięki temu możliwe jest używanie takich samych nazw etykiet lokalnych w różnych kontekstach. Na przykład:
 
globalny1:
...
.lokalny:
...
ujs lokalny
globalny2:
.lokalny:
...
ujs lokalny
 
Skok 'ujs' wykonany zostanie każdorazowo do adresu opisanego symbolem ".lokalny", różnego dla zasięgów "globalny1" i "globalny2". Symbol lokalny nie może być zdefiniowany, jeśli uprzednio nie wystąpił żaden symbol globalny.
 
Można również odwołać się do lokalnego symbolu spoza jego zasięgu poprzedzając jego nazwę nazwą symbolu globalnego, w kontekście którego został zdefiniowany:
 
globalny1.lokalny
globalny2.lokalny
 
Lokalnych symboli można używać również definiując stałe i zmienne:
 
zmienna:
.equ a 1
.equ b 2
 
i odwoływać się do nich:
 
lw r1, zmienna.a
lw r2, zmienna.b
 
=== Widoczność symboli dla konsolidatora ===
 
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 241: Linia 270:


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 283: Linia 302:


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 312: Linia 325:
'''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 ==
Patrz: [[Lista rozkazów]].

Menu nawigacyjne