Procesor i język maszynowy - wprowadzenie: Różnice pomiędzy wersjami
(Utworzono nową stronę "Informacje o module: * Poziom: Podstawowy * Profil: Dla techników i inżynierów == Struktura komputera == W sklepach z zabawkami można dostać skarbonki w kształ...") |
|||
(Nie pokazano 1 pośredniej wersji utworzonej przez tego samego użytkownika) | |||
Linia 56: | Linia 56: | ||
Budowę procesora najlepiej pokazać na przykładzie. W tym celu zaprojektujemy prosty, przykładowy procesor. Przyjmujemy, że procesor zawiera rejestry: | Budowę procesora najlepiej pokazać na przykładzie. W tym celu zaprojektujemy prosty, przykładowy procesor. Przyjmujemy, że procesor zawiera rejestry: | ||
* ''akumulator ''- wynik operacji | * ''akumulator ''- wynik operacji | ||
* ''licznik - ''adres kolejnej operacji | * ''licznik - ''adres kolejnej operacji | ||
Linia 61: | Linia 62: | ||
Dodatkowo mamy rejestry pomocnicze, które są używane przez procesor do przechowywania aktualnie wykonywanej instrukcji: | Dodatkowo mamy rejestry pomocnicze, które są używane przez procesor do przechowywania aktualnie wykonywanej instrukcji: | ||
* ''instrukcji - ''kod pobranego rozkazu | * ''instrukcji - ''kod pobranego rozkazu | ||
* ''parametru - ''parametr operacji | * ''parametru - ''parametr operacji | ||
Linia 136: | Linia 138: | ||
Program w postaci symbolicznej będzie wyglądał następująco: | Program w postaci symbolicznej będzie wyglądał następująco: | ||
0: USTAW LICZBY ; adres liczb do zsumowania | |||
2: WPISZ ADRES ; ustawienie komórki wskazującej sumowaną liczbę | |||
4: USTAW 0 ; zerowanie | |||
6: WPISZ WYNIK ; zapisanie wyniku | |||
8:A: POBIERZ ILOSC ; ilość liczb do zsumowania | |||
10: ZERO K ; nie ma już liczb do zsumowania | |||
12: DODAJ -1 ; zmniejsz ilość | |||
14: WPISZ ILOSC ; zapisz nową ilość | |||
16: APOBIERZ ADRES ; pobranie kolejnej liczby | |||
18: DODAJ WYNIK ; dodanie dotychczasowej sumy | |||
20: WPISZ WYNIK ; zapis wyniku | |||
22: POBIERZ ADRES ; pobranie adresu | |||
24: DODAJ 1 ; zwiększenie o 1 | |||
26: WPISZ ADRES ; zapisanie nowego adresu | |||
28: SKOCZ_DO A ; powtórzenie dla następnej liczby | |||
30:K: STOP | |||
W powyższym zapisie mamy pięć kolumn: | |||
* adres w pamięci (z dwukropkiem) | |||
* symboliczny zapis adresu (też z dwukropkiem) | * opcjonalni: symboliczny zapis adresu (też z dwukropkiem) | ||
* kod instrukcji | * kod instrukcji | ||
* parametr | * parametr |
Aktualna wersja na dzień 20:26, 7 lis 2022
Informacje o module:
- Poziom: Podstawowy
- Profil: Dla techników i inżynierów
Struktura komputera
W sklepach z zabawkami można dostać skarbonki w kształcie zwierzęcia, które po wrzuceniu monety w otwór na głowie zamyka usta, jakby coś połykało. W działaniu takiej skarbonki można wyróżnić kilka operacji: wrzucona moneta naciska na przedłużenie szczęki (1), szczęka zamyka się i moneta spada (2), szczęka otwiera się i skarbonka wraca do punktu początkowego (0). Zauważmy, że aby scharakteryzować działanie skarbonki, wystarczy opisać ją w pewnych wybranych momentach czasu. Opis taki nazywamy stanem urządzenia. W naszym przypadku możemy wyróżnić stany: podstawowy (0), wrzucona moneta (1), zamknięta szczęka (2). Samo działanie poza tymi wybranymi momentami nas nie interesuje - w takim opisie czas zmienia się skokowo (mówimy, że czas ma charakter dyskretny). Jest to oczywiście pewne uproszczenie, ale pozwala na dokonanie opisu w sposób bardzo ścisły.
Komputer jest urządzeniem posiadającym pamięć
Pamięcią nazwiemy urządzenie, którego stan w kolejnych momentach czasu możemy odczytać. Przykładem tak rozumianej pamięci może być zwykły notes. Możemy przeglądając go odczytać umieszczone tam zapiski. Zapiski te stanowią stan notesu. Tego typu pamięć ma jednak pewną wadę - zapis nie daje się łatwo zmieniać i nie może to być wykonane automatycznie. Pamięć komputera poza możliwością zmiany stanu musi charakteryzować się możliwością łatwego określenia zasad tych zmian tak, aby mogło to odbywać się automatycznie. Sposób automatycznej zmiany stanu można określić podając dla każdego stanu stan następny (po zmianie).
Pamięć prawdziwych komputerów składa się z bardzo prostych elementów elektronicznych. Mogą się one znajdować w jednym z dwóch stanów: 0 lub 1. Stan jest reprezentowany przez wysokość napięcia (wysokie napięcie = 1, niskie = 0). Elementów takich jest za to bardzo dużo. Wielkość pamięci mierzy się w bitach (jeden element dwustanowy = 1 bit). Osiem bitów nazywa się bajtem. 1024 bajty to kilobajt (kB), a 1024 kilobajty to 1 megabajt (MB). Obecnie komputery mają przeważnie 8, 16, 32, 64 lub 128 MB pamięci.
Procesor dokonuje zmian stanu pamięci
Oczywiście zmiany pamięci nie wykonują się same z siebie. Potrzebny jest element który w sposób automatyczny wykona je zgodnie z instrukcjami. Po to właśnie komputer wyposażony jest w procesor, dokonujący zmian pamięci (stanu) w kolejnych momentach czasu.
Procesor jest układem elektronicznym przetwarzającym sygnały odczytane z pamięci. W jednym momencie odczytuje stan pamięci i oblicza stan następny. W następnym momencie zmienia się stan pamięci na wypracowany przez procesor.
Kolejne chwile czasu (w których następuje zmiana stanu) wyznacza generator sygnałów elektrycznych zwany zegarem. Częstotliwość generowanego sygnału jest podstawowym parametrem określającym szybkość komputera (mówimy że procesor działa z szybkością 100MHz, 200MHz, itd..)
Teoretycznie rzecz biorąc następny stan pamięci zależy od stanu aktualnego całej pamięci. Jak wspomnieliśmy jednak, pamięć komputera jest bardzo duża. Dla uproszczenia konstrukcji procesory wykonuje się więc w ten sposób, że mogą one odczytywać i zmieniać jedynie mały fragment pamięci. Nie ma to większego wpływu na funkcjonalność komputera (zamiast zmienić stan wszystkich elementów równocześnie, zmienia się je po kolei). Sytuację tą można porównać do poruszania się w układzie współrzędnych tylko wzdłuż osi układu. W jednym kroku zmienia się tylko jedna współrzędna, ale nie ogranicza to zasięgu naszego ruchu (dla takich modeli często mówi się o przestrzeni stanów).
Procesor - serce komputera
Cykl działania procesora można więc określić w sposób następujący:
- . Odczyt fragmentu pamięci (komórki, słowa).
- . Wykonanie operacji (+wyznaczenie następnego stanu tego fragmentu pamięci).
- . Zapis nowych wartości do pamięci.
- . Wyznaczenie nowego fragmentu pamięci do pobrania.
Poszczególne operacje są wykonywane w takt zegara komputera. Każdy z powyższych punktów może być wykonywany w kilku taktach, ale teoretycznie możliwe jest wykonanie jednego cyklu tylko w dwóch taktach (punkty 2,3 i 4 mogą być wykonane w jednym kroku). Zależy to od budowy procesora.
Jednym z najistotniejszych pomysłów na jakie wpadli konstruktorzy komputera jest zapis instrukcji dla procesora w pamięci komputera. Aby procesor mógł sam odczytywać rozkazy (instrukcje) z pamięci i efektywnie działać zgodnie z przedstawionym powyżej schematem trzeba było przyjąć kilka dodatkowych założeń:
- . Wszystkie instrukcje otrzymują swoje kody (załóżmy, że wszystkie informacje zapisane w pamięci są liczbami). Wraz z niektórymi z tych kodów są pamiętane parametry instrukcji (zob. przykład poniżej).
- . Wszystkie komórki pamięci zostają ponumerowane (0,1,2,...). Mówimy, że komórki są adresowane.
- . Wydziela się fragmenty pamięci w których będą pamiętane:*
- wynik ostatniej instrukcji (rozkazu)
- kod wykonywanej instrukcji
- numer komórki (adres) zawierającej kod kolejnego rozkazu do wykonania
Te fragmenty pamięci nazywamy rejestrami. Rejestry zazwyczaj stanowią część procesora i nie są adresowane tak jak reszta pamięci. W konkretnych realizacjach procesorów ilość rejestrów jest większa (zazwyczaj jednak nie więcej niż 10). Ta wewnętrzna złożoność procesora jest jedną z przyczyn, dla których pewne operacje wymagają więcej niż dwóch taktów zegara.
Projektujemy procesor
Budowę procesora najlepiej pokazać na przykładzie. W tym celu zaprojektujemy prosty, przykładowy procesor. Przyjmujemy, że procesor zawiera rejestry:
- akumulator - wynik operacji
- licznik - adres kolejnej operacji
Dodatkowo mamy rejestry pomocnicze, które są używane przez procesor do przechowywania aktualnie wykonywanej instrukcji:
- instrukcji - kod pobranego rozkazu
- parametru - parametr operacji
Każda instrukcja zajmuje w pamięci dwa bajty (kod + parametr). Po pobraniu kodu rozkazu lub parametru licznik automatycznie zwiększa się o jeden (czyli wskazuje na następny rozkaz).
Procesor działa powtarzając trzy operacje (każdy rozkaz jest wykonywany w czasie trzech taktów zegara):
1. pobranie kodu instrukcji (z miejsca wskazanego przez licznik, zwiększa się o 1)
2. pobranie parametru (z miejsca wskazanego przez licznik, zwiększa się o 1)
3. wykonanie operacji
tak długo, aż napotka rozkaz STOP.
Nasz procesor wykonuje następujące instrukcje:
nazwa | kod | parametr | opis |
POBIERZ | 1 | adres danej | przepisuje zawartość wskazanej komórki pamięci do akumulatora |
APOBIERZ | 2 | adres pamięci | przepisz do akumulatora zawartość komórki o adresie wskazanym przez adres pamięci |
WPISZ | 3 | adres danej | zapisuje zawartość akumulatora do wskazanej komórki pamięci |
DODAJ | 4 | adres danej | dodaje zawartość wskazanej komórki do zawartości akumulatora |
USTAW | 5 | liczba | ustaw zawartość akumulatora na liczba |
SKOCZ_DO | 6 | adres | wpisz adres do licznika |
ZERO | 7 | adres | gdy akumulator zawiera zero, wpisz adres do licznika |
STOP | 0 | 0 | zatrzymaj |
Spróbujmy napisać prosty program. Przyjmiemy, że adresy rozkazów zaczynają się od 0, a adresy danych od 100. Pierwsza komórka pamięci (adres 100) zawiera ilość liczb do zsumowania, druga będzie zawierać wynik, a trzecia będzie używana przez nas do adresowania. Następne zawierają liczby do zsumowania.
Program w postaci symbolicznej będzie wyglądał następująco:
0: USTAW LICZBY ; adres liczb do zsumowania
2: WPISZ ADRES ; ustawienie komórki wskazującej sumowaną liczbę
4: USTAW 0 ; zerowanie
6: WPISZ WYNIK ; zapisanie wyniku
8:A: POBIERZ ILOSC ; ilość liczb do zsumowania
10: ZERO K ; nie ma już liczb do zsumowania
12: DODAJ -1 ; zmniejsz ilość
14: WPISZ ILOSC ; zapisz nową ilość
16: APOBIERZ ADRES ; pobranie kolejnej liczby
18: DODAJ WYNIK ; dodanie dotychczasowej sumy
20: WPISZ WYNIK ; zapis wyniku
22: POBIERZ ADRES ; pobranie adresu
24: DODAJ 1 ; zwiększenie o 1
26: WPISZ ADRES ; zapisanie nowego adresu
28: SKOCZ_DO A ; powtórzenie dla następnej liczby
30:K: STOP
W powyższym zapisie mamy pięć kolumn:
- adres w pamięci (z dwukropkiem)
- opcjonalni: symboliczny zapis adresu (też z dwukropkiem)
- kod instrukcji
- parametr
- komentarz (po średniku)
Zamiast pisać kody instrukcji i adresy użyliśmy symboli. Podobnie zostały przedstawione adresy instrukcji (A, K).
Wartość symboli:
LICZBY = 103
ADRES = 102
WYNIK = 101
ILOSC = 100
A = 8
K = 30
Początek pamięci wygląda następująco (na początku wiersza podano adres pierwszej z komórek):
0: 5; 103; 3; 102; 5; 0; 3;101;1; 100;
10: 7; 30;4; -1; 3;100;2;102;4;101;
20: 3;101;22:1;102;4;1;3;102;6;8;0
Dla ćwiczenia spróbuj zamienić kody symbolami i porównaj z podanym wcześniej zapisem.
Spróbuj określić zawartość komórek o adresie powyżej 100 i prześledzić jak będą się one zmieniały wraz z wykonywaniem programu.