Ta strona w prosty sposób wyjaśnia, jak działa Twój program na SMS32V50 Simulator (8-bitowy procesor). Znajdziesz tu informacje o działaniu kodu, architekturze, rejestrach, stosie, CMP, JUMP oraz różnicach między przerwaniami a skokami.
1. Wprowadzenie
Twój program wykonuje następujące zadania:
Czyści pamięć i przygotowuje środowisko.
Pobiera dane od użytkownika (wybór systemu oraz cyfry).
Odejmuje dwie liczby z mechanizmem "pożyczki".
Wyświetla wynik odejmowania.
CLO ; Czyścimy pamięć
IN 00 ; Czekamy na wybór systemu
2. Architektura (8-bit)
SMS32V50 to symulator 8-bitowego procesora, czyli:
Dane są 8-bitowe – wartości od 0 do 255.
Wszystkie operacje (dodawanie, odejmowanie) działają na 8-bitowych liczbach.
Adresy, rejestry i flagi są 8-bitowe.
3. Rejestry
Rejestry to małe miejsca w procesorze do przechowywania danych:
Rejestry ogólne – przechowują dane i wyniki obliczeń.
Przykład:MOV AL, 10 – zapisuje wartość 10 do rejestru AL.
Rejestry specjalne:
Stack Pointer (SP) – wskaźnik stosu, gdzie zapisywane są adresy powrotu i tymczasowe dane.
Przykład:MOV [BC], AL – zapis wyboru systemu.
Instruction Pointer (IP) – wskazuje, którą instrukcję wykonać jako następną.
Przykład:JMP wprowadz_liczby – zmienia IP.
Flagi – np. flaga zera (Zero) i flaga znaku (Sign), ustawiane przez CMP.
4. Stos i procedury
Stos działa jak pudełko, do którego wkładasz dane, a potem wyjmujesz je w odwrotnej kolejności (LIFO):
Przy wywołaniu procedury adres powrotu (IP) jest zapisywany na stosie.
Po zakończeniu procedury adres ten jest pobierany, aby wrócić do głównego programu.
Stos służy też do przechowywania tymczasowych wyników (np. przy odejmowaniu).
PUSH BL ; Zapisujemy wynik na stosie
POP AL ; Pobieramy wynik ze stosu
5. CMP
CMP (compare) porównuje dwie wartości i ustawia flagi procesora, bez zmiany samych danych.
Zero Flag – ustawiona, gdy wartości są równe.
Sign Flag – wskazuje, czy wynik porównania jest ujemny.
W Twoim programie CMP jest używane do:
Sprawdzenia, czy użytkownik wybrał system dziesiętny (CMP AL, 31).
Wykrycia ujemnego wyniku odejmowania.
CMP AL, 31 ; Porównujemy AL z 31 (dla '1')
6. JUMP
JUMP zmienia kolejność wykonywania kodu przez ustawienie nowego adresu w IP:
JMP – skok bez warunków.
JZ i JS – skoki warunkowe, działające na podstawie flag ustawionych przez CMP.
JMP wprowadz_liczby ; Skok do pobierania danych
7. Przerwania vs. JUMP
Różnice między przerwaniami a zwykłymi skokami:
JUMP – normalny skok w kodzie, który zmienia IP zgodnie z logiką programu.
Przerwanie – nagłe zdarzenie, które zapisuje stan procesora (w tym IP) na stosie, wywołuje procedurę obsługi przerwania, a po niej przywraca stan i wraca do głównego programu.
INT 01 ; Wywołanie przerwania nr 1
// Procesor zapisuje IP i rejestry, wykonuje ISR, a potem wraca
8. Podsumowanie
Program działa na 8-bitowym procesorze SMS32V50.
Używa rejestrów ogólnych (do danych) oraz specjalnych (SP, IP, flagi).
Stos przechowuje tymczasowe dane i adresy powrotu przy procedurach.
CMP porównuje wartości i ustawia flagi, a JUMP zmienia kolejność wykonywania kodu.
Przerwania zapisują stan procesora i wykonują specjalny kod obsługi.
9. Jak działa mój program
Oto krok po kroku, co dzieje się podczas działania Twojego programu:
Krok 1: Program zaczyna od wyczyszczenia pamięci przy użyciu CLO.
Krok 2: Program czeka na wejście użytkownika z portu 00. Użytkownik powinien wpisać:
'1' – aby wybrać system dziesiętny,
Dowolny inny klawisz – aby wybrać system binarny.
Krok 3: Wybrana wartość (system liczbowy) jest zapisywana w pamięci (np. przez MOV [BC], AL).
Krok 4: Program przechodzi do etapu wprowadzania cyfr – najpierw pierwszej liczby, a potem drugiej. Użytkownik wpisuje cyfry, a program je zapisuje w pamięci.
Krok 5: Po zakończeniu wprowadzania (wciskając ENTER) program wykonuje odejmowanie cyfr – zaczynając od najmniej znaczących. Jeśli wynik odejmowania dla danej pary jest ujemny, stosowany jest mechanizm "pożyczki" (zmniejszenie wartości poprzedniej cyfry).
Krok 6: Wynik odejmowania jest konwertowany do kodu ASCII (dodawane jest 30) i zapisywany w pamięci, aby mógł być wyświetlony.
Krok 7: Jeśli użytkownik wprowadzi zbyt wiele cyfr, program wykrywa błąd i sygnalizuje go, np. wysyłając wartość błędu do portu 01 (czerwone światło).
Krok 8: Program kończy działanie po wykonaniu wszystkich operacji.
Podczas całego procesu program używa rejestrów, stosu i instrukcji sterujących (CMP, JUMP) do prawidłowego przetwarzania danych.
// Przykładowa sekwencja wejścia i przetwarzania:
IN 00 ; Odczyt wyboru systemu
CMP AL, 31 ; Sprawdzamy, czy wybrano '1'
JZ system_dziesietny ; Jeśli tak, wybór dziesiętny
...
// Wprowadzanie cyfr:
petla_wprowadzania:
IN 00 ; Pobieramy cyfrę
CMP AL, 0D ; Sprawdzamy ENTER
...
10. FAQ – Odpowiedzi na pytania
Co robi ten kod, główne działanie?
Czyści pamięć, pobiera dane (wybór systemu, cyfry) i wykonuje odejmowanie.
Na końcu wyświetla wynik operacji.
Fragment kodu:
CLO ; Czyścimy pamięć
IN 00 ; Pobieramy wybór systemu
Jaka jest architektura SMS32V50 (8-bit)?
Dane są 8-bitowe – od 0 do 255.
Rejestry, adresy i flagi są 8-bitowe.
Przykład: Każda liczba mieści się w jednym bajcie.
Do czego są rejestry ogólnego przeznaczenia?
Przechowują dane i wyniki obliczeń.
Fragment kodu:
MOV AL, 10 ; Przykład: zapisujemy 10 do AL
Do czego są specjalne rejestry (SP, IP)?
SP – wskaźnik stosu, przechowuje adresy powrotu i dane tymczasowe.
IP – wskazuje, którą instrukcję wykonać następną.
Fragment kodu:
JMP wprowadz_liczby ; Skok zmienia IP
Czy używany jest stos i jak działa?
Tak, stos działa jak pudełko (LIFO) – ostatni element, który włożysz, jest pierwszym, który wyjmiesz.
Przechowuje adresy powrotu oraz tymczasowe wyniki.
Fragment kodu:
PUSH BL ; Zapisujemy wynik na stosie
POP AL ; Pobieramy wynik ze stosu
Jak działają procedury i stos przy ich użyciu?
Przy wywołaniu procedury adres powrotu (IP) jest zapisywany na stosie.
Po zakończeniu procedury adres ten jest odzyskiwany, by wrócić do głównego programu.
Przykład:
// Wywołanie procedury:
CALL procedura_xyz ; Adres powrotu jest zapisywany na stosie
Jak działa CMP i gdzie jest używany?
CMP porównuje dwie wartości i ustawia flagi (Zero, Sign).
Wykrywa, czy wartości są równe lub czy wynik jest ujemny.
Przykład:
CMP AL, 31 ; Porównanie wartości w AL z 31
Jak działają instrukcje JUMP?
JUMP zmienia adres wykonywania programu (IP).
Skoki warunkowe (JZ, JS) działają na podstawie flag ustawionych przez CMP.
Przykład:
JMP wprowadz_liczby ; Skok do etykiety
Czym różni się przerwanie od jumpa?
Jump – zwykły skok, który zmienia IP według logiki programu.
Przerwanie – nagłe zdarzenie, które zapisuje stan procesora na stosie, wywołuje specjalną procedurę, a następnie przywraca stan i kontynuuje działanie.