EMDAS: Różnice pomiędzy wersjami

Przejdź do nawigacji Przejdź do wyszukiwania
Dodane 3845 bajtów ,  9 sty 2016
brak opisu edycji
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''.

Menu nawigacyjne