3012
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 | 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 | kodowane są jako wartości podanych znaków w kodzie ASCII odpowiednio na starszym i młodszym bajcie słowa. | ||
=== Liczby zmiennoprzecinkowe === | === Liczby zmiennoprzecinkowe === | ||
Linia 157: | Linia 153: | ||
=== Zasięg symboli === | === Zasięg symboli === | ||
Wszystkie symbole definiowane są jako | 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. | ||
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'. | ||
=== .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 | 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]]. |