3013
edycji
(Nie pokazano 10 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 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 54: | Linia 56: | ||
?GVZ | ?GVZ | ||
EMAS | 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 === | === Znaki === | ||
EMAS pozwala na zapisywanie stałych całkowitoliczbowych również przy pomocy znaków, dwuznaków lub trójznaków. | 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' | 'a', '\n', '\xa1', '\0177' | ||
kodowane są jako ich wartość w kodzie ASCII na młodszym bajcie słowa. Dwuznaki: | |||
'ab' | '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' | '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 86: | Linia 90: | ||
=== Łańcuchy === | === Łańcuchy === | ||
Łańcuchy znaków są ciągami | Ł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 | * \0'''yyy''' - gdzie '''yyy''' jest ósemkowym kodem znaku | ||
* \x'''yy''' - gdzie '''yy''' jest szesnastkowym kodem znaku | * \x'''yy''' - gdzie '''yy''' jest szesnastkowym kodem znaku | ||
Linia 147: | Linia 152: | ||
.global snprintf | .global snprintf | ||
.global strdup | .global strdup | ||
printf: | printf: | ||
... | ... | ||
Linia 153: | Linia 158: | ||
... | ... | ||
strdup: | strdup: | ||
procedura: | procedura: | ||
.global procedura | .global procedura | ||
Linia 159: | Linia 164: | ||
== Wyrażenia == | == Wyrażenia == | ||
=== Operatory | === 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 == | == Dyrektywy assemblera == | ||
=== .cpu === | === .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 === | === .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 === | === .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 === | === .include === | ||
'''Składnia:''' .include ''nazwa_pliku'' | |||
Powoduje dołączenie do assemblacji pliku o podanej nazwie. | |||
=== .equ === | === .equ === | ||
'''Składnia:''' .equ ''nazwa_zmiennej'' ''wartość'' | |||
Ustala wartość zmiennej assemblacji. Może być ona w dalszej części programu zmieniana. | |||
=== .const === | === .const === | ||
'''Składnia:''' .const ''nazwa_zmiennej'' ''wartość'' | |||
Ustala wartość stałej assemblacji. Wartość ta nie może ulec zmianie. | |||
=== .lbyte === | === .lbyte === | ||
'''Składnia:''' .lbyte ''liczba_8_bit'' [, ...] | |||
Zapisuje w programie wynikowym na lewych pozycjach (MSB) kolejnych słów podane wartośći 8-bit. | |||
=== .rbyte === | === .rbyte === | ||
'''Składnia:''' .rbyte ''liczba_8_bit'' [, ...] | |||
Zapisuje w programie wynikowym na prawych pozycjach (LSB) kolejnych słów podane wartośći 8-bit. | |||
=== .word === | === .word === | ||
'''Składnia:''' .word ''liczba_16_bit'' [, ...] | |||
Zapisuje w programie kolejne słowa 16-bit o podanej wartości. | |||
=== .dword === | === .dword === | ||
'''Składnia:''' .dword ''liczba_32_bit'' [, ...] | |||
Zapisuje w programie wynikowym pary słów 16-bit tworzące podaną liczbę 32-bit. | |||
=== .float === | === .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 === | === .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 === | === .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 === | === .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 === | ||
'''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 === | === .org === | ||
'''Składnia:''' .org ''adres'' | |||
Ustala nową bieżącą pozycję assemblacji. Następne wygenerowane słowo zostanie umieszczone już pod podanym, nowym adresem. | |||
=== .entry === | === .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 === | === .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 == | == Rozkazy == |