Przykład - Debugger Język pewnego procesora zawiera następujące instrukcje: MOV l, r l:=r ADD l, r l := l + r SUB l, r l := l - r JMP instr skok.

Slides:



Advertisements
Podobne prezentacje
Tablice 1. Deklaracja tablicy
Advertisements

Tryby adresowania Prawie każda operacja wykonywana przez mikroprocesor wykonywana jest na pewnych argumentach (lub argumencie). Sposoby wskazywania argumentów.
Związki w UML.
Grażyna Mirkowska PJWSTK, 10 stycznia 2001
Wykład 10 Metody Analizy Programów Specyfikacja Struktur Danych
Imperatywne modele obliczeń Copyright, 2000 © Jerzy R. Nawrocki Wprowadzenie do.
Generics w .NET 2.0 Łukasz Rzeszot.
PROGRAMOWANIE STRUKTURALNE
CPU.
Elementarne struktury danych Piotr Prokopowicz
Zrównoleglanie programu sekwencyjnego
1 RISC – nasze założenia Podstawowe cechy: Wszystkie operacje są realizowane na rejestrach, Tylko operacje typu load i store wymagają dostępu do pamięci,
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące1 Komunikaty do self Odbiorcą jest obiekt, w którym wykonuje się ten komunikat Szukanie metody.
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące1 Komunikaty do self Odbiorcą jest obiekt, w którym wykonuje się ten komunikat Szukanie metody.
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące1 Stałe liczby (Integer, Float, Fraction) e-3 4/7 znaki (Character) $a$$$#$. napisy.
OOPSmalltalk - Licznik, metodologia1 Analiza i projektowanie obiektowe 3 fazy: –analiza problemu - modelowanie (m.in. podział na klasy) –projektowanie.
20/09/ Języki programowania 1 Piotr Górczyński Debugowanie kodu.
Wykład 5 Przerwania w systemie SAB80C537 dr inż. Andrzej Przybył
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 7: Procedury i funkcje © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 5: Typy porządkowe, wyliczeniowe i okrojone. Definiowanie.
GDB Omówienie z przykładami
Alokacja pamięci struct Test {char c; int n; double x; } st1; st1 cnxcnx
ARCHITEKTURA KOMPUTERÓW definicja komputera PROCESOR PAMIĘĆ OPERACYJNA URZĄDZENIA ZEWNĘTRZNE.
Imperatywne modele obliczeń Copyright, 2001 © Jerzy R. Nawrocki Wprowadzenie do.
Podstawy informatyki Wirtotechnologia – Wskaźniki i referencje
Podstawy informatyki Powtórka Grupa: 1A Prowadzący: Grzegorz Smyk
Tablice.
Komunikacja z arkuszem. Iteracje. Funkcje.
Instrukcja skoku GO TO etykieta Np. GO TO 100 ….. 100WRITE (*,*) Przeskok do instrukcji 100 Uwaga! NIE WOLNO skakać do wnętrzna złożonych instrukcji warunkowych.
Semantyki programów współbieżnych " Determinizm programów sekwencyjnych, " Nie-determinizm programów współbieżnych, " prawdziwa równoległość vs.przeploty.
Dr Anna Kwiatkowska Instytut Informatyki
PASCAL (2) dr Anna Kwiatkowska.
Podprogramy.
Programowanie imperatywne i język C Copyright, 2006 © Jerzy R. Nawrocki Wstęp do.
Podstawy programowania
Architektura komputerów
Podstawy programowania II
Podstawy informatyki (4)
Automatyczne dereferencje w języku SBQL
Informatyka I Wykład 5 OPERATORY Priorytety i kolejność obliczeń
Funkcje w Pascalu Przypomnienie wiadomości o procedurach Prowadzący: Anna Kaleta Piotr Chojnacki.
Instrukcje sterujące część 2
Statystyka – zadania 4 Janusz Górczyński.
Jerzy F. Kotowski1 Informatyka I Wykład 14 DEKLARATORY.
C# Platforma .NET CZ.3 Kuba Ostrowski.
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
ZWIĄZKI MIĘDZY KLASAMI KLASY ABSTRAKCYJNE OGRANICZENIA INTERFEJSY SZABLONY safa Michał Telus.
Zajęcia I Organizacja zajęć Rejestracja i uruchamianie makr
Wykład 7 Synchronizacja procesów i wątków
Systemy rozproszone  Rozdzielenie obliczeń między wiele fizycznych procesorów.  Systemy luźno powiązane – każdy procesor ma lokalną pamięć; procesory.
Obliczalność czyli co da się policzyć i jak Model obliczeń maszyna licznikowa dr Kamila Barylska.
Model obiektowy bazy danych
Procesor, pamięć, przerwania, WE/WY, …
Procesy, wątki Program a proces Proces: Przestrzeń adresowa, kod, dane, stos (część pamięci do przechowania zmiennych lokalnych i niektórych adresów) Otwarte.
OOPSmalltalk - Licznik, metodologia1 Analiza i projektowanie obiektowe 3 fazy: –analiza problemu - modelowanie (m.in. podział na klasy) –projektowanie.
Typy liczbowe, zmienne, operatory Zajęcia 4. Zmienne Zmienna – to w programowaniu element programu, który może mieć przypisaną pewną wartość (wartość.
Pętle – instrukcje powtórzeń
Tryby adresowania i formaty rozkazów mikroprocesora
Wstęp do programowania Wykład 2 Dane, instrukcje, program.
Algorytmy. Co to jest algorytm? Przepis prowadzący do rozwiązania zadania.
Algorytmy, sposoby ich zapisu.1 Algorytm to uporządkowany opis postępowania przy rozwiązywaniu problemu z uwzględnieniem opisu danych oraz opisu kolejnych.
Zmienne typy danych w VBA. MS Excel – typy danych w języku programowania VBA.
Smalltalk architektura Model-View-Controller obiektowo zorientowany graficzny interfejs użytkownika Cezary BOŁDAK.
Wątki, programowanie współbieżne
Programowanie Obiektowe – Wykład 2
Jednorównaniowy model regresji liniowej
Wskaźniki Elżbieta Labocha.
Dane, zmienne, instrukcje
Język C++ Typy Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Format rozkazu Tryby adresowania.
Zapis prezentacji:

Przykład - Debugger Język pewnego procesora zawiera następujące instrukcje: MOV l, r l:=r ADD l, r l := l + r SUB l, r l := l - r JMP instr skok bezwarunkowy IFZERO r, instr skok jeśli r - 0 IFMINUS r, instr skok jeśli r < 0 "r" oznacza jedną z następujacych postaci wartości: stala rejestr wartosc zapisana w rejestrze [rejestr+stała] wartość w pamięci pod adresem (wartość w rejestrze + stała) adres wartość w pamięci pod podanym adresem "l" oznacza miejsce na wynik; pierwsza postać nie jest dopuszczalna, pozostałe określaja miejsce, gdzie ma się znależć wynik. ZADANIE: wykonać model, projekt i zapisac w Smalltalku system klas będący częścią systemu wspomagającego uruchamianie i testowanie programu na maszynie z danym językiem. Nasz system powinien uwzględniać pułapki (breakpoint) zwykłe i warunkowe. Musi być możliwe wykonanie programu począwszy od danej instrukcji aż do końca lub do momentu przerwania przez pułapkę. Musi być możliwość "cofania" programu od instrukcji na ktorej ostatnio się zatrzymaliśmy, do momentu spotkania pułapki lub instrukcji, od której w ogóle rozpoczęliśmy wykonanie programu.

Zmienne globalne KLASY Pamięć - zmienna bliżej nieznanej klasy Dostępne operacje : at: adres at: adres put: wartość gdzie adres - l. całkowita Rejestry - zmienna bliżej nieznanej klasy Dostepne operacje: at: rejestr at: adres put: wartość gdzie rejestr - obiekt klasy Rejestr. KLASY Rejestr nic o niej nie wiemy, ma tylko istnieć Musimy w jakis sposób reprezentować wartości "r" i "l", tak, aby instrukcja nie musiała martwić się o to, jakiej postaci ma argumenty. Propozycja: Argument - podklasa klasy Object atrybuty: ?? operacje: dajWartość zwraca wartość argumentu wstawWartość: w wstawia wartość pod właściwy adres pamięci lub do właściwego rejestru Widać, że operacje są istotnie zależne od rodzaju argumentu - dziedziczenie!

Argument (atrybuty: brak) - klasa abstrakcyjna Hierarchia klas: Argument (atrybuty: brak) - klasa abstrakcyjna ArgStała (atr: wartość - przechowuje liczbę całk.) ArgRejestr (atr: rej - przechowuje obiekt typu Rejestr) ArgRejestrStała (atr: rej, wartość) ArgAdres (atr: adr - przechowuje liczbę) Object subclass: #Argument instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' dajWartość " Zaimplementowana w podklasach" wstawWartość: w Argument subclass: #ArgStała instanceVariableNames: ' wartość' poolDictionaries:'' wartość: w " do inicjalizacji" wartość := w ^wartość self error: "Nie da się"

Argument subclass: #ArgRejestr instanceVariableNames: ' rej' classVariableNames: '' poolDictionaries:'' ... Inicjalizacja dajWartość ^Rejestry at: rej wstawWartość: w Rejestry at: rej put: w Argument subclass: #ArgRejestrStała instanceVariableNames: ' rej wartość' ^Pamięć at: ((Rejestry at: rej) + wartość) Pamięć at: ((Rejestry at: rej) + wartość) put: w Argument subclass: #ArgAdres instanceVariableNames: ' adr' ^Pamięć at: adr Pamięć at: adr put: w

Instrukcja podklasa klasy Object atrybuty: zależne od typu instrukcji metody: breakpoint ustawia pułapkę na instrukcji breakpointCond: war ustawia pułapkę warunkową war - obiekt klasy Warunek o której wiemy tylko tyle, że ma metodę oblicz zwracajacą true lub false clearBreakpoint usuwa pułapkę run rozpoczyna wykonanie od tej instrukcji unrun rozpoczyna cofanie od tej instrukcji Możemy założyć, że zmienne Pamięć i Rejestry mają zawsze jakąś wartość (czyli zawsze jest jakaś zawartość pamięci i rejestrów). Atrybutem każdej instrukcji powinnna być pułapka - możemy na razie przyjąć, że jest to obiekt klasy Breakpoint z metodą czyStop zwracającą true, jeśli należy się zatrzymać. Ponadto każda instrukcja powinna wiedzieć, jaka jest następna po niej. W przypadku skoków - co byłoby wykonane, gdyby nie było skoku. Problem: cofanie programu 1. Kazda instrukcja musi wiedzieć, co było wykonane przed nią (jeśli nic, tzn. jest to pierwsza wykonywana instrukcja, to nie można się cofnąć. 2. Są przecież pętle! Więc każda instrukcja musi mieć stos instrukcji, które przed nią były wykonane. 3. Instrukcje zmieniające stan pamięci lub rejestrów muszą mieć zapamiętaną zmienianą wartość. 4. Znowu ze względu na pętle to musi być stos wartości!

ADD SUB Hierachia klas: Instrukcja (atr: nast - następna instrukcja do wykonania; poprzednie - stos poprzednich instrukcji; bp - pułapka, obiekt klasy Breakpoint lub nil) Operacja (atr: l, r - obiekty klasy Argument wartości - stos zmienianych wartości) MOV ADD SUB Skok (atr: instr - gdzie skoczyć, obiekt klasy Instrukcja) SkokWar (atr: arg - obiekt klasy Argument) IfZero IfMinus Zakładamy, że mamy klasę Stos ze zwyczajowymi metodami. Object subclass: #Instrukcja instanceVariableNames: ' nast poprzednie bp ' classVariableNames: '' poolDictionaries:'' breakpoint bp := Breakpoint new breapointCond: war bp := BreakpointCond new: war clearBreakpoint bp := nil run bp isNil ifFalse: [bp czyStop ifTrue: [^self]]. self wykonaj run: instr poprzednie push: instr. self run unrun self cofnij. poprzednie isEmpty ifFalse: [ poprzednie pop unrun]

Instrukcja subclass: #Operacja instanceVariableNames: ' l r wartości ' ...... wykonaj wartości push: l dajWartość. self oblicz. nast isNil ifFalse: [nast wykonaj: self] cofnij l wstawWartość: (wartości pop) Operacja subclass: #MOV instanceVariableNames: '' ........ oblicz l wstawWartość: (r dajWartość) Instrukcja subclass: #Skok instanceVariableNames: ' instr ' instr wykonaj: self. Skok subclass: #IfZero instanceVariableNames: 'war' ..... (arg dajWartość = 0) ifTrue: [instr wykonaj: self] ifFalse: [ nast isNil ifFalse: [nast wykonaj: self]]