Debugger EM400: Różnice pomiędzy wersjami

Z MERA 400 wiki
Przejdź do nawigacji Przejdź do wyszukiwania
Nie podano opisu zmian
Nie podano opisu zmian
Linia 16: Linia 16:
* '''reset''' - Zresetuj emulowaną maszynę. Wpisuje ''0'' do wszystkich rejestrów i wskaźników.
* '''reset''' - Zresetuj emulowaną maszynę. Wpisuje ''0'' do wszystkich rejestrów i wskaźników.
* '''dasm [[''addr''] ''n'']''' - Wyświetl deasemblację zawartości pamięci. Jeśli żaden parametr nie został podany, deasemblowana jest instrukcja wskazana przez licznik rozkazów. Jeśli podany jest opcjonalny parametr ''n'' deasemblowanych jest ''n'' kolejnych instrukcji. Jeśli podano również parametr ''addr'', deasemblacja rozpoczynana jest od adresu ''addr''
* '''dasm [[''addr''] ''n'']''' - Wyświetl deasemblację zawartości pamięci. Jeśli żaden parametr nie został podany, deasemblowana jest instrukcja wskazana przez licznik rozkazów. Jeśli podany jest opcjonalny parametr ''n'' deasemblowanych jest ''n'' kolejnych instrukcji. Jeśli podano również parametr ''addr'', deasemblacja rozpoczynana jest od adresu ''addr''
* '''trans [[''addr''] ''n'']''' - Jak wyżej, ale zamiast kodu assemblera wyświetlany jest pseudokod.
* '''mem [''blok'':] ''<start>'' ''[ilość]''''' - Wyświetl ''ilość'' słów pamięci od adresu ''start''. Jeśli nie podano bloku pamięci ''blok'' wyświetlana jest zawartość bloku wskazanego przez ''Q'' i ''NB''. Jeśli nie podano ''długości'', przyjmowana jest wartość 16.
* '''mem [''blok'':] ''<start>'' ''[ilość]''''' - Wyświetl ''ilość'' słów pamięci od adresu ''start''. Jeśli nie podano bloku pamięci ''blok'' wyświetlana jest zawartość bloku wskazanego przez ''Q'' i ''NB''. Jeśli nie podano ''długości'', przyjmowana jest wartość 16.
* '''memcl''' - Wyczyść zawartość całej pamięci
* '''memcl''' - Wyczyść zawartość całej pamięci
Linia 41: Linia 40:
** '''log on''' - włączenie logowania
** '''log on''' - włączenie logowania
** '''log off''' - wyłączenie logowania
** '''log off''' - wyłączenie logowania
** '''log file <plik>''' - podanie zbioru, do którego zapisywany będzie log
** '''log <komponent>=<poziom>''' - ustawienie poziomu logowania dla danego komponentu. Im większy poziom logowania, tym więcej szczegółów jest logowanych. W praktyce wykorzystywane są poziomy 1-9. Dostępne komponenty to:
** '''log <domena>:<poziom>''' - ustawienie poziomu logowania dla danej domeny. Im większy poziom logowania, tym więcej szczegółów jest logowanych. W praktyce wykorzystywane są poziomy 1-100. Dostępne domeny to:
*** reg - operacje na rejestrach
*** reg - operacje na rejestrach
*** mem - operacje na pamięci
*** mem - operacje na pamięci

Wersja z 08:28, 25 lis 2014

Debugger emulatora EM400 pozwala śledzić i kontrolować stan emulowanej maszyny.

W linii poleceń debuggera można używać następujących konstrukcji:

Polecenia

