3030
edycji
(Utworzono nową stronę "EMDAS jest deassemblerem binariów MERY 400. Jego wyjściem jest program assemblerowy w składni akceptowanej przez EMAS. EMDAS przeprowadza analizę kodu pozwalają...") |
Nie podano opisu zmian |
||
(Nie pokazano 4 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 5: | Linia 9: | ||
Wywołanie EMDAS z linii poleceń ma postać: | Wywołanie EMDAS z linii poleceń ma postać: | ||
emdas [opcje] wejście | emdas [opcje] wejście | ||
Gdzie: | Gdzie: | ||
* '''wejście''' - nazwa wejściowego pliku binarnego | * '''wejście''' - nazwa wejściowego pliku binarnego | ||
* '''opcje''' - dowolne z: | * '''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 | ** '''-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 | ** '''-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ć | 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''. |