Debugger EM400: Różnice pomiędzy wersjami

Z MERA 400 wiki
Przejdź do nawigacji Przejdź do wyszukiwania
 
(Nie pokazano 11 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 8: Linia 8:


* '''quit''' - Zakończ pracę emulatora
* '''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.
* '''cycle''' - Wykonaj instrukcję wskazaną przez licznik rozkazów.
* '''run''' - Kontynuuj emulację aż do napotkania kolejnej pułapki
* '''start''' - Kontynuuj emulację aż do napotkania kolejnej pułapki
* '''load <plik> [''n'']''' - Załaduj zawartość pliku do bloku pamięci ''n''.
* '''load <plik>''' - Załaduj zawartość pliku do bloku pamięci numer 0.
* '''help [''cmd'']''' - Wyświetl pomoc. Jeśli opcjonalny parametr ''cmd'' jest obecny, wyświetl pomoc na temat komendy ''cmd''.
* '''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
* '''regs''' - Wyświetl zawartość rejestrów R1-R7
* '''sregs''' - Wyświetl zawartość rejestrów R0, IR, IC, SR
* '''sregs''' - Wyświetl zawartość rejestrów R0, IR, IC, SR
* '''reset''' - Zresetuj emulowaną maszynę. Wpisuje ''0'' do wszystkich rejestrów i wskaźników.
* '''clear''' - 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 [''block'']: ''<start>''-''<end>''''' - Wyświetl zawartość pamięci od adresu ''start'' do adresu ''end''. Jeśli nie podano bloku pamięci ''block'' wyświetlana jest zawartość bloku wskazanego przez ''Q'' i ''NB''
* '''memcl''' - Wyczyść zawartość całej pamięci
* '''memcfg''' - Pokaż sprzętową i programową konfigurację pamięci
* '''memcfg''' - Pokaż sprzętową i programową konfigurację pamięci
* '''memdump <blok> <plik>''' - zrzuć do pliku zawartość bloku pamięci
* '''stk''' - Pokaż stos
* '''stk''' - Pokaż stos
* '''watch''' - Śledzenie wartości wyrażeń
* '''watch''' - Śledzenie wartości wyrażeń
Linia 32: Linia 31:
** '''brk add <wyrażenie>''' - dodanie nowej pułapki, która jest aktywowana, gdy ''wyrażenie'' jest spełnione (różne od zera)
** '''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 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 off <numer>''' - tymczasowe wyłączenie pułapki
** '''brk on <numer>''' - ponowne włą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''' - logowanie operacji emulatora do pliku
** '''log''' - wyświetlenie bieżących ustawień logowania
** '''log''' - wyświetlenie bieżących ustawień logowania
** '''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>''' - włączenie logowania dla danego komponentu. 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
*** cpu - operacje wykonywane przez CPU
*** cpu - operacje wykonywane przez CPU
*** op - szczegóły wykonania rozkazu
*** int - operacje związane z przerwaniami
*** int - operacje związane z przerwaniami
*** io - operacje wejścia/wyjścia
*** io - operacje wejścia/wyjścia
*** misc - inne
*** mx - [[MULTIX]]
*** px - [[PLIX]]
*** cchr - kanał znakowy
*** cmem - kanał pamięciowy
*** term - terminale
*** wnch - winchestery
*** 9425 - dyski MERA-9425
*** flop - stacje dyskietek
*** pnch - dzirkarka taśmy
*** pnrd - czytnik taśmy dziurkowanej
*** crk5 - system operacyjny [[CROOK|CROOK-5]]
*** em4h - emulator
*** all - wszystkie
*** all - wszystkie
* '''clock''' - kontrola zegara czasu rzeczywistego
** '''clock on''' - włączenie timera
** '''clock off''' - wyłączenie timera
* '''find <blok> <wartość>''' - wyszukiwanie wartości w bloku pamięci
* '''binload <adres>''' - inicjalizacja ładowania binarnego pod zadany adres


= Wyrażenia =
= Wyrażenia =
Linia 80: Linia 96:
** '''[0x7a][2-9]''' - bity od 2 do 9 słowa znajdującego się w bieżącym bloku pamięci pod adresem 0x7a
** '''[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''
** '''zmienna[15]''' - najmłodszy bit zmiennej ''zmienna''
* podróży w czasie - pozwalające na dostęp do zawartości rejestru lub komórki pamięci z poprzedniego cyklu rozkazowego:
** '''.''' - wartość z poprzedniego cyklu rozkazowego, np.: '''.r1''', '''.[15]'''
** '''?>''' - 1 jeśli wartość zmieniła się w ostatnim cyklu rozkazowym, 0 jeśli nie, np.: '''?>r4''', '''?>[0x1452]'''
** '''?<''' - 1 jeśli wartość była odczytywana w ostatnim cyklu rozkazowym, 0 jeśli nie, np.: '''?<r5'''
** '''?''' - 1 jeśli wartość była odczytywana lub zapisywana w ostatnim cyklu rozkazowym, 0 jeśli nie, np.: '''?[060]'''


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:
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]
  em400> 1+2, oct(12+[9]), dec(r1-1), a=12, [a], [a]=1, [a]
  0x3 033 -1 0xc 0x0 0x1 0x1
  0x3 033 -1 0xc 0x0 0x1 0x1

Aktualna wersja na dzień 16:53, 1 gru 2021

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
  • cycle - Wykonaj instrukcję wskazaną przez licznik rozkazów.
  • start - Kontynuuj emulację aż do napotkania kolejnej pułapki
  • load <plik> - Załaduj zawartość pliku do bloku pamięci numer 0.
  • 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
  • clear - 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.
  • memcfg - Pokaż sprzętową i programową konfigurację pamięci
  • memdump <blok> <plik> - zrzuć do pliku zawartość bloku 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 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> - włączenie logowania dla danego komponentu. 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
      • 9425 - dyski MERA-9425
      • flop - stacje dyskietek
      • pnch - dzirkarka taśmy
      • pnrd - czytnik taśmy dziurkowanej
      • crk5 - system operacyjny CROOK-5
      • em4h - emulator
      • all - wszystkie
  • clock - kontrola zegara czasu rzeczywistego
    • clock on - włączenie timera
    • clock off - wyłączenie timera
  • find <blok> <wartość> - wyszukiwanie wartości w bloku pamięci
  • binload <adres> - inicjalizacja ładowania binarnego pod zadany adres

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