Polecenia służą do sterowania pracą emulatora i debuggera oraz wyświetlania informacji o stanie emulowanej maszyny.

  • quit - Zakończ pracę emulatora
  • step [n] - Wykonaj instrukcję wskazaną przez licznik rozkazów. Jeśli opcjonalny parametr n jest obecny, wykonaj n kolejnych instrukcji.
  • run - Kontynuuj emulację aż do napotkania kolejnej pułapki
  • load <plik> [n] - Załaduj zawartość pliku do bloku pamięci n.
  • help [cmd] - Wyświetl pomoc. Jeśli opcjonalny parametr cmd jest obecny, wyświetl pomoc na temat komendy cmd.
  • regs - Wyświetl zawartość rejestrów R1-R7
  • sregs - Wyświetl zawartość rejestrów R0, IR, IC, SR
  • reset - Zresetuj emulowaną maszynę. Wpisuje 0 do wszystkich rejestrów i wskaźników.
  • dasm [[addr] n] - Wyświetl deasemblację zawartości pamięci. Jeśli żaden parametr nie został podany, deasemblowana jest instrukcja wskazana przez licznik rozkazów. Jeśli podany jest opcjonalny parametr n deasemblowanych jest n kolejnych instrukcji. Jeśli podano również parametr addr, deasemblacja rozpoczynana jest od adresu addr
  • mem [blok:] <start> [ilość] - Wyświetl ilość słów pamięci od adresu start. Jeśli nie podano bloku pamięci blok wyświetlana jest zawartość bloku wskazanego przez Q i NB. Jeśli nie podano długości, przyjmowana jest wartość 16.
  • memcl - Wyczyść zawartość całej pamięci
  • memcfg - Pokaż sprzętową i programową konfigurację pamięci
  • stk - Pokaż stos
  • watch - Śledzenie wartości wyrażeń
    • watch - wyświetl śledzone wyrażenia
    • watch add <wyrażenie> - dodaj wyrażenie do śledzonych
    • watch del <numer> - usuń wyrażenie o numerze ze śledzonych
  • decode - Dekodowanie struktur danych
    • decode - wyświetl istniejące dekodery
    • decode <dekoder> <adres> - zdekoduj strukturę pod danym adresem używając danego dekodera
  • brk - Operowanie pułapkami (breakpointami):
    • brk - wyświetlenie ustawionych pułapek
    • brk add <wyrażenie> - dodanie nowej pułapki, która jest aktywowana, gdy wyrażenie jest spełnione (różne od zera)
    • brk del <numer> - usunięcie pułapki o danym numerze
    • brk test <numer> - testowanie warunku pułapki
    • brk off <numer> - tymczasowe wyłączenie pułapki
    • brk on <numer> - ponowne włączenie pułapki
    • brk off - tymczasowe wyłączenie wszystkich pułapek
    • brk on - ponowne włączenie wszystkich pułapek
  • log - logowanie operacji emulatora do pliku
    • log - wyświetlenie bieżących ustawień logowania
    • log on - włączenie logowania
    • log off - wyłączenie logowania
    • log <komponent>=<poziom> - ustawienie poziomu logowania dla danego komponentu. Im większy poziom logowania, tym więcej szczegółów jest logowanych. W praktyce wykorzystywane są poziomy 1-9. Dostępne komponenty to:
      • reg - operacje na rejestrach
      • mem - operacje na pamięci
      • cpu - operacje wykonywane przez CPU
      • op - szczegóły wykonania rozkazu
      • int - operacje związane z przerwaniami
      • io - operacje wejścia/wyjścia
      • mx - MULTIX
      • px - PLIX
      • cchr - kanał znakowy
      • cmem - kanał pamięciowy
      • term - terminale
      • wnch - winchestery
      • flop - stacje dyskietek
      • crk5 - system operacyjny CROOK-5
      • all - wszystkie
  • timer - kontrola zegara czasu rzeczywistego
    • timer on - włączenie timera
    • timer off - wyłączenie timera
  • find <blok> <wartość> - wyszukiwanie wartości w bloku pamięci

Wyrażenia

Wyrażenia pozwalają w linii poleceń debuggera przeprowadzać obliczenia oraz manipulować zawartością rejestrów, pamięci i zmiennych. Rezultat wyrażenia wyświetlany jest również w linii poleceń, natychmiast po jego obliczeniu. Elementem każdego wyrażenia mogą być:

  • Liczba w systemie dziesiętnym, ósemkowym, szesnastkowym lub binarnym (np.: 15, 0177, 0xffa8, 0b1011100111011110)
  • Rejestry: R0-R7, IC, IR, SR, KB oraz pseudo-rejestr MOD zawierający bieżącą wartość modyfikatora
  • Stan przerwania w rejestrze przerwań RZ dostępny jako RZ[numer_przerwania] (np.: RZ[6], RZ[zmienna+1])
  • Zawartość komórki pamięci, adresowane jako [adres] lub [blok:adres]
  • Zmienne: debugger pozwala na użycie dowolnej zmiennej, której nazwa nie jest słowem kluczowym (poleceniem), np: a, adres, zmienna3.

Domyślnie, liczby w linii poleceń debuggera wyświetlane są jako liczby szesnastkowe bez znaku. Możliwa jest jednak konwersja do innego zapisu:

  • uint(wyrażenie) - wartość wyrażenia zostanie potraktowana jako 16-bitowa liczba bez znaku i wyświetlona w systemie dziesiętnym
  • int(wyrażenie) - wartość wyrażenia zostanie wyświetlona w systemie dziesiętnym, ze znakiem
  • hex(wyrażenie) - wartość wyrażenia zostanie wyświetlona w systemie szesnastkowym
  • oct(wyrażenie) - wartość wyrażenia zostanie wyświetlona w systemie ósemkowym
  • bin(wyrażenie) - wartość wyrażenia zostanie wyświetlona w systemie dwójkowym

W wyrażeniach dozwolone są następujące operatory:

  • arytmetyczne: +, -, *
  • logiczne: &&, ||, !
  • bitowe: &, |, ^, ~
  • przesunięć bitowych: <<, >>
  • porównań: ==, !=, <=, >=, >, <
  • przypisania: = (lewa strona wyrażenia musi być rejestrem, zmienną, komórką pamięci lub pozycją rejestru RZ)
  • wyłuskiwania bitów: [b] i [b-e]. Wyłuskiwanie bitów pozwala na "wycięcie" z 16-bitowego słowa dowolnego ciągu bitów i użycie go jako nowej wartości, np:
    • 1[0] - najstarszy bit liczby 1 (ponieważ operacja wykonywana jest na 16-bitowej liczbie, wynikiem będzie 0)
    • r1[3] - trzeci bit rejestru r1
    • [0x7a][2-9] - bity od 2 do 9 słowa znajdującego się w bieżącym bloku pamięci pod adresem 0x7a
    • zmienna[15] - najmłodszy bit zmiennej zmienna

Debugger pozwala na obliczenie wartości wielu wyrażeń w jednej linii polecenia i wyświetlenie wyników również w jednej linii odpowiedzi. Można to zrobić podając kolejne wyrażenia oddzielone przecinkami, np:

em400> 1+2, oct(12+[9]), dec(r1-1), a=12, [a], [a]=1, [a]
0x3 033 -1 0xc 0x0 0x1 0x1