EMDAS: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
(Nie pokazano 2 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 12: | Linia 16: | ||
* '''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. | ** '''-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''. |
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.