EMDAS: Różnice pomiędzy wersjami

Z MERA 400 wiki
Przejdź do nawigacji Przejdź do wyszukiwania
Nie podano opisu zmian
Nie podano opisu zmian
 
(Nie pokazano 3 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
EMDAS jest deassemblerem binariów MERY 400. Jego wyjściem jest program assemblerowy w składni akceptowanej przez [[EMAS]]. EMDAS przeprowadza analizę kodu pozwalającą w prostych przypadkach na umieszczenie w wynikowym listingu etykiet, co ułatwia jego analizę.
EMDAS jest deassemblerem binariów MERY 400. Jego wyjściem jest program assemblerowy w składni akceptowanej przez [[EMAS]]-a. EMDAS przeprowadza analizę kodu pozwalającą w prostych przypadkach na umieszczenie w wynikowym listingu etykiet, co ułatwia jego analizę.
 
Deassembler dostępny jest jako samodzielny program, oraz biblioteka.
 
Repozytorium źródeł EMDAS: https://github.com/jakubfi/emdas


= Wywołanie =
= Wywołanie =
Linia 11: Linia 15:
* '''wejście''' - nazwa wejściowego pliku binarnego
* '''wejście''' - nazwa wejściowego pliku binarnego
* '''opcje''' - dowolne z:
* '''opcje''' - dowolne z:
** '''-o wyjście''' - nazwa wyjściowego pliku z listingiem. Jeśli nie zostanie podana, listing drukowany jest na standardowe wyjście.
** '''-o wyjście''' - ustal nazwę wyjściowego pliku z listingiem. Jeśli nie zostanie podana, listing drukowany jest na standardowe wyjście.
** '''-c cpu''' - użyj listy rozkazów wskazanego procesora (dostępne: mera400, mx16, domyślnie mera400)
** '''-a <adres>''' - ustaw adres bazowy deasemblacji (domyślnie 0)
** '''-l''' - użyj mnemoników pisanych małymi literami
** '''-na''' - nie umieszczaj w listingu adresów
** '''-na''' - nie umieszczaj w listingu adresów
** '''-nv''' - nie umieszczaj w listingu komentarzy z wartościami słów zawierających rozkazy
** '''-nc''' - nie umieszczaj w listingu komentarzy z alternatywną deassemblacją
** '''-nl''' - nie analizuj kodu i nie umieszczaj w listingu etykiet
** '''-nl''' - nie analizuj kodu i nie umieszczaj w listingu etykiet
** '''-v''' - wyświetl informację o wersji i zakończ działanie
** '''-v''' - wyświetl informację o wersji i zakończ działanie
** '''-h''' - wyświetl pomoc i zakończ działanie
** '''-h''' - wyświetl pomoc i zakończ działanie


Aby listing był programem poprawnym dla [[EMAS]], należy wyłączyć drugowanie adresów. Przykładowe wywołanie dające taki wynik to:
Aby listing był programem poprawnym dla [[EMAS]], należy wyłączyć drukowanie adresów. Przykładowe wywołanie dające taki wynik to:


  emdas -na em400/boot/boot_winch.bin boot.asm
  emdas -na em400/boot/boot_winch.bin boot.asm
= Biblioteka =
Wraz z narzędziem wywoływanym z linii poleceń instalowana jest biblioteka dynamiczna ''libemdas''.
== Funkcje biblioteczne ==
''struct emdas'' *'''emdas_create'''(''int'' '''iset_type''', ''emdas_getfun'' '''getfun''')
: Utwórz instancję deassemblera używającego listy rozkazów ''iset_type'' (''EMD_ISET_MERA400'' lub ''EMD_ISET_MX16'') i funkcji ''getfun'' służącej do pobrania słowa z pamięci. Funkcja ma definicję: ''uint16_t'' * '''emdas_getfun'''(''int'' '''nb''', ''uint16_t'' '''addr'''). Jako argumenty przyjmuje numer bloku pamięci ''nb'' (0-15) i adres ''addr''. Funkcja zwraca wskaźnik do instancji deassemblera lub ''NULL'', jeśli nie udało się go utworzyć. W takim przypadku zmienna ''emdas_error'' zawiera przyczynę niepowodzenia.
''void'' '''emdas_destroy'''(''struct emdas'' *'''emd''')
: Usuń instancję deassemblera.
''int'' '''emdas_set_features'''(''struct emdas'' *'''emd''', ''unsigned'' '''features''')
: Ustaw właściwości deassemblera na ''features'', które zawierają sumę logiczną dowolnych z:
:* EMD_FEAT_NONE - brak właściwości
:* EMD_FEAT_ADDR - umieszczas adresy w listingu
:* EMD_FEAT_LMNEMO - używaj mnemoników pisanych małymi literami
:* EMD_FEAT_ALTS - załączaj komentarze z alternatywną deassemblacją
:* EMD_FEAT_IOARGS - traktuj cztery kolejne słowa za instrukcjami IN i OU jako ich argumenty
: Funkcja zwraca ''EMD_E_OK'' w przypadku powodzenia, lub ''EMD_E_FEATURE_UNKNOWN'' w przypadku próby ustawienia nieznanej właściwości.
''unsigned'' '''emdas_get_features'''(''struct emdas'' *'''emd''');
: Pobierz właściwości deassemblera.
''int'' '''emdas_set_tabs'''(''struct emdas'' *'''emd''', ''unsigned'' '''label''', ''unsigned'' '''mnemo''', ''unsigned'' '''arg''', ''unsigned'' '''alt''')
: Ustaw tabulacje dla listingu. Każda linia deassemblacji rozpoczyna się od kolumny 0 i może składa się z pięciu elementów, z których dla czterech ostatnich można ustawić kolumnę początkową:
:* adres
:* etykieta
:* mnemonik
:* argumenty
:* komentarz z alternatywami
: Funkcja zwraca ''EMD_E_OK'' w przypadku powodzenia, lub ''EMD_E_TABS_MISPLACED'' w przypadku próby ustawienia błędnych tabulacji.
''void'' '''emdas_set_nl'''(''struct emdas'' *'''emd''', ''char'' '''c''')
: Ustaw znak kończący linię deassemblacji na ''c''.
''char'' * '''emdas_get_buf'''(''struct emdas'' *'''emd''');
: Pobierz wskaźnik do bufora, w którym deassembler zapisuje wynik deassemblacji. Wskaźnik nie zmienia się w trakcie życia instancji deassemblera.
''int'' '''emdas_analyze'''(''struct emdas'' *'''emd''', ''unsigned'' '''nb''', ''uint16_t'' '''addr''', ''unsigned'' '''size''');
: Przeprowadź analizę ''size'' słów pamięci w bloku ''nb'', poczynając od adresu ''addr''. Analiza ma na celu ustalenie etykiet na podstawie argumentów rozkazów. Będą one później użyte przy deassemblacji i drukowaniu listingu funkcją ''emdas_dasm''.
''int'' '''emdas_dasm'''(''struct emdas'' *'''emd''', ''unsigned'' '''nb''', ''uint16_t'' '''addr''');
: Przeprowadź deassemblację jednej instrukcji poczynając od adresu ''addr'' w bloku pamięci ''nb''. Funkcja zwraca wartość >=0 - ilość słów pamięci użytych w przypadku przeprowadzenia poprawnej deassemblacji, lub wartość ujemną wskazującą błąd.
''int'' '''emdas_get_linecnt'''(''struct emdas'' *'''emd''');
: Pobierz ilość linii listingu będących wynikiem ostatniego wywołania funkcji ''emdas_dasm''.

Aktualna wersja na dzień 18:43, 9 sty 2016

EMDAS jest deassemblerem binariów MERY 400. Jego wyjściem jest program assemblerowy w składni akceptowanej przez EMAS-a. EMDAS przeprowadza analizę kodu pozwalającą w prostych przypadkach na umieszczenie w wynikowym listingu etykiet, co ułatwia jego analizę.

Deassembler dostępny jest jako samodzielny program, oraz biblioteka.

Repozytorium źródeł EMDAS: https://github.com/jakubfi/emdas

Wywołanie

Wywołanie EMDAS z linii poleceń ma postać:

emdas [opcje] wejście

Gdzie:

  • wejście - nazwa wejściowego pliku binarnego
  • opcje - dowolne z:
    • -o wyjście - ustal nazwę wyjściowego pliku z listingiem. Jeśli nie zostanie podana, listing drukowany jest na standardowe wyjście.
    • -c cpu - użyj listy rozkazów wskazanego procesora (dostępne: mera400, mx16, domyślnie mera400)
    • -a <adres> - ustaw adres bazowy deasemblacji (domyślnie 0)
    • -l - użyj mnemoników pisanych małymi literami
    • -na - nie umieszczaj w listingu adresów
    • -nc - nie umieszczaj w listingu komentarzy z alternatywną deassemblacją
    • -nl - nie analizuj kodu i nie umieszczaj w listingu etykiet
    • -v - wyświetl informację o wersji i zakończ działanie
    • -h - wyświetl pomoc i zakończ działanie

Aby listing był programem poprawnym dla EMAS, należy wyłączyć drukowanie adresów. Przykładowe wywołanie dające taki wynik to:

emdas -na em400/boot/boot_winch.bin boot.asm

Biblioteka

Wraz z narzędziem wywoływanym z linii poleceń instalowana jest biblioteka dynamiczna libemdas.

Funkcje biblioteczne

struct emdas *emdas_create(int iset_type, emdas_getfun getfun)

Utwórz instancję deassemblera używającego listy rozkazów iset_type (EMD_ISET_MERA400 lub EMD_ISET_MX16) i funkcji getfun służącej do pobrania słowa z pamięci. Funkcja ma definicję: uint16_t * emdas_getfun(int nb, uint16_t addr). Jako argumenty przyjmuje numer bloku pamięci nb (0-15) i adres addr. Funkcja zwraca wskaźnik do instancji deassemblera lub NULL, jeśli nie udało się go utworzyć. W takim przypadku zmienna emdas_error zawiera przyczynę niepowodzenia.

void emdas_destroy(struct emdas *emd)

Usuń instancję deassemblera.

int emdas_set_features(struct emdas *emd, unsigned features)

Ustaw właściwości deassemblera na features, które zawierają sumę logiczną dowolnych z:
  • EMD_FEAT_NONE - brak właściwości
  • EMD_FEAT_ADDR - umieszczas adresy w listingu
  • EMD_FEAT_LMNEMO - używaj mnemoników pisanych małymi literami
  • EMD_FEAT_ALTS - załączaj komentarze z alternatywną deassemblacją
  • EMD_FEAT_IOARGS - traktuj cztery kolejne słowa za instrukcjami IN i OU jako ich argumenty
Funkcja zwraca EMD_E_OK w przypadku powodzenia, lub EMD_E_FEATURE_UNKNOWN w przypadku próby ustawienia nieznanej właściwości.

unsigned emdas_get_features(struct emdas *emd);

Pobierz właściwości deassemblera.

int emdas_set_tabs(struct emdas *emd, unsigned label, unsigned mnemo, unsigned arg, unsigned alt)

Ustaw tabulacje dla listingu. Każda linia deassemblacji rozpoczyna się od kolumny 0 i może składa się z pięciu elementów, z których dla czterech ostatnich można ustawić kolumnę początkową:
  • adres
  • etykieta
  • mnemonik
  • argumenty
  • komentarz z alternatywami
Funkcja zwraca EMD_E_OK w przypadku powodzenia, lub EMD_E_TABS_MISPLACED w przypadku próby ustawienia błędnych tabulacji.

void emdas_set_nl(struct emdas *emd, char c)

Ustaw znak kończący linię deassemblacji na c.

char * emdas_get_buf(struct emdas *emd);

Pobierz wskaźnik do bufora, w którym deassembler zapisuje wynik deassemblacji. Wskaźnik nie zmienia się w trakcie życia instancji deassemblera.

int emdas_analyze(struct emdas *emd, unsigned nb, uint16_t addr, unsigned size);

Przeprowadź analizę size słów pamięci w bloku nb, poczynając od adresu addr. Analiza ma na celu ustalenie etykiet na podstawie argumentów rozkazów. Będą one później użyte przy deassemblacji i drukowaniu listingu funkcją emdas_dasm.

int emdas_dasm(struct emdas *emd, unsigned nb, uint16_t addr);

Przeprowadź deassemblację jednej instrukcji poczynając od adresu addr w bloku pamięci nb. Funkcja zwraca wartość >=0 - ilość słów pamięci użytych w przypadku przeprowadzenia poprawnej deassemblacji, lub wartość ujemną wskazującą błąd.

int emdas_get_linecnt(struct emdas *emd);

Pobierz ilość linii listingu będących wynikiem ostatniego wywołania funkcji emdas_dasm.