Analiza programu w asemblerze (odejmowanie w systemie dziesiętnym / binarnym)

Sekcja 1: Inicjalizacja i wybór systemu liczbowego

Ta sekcja rozpoczyna program i pozwala użytkownikowi wybrać system liczbowy (dziesiętny lub binarny). Jest to kluczowy element programu, który determinuje jak będą interpretowane i przetwarzane liczby.

CLO
Reset procesora
Szczegółowe wyjaśnienie:
  • CLO (Clear Overflow) - czyści rejestry i flagi procesora
  • Jest to standardowa praktyka na początku programu
  • Zapobiega błędom wynikającym z pozostałości w rejestrach
  • Można to porównać do czyszczenia tablicy przed rozpoczęciem nowych obliczeń
W kontekście programu: To zapewnia czysty start i eliminuje potencjalne błędy.
IN 00
Wejście z klawiatury
Szczegółowe wyjaśnienie:
  • IN oznacza operację wejścia (Input)
  • 00 to numer portu (zwykle klawiatura)
  • Wartość jest automatycznie zapisywana w rejestrze AL
  • Program czeka na input użytkownika
Oczekiwane wartości:
  • '1' (31h) - wybór systemu dziesiętnego
  • Dowolny inny klawisz - system binarny
CMP AL, 31
Porównanie z '1'
Szczegółowe wyjaśnienie:
  • CMP to instrukcja porównania (Compare)
  • AL to rejestr akumulatora (młodszy bajt)
  • 31h to kod ASCII cyfry '1' (49 dziesiętnie)
  • Operacja wykonuje odejmowanie AL - 31h, ale nie zapisuje wyniku
  • Wynik wpływa tylko na flagi procesora
Flagi po operacji:
  • ZF=1 jeśli AL == 31h (wybrano system dziesiętny)
  • SF=1 jeśli AL < 31h (wartość mniejsza)
  • CF=1 jeśli potrzebna pożyczka przy odejmowaniu
JZ system_dziesietny
Skok do systemu dziesiętnego
Szczegółowe wyjaśnienie:
  • JZ to skok warunkowy (Jump if Zero)
  • Sprawdza flagę ZF (Zero Flag) ustawioną przez poprzednie CMP
  • Skok nastąpi tylko gdy ZF=1 (poprzednie porównanie dało zero)
  • system_dziesietny to etykieta - adres w pamięci programu
Działanie w programie:
  • Jeśli użytkownik wcisnął '1', program przejdzie do konfiguracji systemu dziesiętnego
  • Jeśli wciśnięto inny klawisz, program przejdzie do następnej instrukcji
  • To rozgałęzienie decyduje o trybie pracy całego programu
MOV AL, 2
System binarny
Szczegółowe wyjaśnienie:
  • MOV to instrukcja przeniesienia (Move)
  • AL to rejestr akumulatora (8 bitów)
  • 2 to wartość liczbowa reprezentująca system binarny
  • Operacja nadpisuje poprzednią wartość w AL
W kontekście programu:
  • Ustawiamy tryb binarny (2 oznacza system dwójkowy)
  • Ta wartość będzie później używana przy odejmowaniu
  • W systemie binarnym mamy tylko cyfry 0 i 1
  • Wartość 2 pomoże później przy obliczaniu pożyczki
MOV [BC], AL
Zapis systemu
Szczegółowe wyjaśnienie:
  • MOV to instrukcja przeniesienia do pamięci
  • [BC] oznacza adresowanie pośrednie - zawartość rejestru BC jako adres
  • AL to źródło danych (wartość 2 lub 10)
Operacje na pamięci:
  • BC wskazuje na specjalną lokację w pamięci
  • Ta lokacja przechowuje informację o wybranym systemie
  • Wartość będzie później używana przy odejmowaniu
  • Jest to kluczowa informacja dla całego programu
JMP wprowadz_liczby
Skok do wprowadzania liczb
Opis: Skok bezwarunkowy do etykiety wprowadz_liczby. Znaczenie: Przejście do kolejnej fazy – wprowadzania liczb – omijając system_dziesietny.

Sekcja 2: Konfiguracja systemu dziesiętnego

Ta sekcja jest wykonywana tylko gdy użytkownik wybrał system dziesiętny (nacisnął '1'). Przygotowuje program do pracy z liczbami dziesiętnymi poprzez ustawienie odpowiednich wartości w rejestrach i pamięci.

system_dziesietny:
Etykieta systemu dziesiętnego
Szczegółowe wyjaśnienie:
  • Jest to etykieta w kodzie asemblera
  • Służy jako punkt docelowy dla skoku JZ
  • Oznacza początek kodu dla systemu dziesiętnego
  • W SMS32v50 etykiety kończą się dwukropkiem
Rola w programie:
  • Rozpoczyna sekcję konfiguracji systemu dziesiętnego
  • Program trafia tu tylko gdy użytkownik wybrał '1'
  • To punkt rozgałęzienia w logice programu
MOV AL, 10
System dziesiętny
Szczegółowe wyjaśnienie:
  • MOV - instrukcja przeniesienia (Move)
  • AL - 8-bitowy rejestr akumulatora
  • 10 - wartość dziesiętna (podstawa systemu)
  • W SMS32v50 liczby bez 'h' są dziesiętne
Działanie w programie:
  • Ustawia system dziesiętny (cyfry 0-9)
  • Wartość 10 będzie używana przy pożyczkach
  • Jest to kluczowa wartość dla obliczeń
  • Determinuje sposób interpretacji wprowadzanych cyfr
MOV [BC], AL
Zapis systemu
Szczegółowe wyjaśnienie:
  • MOV - instrukcja przeniesienia do pamięci
  • [BC] - adresowanie pośrednie przez rejestr BC
  • AL - źródło danych (wartość 10)
  • W SMS32v50 nawiasy [] oznaczają dostęp do pamięci
Operacje na pamięci:
  • Zapisuje wartość 10 pod adres wskazywany przez BC
  • Ta lokacja pamięci służy jako flaga systemu
  • Program będzie później sprawdzał tę wartość
  • Jest to istotne dla mechanizmu pożyczki
JMP wprowadz_liczby
Skok do wprowadzania liczb
Opis: Skok bezwarunkowy do etykiety wprowadz_liczby. Znaczenie: Przejście do fazy wprowadzania liczb.

Sekcja 3: Wprowadzanie liczb

wprowadz_liczby:
Etykieta wprowadzania liczb
Opis: Etykieta wprowadz_liczby. Znaczenie: Miejsce, w którym program pozwala wprowadzać kolejne cyfry liczb.
MOV CL, C1
Początek obszaru danych
Szczegółowe wyjaśnienie:
  • CL to rejestr licznika (Counter Low)
  • C1 to stała - adres początku obszaru danych
  • Jest to przygotowanie do wprowadzania liczby
  • CL będzie służył jako wskaźnik w pamięci
Znaczenie w programie:
  • Rozpoczynamy wprowadzanie pierwszej liczby
  • C1 to początek obszaru na pierwszą liczbę
  • CL będzie się zwiększał z każdą cyfrą
  • To jak ustawienie kursora na początku linii
MOV DL, CB
Adres graniczny
Szczegółowe wyjaśnienie:
  • MOV - instrukcja przeniesienia (Move)
  • DL - 8-bitowy rejestr danych (Data Low)
  • CB - stała reprezentująca adres graniczny
  • W SMS32v50 stałe są definiowane przed programem
Rola w programie:
  • Ustawia limit długości wprowadzanej liczby
  • Chroni przed przepełnieniem bufora
  • Wartość CB minus C1 daje maksymalną długość liczby
  • Typowo pozwala na 10 cyfr (dla liczb dziesiętnych)
petla_wprowadzania:
Początek pętli
Szczegółowe wyjaśnienie:
  • Etykieta oznaczająca początek pętli
  • W SMS32v50 etykiety kończymy dwukropkiem
  • Jest to punkt powrotu dla instrukcji skoku
  • Realizuje mechanizm pętli w asemblerze
Funkcja w programie:
  • Rozpoczyna cykl pobierania kolejnych cyfr
  • Program będzie tu wracał po każdej cyfrze
  • Działa jak pętla while w językach wysokiego poziomu
  • Kontynuuje aż do naciśnięcia ENTER lub przekroczenia limitu
IN 00
Wejście z klawiatury
Opis: Wczytanie kolejnej cyfry (lub klawisza) z klawiatury do AL. Znaczenie: Każde naciśnięcie klawisza jest przechwytywane w AL.
CMP AL, 0D
Porównanie z ENTER
Szczegółowe wyjaśnienie:
  • CMP - instrukcja porównania (Compare)
  • AL - rejestr zawierający ostatnio wczytany znak
  • 0Dh - kod ASCII klawisza ENTER (13 dziesiętnie)
  • Operacja ustawia flagi procesora
Znaczenie flag:
  • ZF=1 gdy AL == 0Dh (naciśnięto ENTER)
  • SF=1 gdy AL < 0Dh (kod mniejszy niż ENTER)
  • CF=1 gdy potrzebna pożyczka przy odejmowaniu
W kontekście programu:
  • Sprawdza czy użytkownik zakończył wprowadzanie
  • ENTER sygnalizuje koniec aktualnej liczby
  • Determinuje czy kontynuować pętlę czy wyjść
JZ krok
Skok do kroku
Szczegółowe wyjaśnienie:
  • JZ - Jump if Zero (skok gdy flaga zero jest ustawiona)
  • Sprawdza wynik poprzedniego porównania (CMP)
  • Reaguje na naciśnięcie klawisza ENTER
  • W SMS32v50 skoki warunkowe są podstawą kontroli przepływu
Działanie w programie:
  • Przerywa wprowadzanie aktualnej liczby
  • Pozwala przejść do następnego etapu
  • Kluczowy element interfejsu użytkownika
  • Umożliwia kontrolowane zakończenie wprowadzania
CMP CL, DL
Sprawdzenie limitu
Opis: Sprawdzenie, czy osiągnęliśmy już maksymalną liczbę cyfr (CL == DL). Znaczenie: Jeśli wskaźnik CL zrówna się z DL, przekroczono limit znaków.
JZ blad_przekroczenia
Skok do błędu
Opis: Skok do etykiety blad_przekroczenia, jeśli osiągnięto limit. Znaczenie: Sygnalizacja błędu w przypadku wprowadzania zbyt długiej liczby.
MOV [CL], AL
Zapis cyfry
Opis: Zapisanie wprowadzonej cyfry z AL do pamięci pod adresem CL. Znaczenie: Każdy kolejny znak/cyfra trafia w kolejną komórkę pamięci, tworząc ciąg znaków reprezentujących liczbę.
INC CL
Zwiększenie wskaźnika
Szczegółowe wyjaśnienie:
  • INC - Increment (zwiększenie o 1)
  • CL - rejestr licznika pozycji w pamięci
  • Operacja modyfikuje flagi procesora
  • Podstawowa operacja w pętlach
Rola w programie:
  • Przesuwanie wskaźnika na następną pozycję
  • Przygotowanie do zapisania kolejnej cyfry
  • Część mechanizmu iteracji po pamięci
  • Kluczowe dla sekwencyjnego zapisu danych
JMP petla_wprowadzania
Powrót do pętli
Opis: Skok z powrotem do początku pętli wprowadzania cyfr. Znaczenie: Kontynuuj wczytywanie znaków, dopóki nie naciśniemy ENTER lub nie przekroczymy limitu.

Sekcja 4: Przejście do obliczeń

krok:
Etykieta kroku
Opis: Etykieta krok. Znaczenie: Miejsce, w które skaczemy po wciśnięciu ENTER (zakończeniu wprowadzania liczby).
CMP CL, CF
Porównanie z CF
Opis: Porównanie rejestru CL z adresem/stałą CF. Znaczenie: Wygląda na sprawdzenie, czy wpisaliśmy już drugą liczbę, czy dopiero pierwszą. (W tym przykładzie CF może być adresem, który wskazuje początek drugiej liczby).
JNS oblicz_wynik
Skok do obliczeń
Opis: Skok, jeśli wynik jest >= 0 (np. JNS - Jump if Not Sign). Znaczenie: Jeśli rejestr CL jest poza pewnym zakresem (np. >= CF), oznacza to, że druga liczba już jest wpisana, więc można przejść do obliczeń (oblicz_wynik).
MOV CL, D1
Początek drugiej liczby
Szczegółowe wyjaśnienie:
  • MOV - instrukcja przeniesienia danych
  • CL - rejestr licznika (Counter Low, 8 bitów)
  • D1 - stała określająca adres w pamięci
  • W SMS32v50 adresy są często oznaczane literami
Rola w programie:
  • Przygotowanie do wprowadzenia drugiej liczby
  • D1 wskazuje początek obszaru dla drugiej liczby
  • CL będzie służył jako wskaźnik pozycji
  • Analogiczne do ustawienia kursora w nowej linii
MOV DL, DB
Adres graniczny
Opis: Ustawienie DL na adres DB, czyli maksymalna komórka dla drugiej liczby. Znaczenie: Analogicznie jak poprzednio, by ograniczyć długość drugiej liczby.
JMP petla_wprowadzania
Powrót do pętli
Opis: Skocz z powrotem do pętli wprowadzania, tym razem celem wczytania drugiej liczby. Znaczenie: Użytkownik wprowadza drugą liczbę.

Sekcja 5: Obliczenia (odejmowanie)

oblicz_wynik:
Etykieta obliczeń
Opis: Etykieta oblicz_wynik. Znaczenie: Rozpoczynamy proces odejmowania jednej liczby od drugiej.
MOV DL, [BC]
Wczytanie systemu
Opis: Wczytanie wartości systemu liczbowego (2 lub 10) z pamięci o adresie BC do rejestru DL. Znaczenie: DL będzie teraz przechowywać aktualny system (binarny lub dziesiętny). Wykorzystywane przy korekcie odejmowania (pożyczka).
DEC CL
Cofnięcie wskaźnika
Opis: Zmniejszenie CL o 1. Znaczenie: Cofnięcie wskaźnika do ostatniej zapisanej cyfry drugiej liczby (ponieważ po zakończeniu wpisywania CL jest ustawione "za" ostatnią cyfrą).
petla_obliczen:
Początek pętli obliczeń
Opis: Etykieta petla_obliczen. Znaczenie: Punkt startowy pętli odejmowania każdej pary cyfr.
CMP CL, CF
Porównanie z CF
Opis: Sprawdzanie, czy dotarliśmy już do początku pierwszej liczby (lub czy przetworzyliśmy wszystkie cyfry). Znaczenie: Jeżeli CL == CF, to kończymy (obliczenia zakończone).
JZ koniec_programu
Skok do końca
Opis: Skok do koniec_programu w przypadku spełnienia warunku. Znaczenie: Jeśli przetworzono wszystkie pary cyfr, kończymy program.
MOV AL, [CL]
Wczytanie cyfry
Opis: Wczytanie aktualnej cyfry (drugiej liczby) z pamięci do AL. Znaczenie: AL = cyfra z drugiej liczby, od prawej do lewej (dlatego cofaliśmy CL).
CMP AL, 20
Porównanie ze spacją
Opis: Sprawdzenie, czy odczytana wartość to spacja (ASCII 20h). Znaczenie: Możliwe, że spacja sygnalizuje pusty obszar pamięci (koniec liczby). Jeśli tak, to też kończymy.
JZ koniec_programu
Skok do końca
Opis: Jeśli AL == 20h, skaczemy do koniec_programu. Znaczenie: Koniec obliczeń w przypadku braku dalszych cyfr.
SUB CL, 10
Przejście do pierwszej liczby
Opis: Odjęcie 10 od CL. Możliwa interpretacja: Przejście do odpowiadającej pozycji cyfry w pierwszej liczbie (np. jeśli druga liczba jest przechowywana 10 komórek dalej w pamięci).
MOV BL, [CL]
Wczytanie cyfry
Opis: Wczytanie cyfry z pierwszej liczby do BL. Znaczenie: BL = cyfra pierwszej liczby, odpowiadająca aktualnej pozycji.
ADD CL, 20
Przejście do wyniku
Opis: Dodanie 20 do CL. Możliwa interpretacja: Przejście do miejsca (w pamięci) przeznaczonego na wynik. Być może w tej implementacji wynik jest 20 komórek dalej.
SUB BL, AL
Odejmowanie cyfr
Szczegółowe wyjaśnienie:
  • SUB - instrukcja odejmowania (Subtract)
  • BL - rejestr źródłowy (pierwsza liczba)
  • AL - rejestr do odjęcia (druga liczba)
  • Wynik zapisywany jest w BL
Działanie w systemie:
  • Wykonuje faktyczne odejmowanie cyfr
  • Ustawia flagi procesora (ZF, SF, CF)
  • CF=1 jeśli potrzebna pożyczka
  • Kluczowa operacja dla całego programu
PUSH BL
Odkładanie na stos
Szczegółowe wyjaśnienie:
  • PUSH - odkłada wartość na stos
  • BL - rejestr, którego wartość zapisujemy
  • Zmniejsza wskaźnik stosu (SP)
  • Wartość jest zachowana w pamięci stosu
Cel w programie:
  • Tymczasowe przechowanie wyniku odejmowania
  • Zabezpieczenie wartości przed nadpisaniem
  • Przygotowanie do przeniesienia do AL
  • Typowy wzorzec w operacjach na rejestrach
POP AL
Pobieranie ze stosu
Szczegółowe wyjaśnienie:
  • POP - instrukcja pobierania ze stosu
  • AL - rejestr docelowy (8 bitów)
  • Zwiększa wskaźnik stosu (SP)
  • W SMS32v50 współpracuje z PUSH
Działanie w programie:
  • Odzyskuje wartość zapisaną przez PUSH
  • Przenosi wynik odejmowania do AL
  • Przygotowuje wartość do dalszej obróbki
  • Część standardowego wzorca PUSH/POP
MOV DL, [BC]
Wczytanie systemu
Szczegółowe wyjaśnienie:
  • MOV - instrukcja przeniesienia (Move)
  • DL - rejestr danych (Data Low)
  • [BC] - adresowanie pośrednie pamięci
  • Odczyt wartości systemu liczbowego
Rola w obliczeniach:
  • Pobiera informację o wybranym systemie (2 lub 10)
  • Przygotowuje wartość do operacji pożyczki
  • Kluczowe dla prawidłowego odejmowania
  • Determinuje sposób obsługi przeniesienia
ADD CL, 20
Przejście do wyniku
Szczegółowe wyjaśnienie:
  • ADD - instrukcja dodawania
  • CL - rejestr licznika
  • 20 - stała wartość przesunięcia
  • Modyfikuje wskaźnik pozycji w pamięci
Znaczenie w programie:
  • Przesunięcie do obszaru wyniku
  • 20 komórek to ustalony offset
  • Zapewnia separację danych w pamięci
  • Część mechanizmu zarządzania pamięcią

Sekcja 6: Obsługa pożyczki

pozyczka:
Etykieta pożyczki
Opis: Etykieta pozyczka. Znaczenie: Miejsce, w którym obsługujemy sytuację, gdy cyfra z pierwszej liczby jest mniejsza niż z drugiej i musimy pożyczyć z wyższego rzędu.
ADD AL, DL
Dodanie systemu
Opis: Dodanie wartości systemu (2 lub 10) do AL. Znaczenie: W systemie dziesiętnym dodajemy 10, a w binarnym 2, aby skorygować wynik przy odejmowaniu z pożyczką.
DEC CL
Cofnięcie wskaźnika
Opis: Cofnięcie wskaźnika do poprzedniej komórki (wyższy rząd). Znaczenie: Bierzemy cyfrę wyższego rzędu, aby ją zmniejszyć o 1 (pożyczka).
MOV BL, [CL]
Wczytanie cyfry
Opis: Wczytanie aktualnej (wyższej) cyfry do rejestru BL. Znaczenie: BL = cyfra wyższego rzędu.
DEC BL
Zmniejszenie cyfry
Opis: Zmniejszenie cyfry wyższego rzędu o 1. Znaczenie: "Pożyczamy" 1 z wyższego rzędu (czyli w systemie 10 -> minus 1, w systemie 2 -> minus 1).
MOV [CL], BL
Zapis cyfry
Opis: Zapisanie skorygowanej cyfry z powrotem do pamięci. Znaczenie: Teraz wyższy rząd ma o 1 mniej.
ADD CL, 10
Przejście do następnej sekcji
Szczegółowe wyjaśnienie:
  • ADD - instrukcja dodawania
  • CL - 8-bitowy rejestr licznika
  • 10 - wartość (hex) dodawana do rejestru CL
  • Instrukcja modyfikuje flagi procesora (ZF, SF, CF, PF)
Rola w programie:
  • Zwiększa wskaźnik pamięci o 16 (dziesiętnie)
  • Umożliwia przesunięcie do następnej sekcji danych
  • Stosowane przy przetwarzaniu kolejnych cyfr
POP AL
Pobieranie ze stosu
Szczegółowe wyjaśnienie:
  • POP - instrukcja pobierania ze stosu
  • AL - rejestr docelowy (8 bitów)
  • Zwiększa wskaźnik stosu (SP)
  • W SMS32v50 współpracuje z PUSH
Działanie w programie:
  • Odzyskuje wartość zapisaną przez PUSH
  • Przenosi wynik odejmowania do AL
  • Przygotowuje wartość do dalszej obróbki
  • Część standardowego wzorca PUSH/POP
MOV DL, [BC]
Wczytanie systemu
Szczegółowe wyjaśnienie:
  • MOV - instrukcja przeniesienia (Move)
  • DL - rejestr danych (Data Low)
  • [BC] - adresowanie pośrednie pamięci
  • Odczyt wartości systemu liczbowego
Rola w obliczeniach:
  • Pobiera informację o wybranym systemie (2 lub 10)
  • Przygotowuje wartość do operacji pożyczki
  • Kluczowe dla prawidłowego odejmowania
  • Determinuje sposób obsługi przeniesienia
ADD CL, 20
Przejście do wyniku
Szczegółowe wyjaśnienie:
  • ADD - instrukcja dodawania
  • CL - rejestr licznika
  • 20 - stała wartość przesunięcia
  • Modyfikuje wskaźnik pozycji w pamięci
Znaczenie w programie:
  • Przesunięcie do obszaru wyniku
  • 20 komórek to ustalony offset
  • Zapewnia separację danych w pamięci
  • Część mechanizmu zarządzania pamięcią

Sekcja 7: Wyświetlenie wyniku

wypisz_wynik:
Etykieta wyniku
Opis: Etykieta wypisz_wynik. Znaczenie: Miejsce odpowiedzialne za zapisanie (wyświetlenie) cyfry wyniku do pamięci.
ADD AL, 30
Konwersja do ASCII
Opis: Dodanie 30h (48 dziesiętnie) w celu konwersji wartości (0-9) do kodu ASCII ('0' - '9'). Znaczenie: Dzięki temu, jeśli AL = 5, to AL po dodaniu 30h będzie 0x35 (ASCII '5').
MOV [CL], AL
Zapis wyniku
Opis: Zapisanie wyniku (już jako kod ASCII) do pamięci pod adresem CL. Znaczenie: Teraz w pamięci mamy znak (np. '5') gotowy do wyświetlenia.
SUB CL, 11
Przejście do poprzedniej pary
Opis: Przesunięcie wskaźnika CL o 11 wstecz. Znaczenie: Przygotowanie do pobrania poprzedniej pary cyfr (lub poprzedniej pozycji wyniku). Możliwe, że 1 do cofnięcia na drugą liczbę i 10 do przesunięcia do odpowiedniej linii/pola.
JMP petla_obliczen
Powrót do pętli
Opis: Skok do początku pętli obliczeń (odejmowania) dla następnej pary cyfr. Znaczenie: Kontynuuj dopóki nie przetworzymy wszystkich cyfr.

Sekcja 8: Sygnalizacja błędu (przekroczenie limitu cyfr)

blad_przekroczenia:
Etykieta błędu
Opis: Etykieta blad_przekroczenia. Znaczenie: Miejsce, do którego skaczemy, jeśli przekroczono dozwoloną liczbę cyfr.
MOV AL, 90
Kod błędu
Opis: Załadowanie do AL wartości 90 (umowne czerwone światło lub kod błędu). Znaczenie: Sposób sygnalizacji błędu: "90" może uruchomić np. diodę LED czy inny sygnał ostrzegawczy.
OUT 01
Wyjście na port 01
Opis: Wyświetlenie (wypisanie) AL na porcie wyjściowym 01. Znaczenie: Aktywacja błędu lub sygnału związanego z AL = 90.
JMP koniec_programu
Skok do końca
Opis: Skok do koniec_programu. Znaczenie: Po sygnalizacji błędu nie kontynuujemy dalej; program się kończy.
blad_przekroczenia:
Etykieta błędu
Szczegółowe wyjaśnienie:
  • Etykieta obsługi błędu przekroczenia
  • Punkt wejścia dla sytuacji awaryjnej
  • Program trafia tu gdy liczba jest za długa
  • Zabezpiecza przed przepełnieniem bufora
Znaczenie w systemie:
  • Część mechanizmu zabezpieczeń programu
  • Chroni przed wprowadzeniem zbyt długich liczb
  • Zapobiega nadpisaniu innych danych w pamięci
  • Standardowy sposób obsługi błędów w SMS32v50
MOV AL, 90
Kod błędu
Szczegółowe wyjaśnienie:
  • MOV - instrukcja przeniesienia (Move)
  • AL - rejestr akumulatora (8 bitów)
  • 90 - kod błędu (umowna wartość)
  • W SMS32v50 często używane do sygnalizacji
Rola komunikacji:
  • Przygotowanie sygnału błędu
  • 90 może włączać czerwoną diodę LED
  • Wartość wybrana jako wyraźny sygnał błędu
  • Standard w systemie SMS32v50

Sekcja 9: Zakończenie programu

koniec_programu:
Etykieta końca
Opis: Etykieta koniec_programu. Znaczenie: Ostatnia część programu, gdzie następuje faktyczne zakończenie.
MOV CL, E0
Adres E0
Opis: Załadowanie do CL adresu E0 (ostatnia komórka pamięci). Znaczenie: Być może w tej komórce pamięci przechowywana jest flaga lub dana decydująca o dodatkowym działaniu.
MOV AL, [CL]
Wczytanie wartości
Opis: Załadowanie do AL wartości z pamięci o adresie CL (E0). Znaczenie: Czytamy tę "specjalną" wartość, by sprawdzić dodatkowy warunek.
CMP AL, 1
Porównanie z 1
Opis: Porównanie AL z 1. Znaczenie: Jeśli w E0 jest 1, wykonamy dodatkową akcję (być może jakaś bonusowa funkcja).
JZ dodatkowa_akcja
Skok do dodatkowej akcji
Opis: Skok, jeśli AL == 1, do etykiety dodatkowa_akcja. Znaczenie: Uruchom "dodatkowe działanie" zależne od stanu pamięci w E0.
JMP zakoncz_program
Skok do zakończenia
Opis: Skok do zakoncz_program, jeśli AL != 1. Znaczenie: Bez dodatkowej akcji przechodzimy do ostatecznego końca.
dodatkowa_akcja:
Etykieta dodatkowej akcji
Opis: Etykieta dodatkowa_akcja. Znaczenie: Blok kodu wykonywany, gdy E0 == 1.
ADD AL, 30
Konwersja do ASCII
Opis: Konwersja AL (1) do kodu ASCII, czyli AL += 0x30. Znaczenie: Teraz AL = '1' (0x31).
MOV [CL], AL
Zapis wartości
Opis: Zapisanie tej wartości w pamięci pod adresem CL (E0). Znaczenie: Być może do celów wyświetlenia czy innej obróbki.
zakoncz_program:
Etykieta zakończenia
Opis: Etykieta zakoncz_program. Znaczenie: Tu faktycznie kończymy działanie programu.
END
Koniec programu
Opis: Dyrektywa kończąca cały program. Znaczenie: Informuje asembler/linker, że to koniec kodu źródłowego.
zakoncz_program:
Etykieta zakończenia
Szczegółowe wyjaśnienie:
  • Etykieta końcowa programu
  • Punkt docelowy dla różnych skoków kończących program
  • W SMS32v50 oznacza miejsce finalnego zakończenia
  • Wszystkie ścieżki wykonania tu prowadzą
Rola w programie:
  • Miejsce finalizacji wszystkich operacji
  • Punkt gdzie program kończy działanie
  • Gwarantuje uporządkowane zakończenie programu
  • Trafiamy tu po sukcesie lub po błędzie
END
Koniec programu
Szczegółowe wyjaśnienie:
  • END to dyrektywa asemblera (nie instrukcja procesora)
  • Oznacza fizyczny koniec kodu źródłowego
  • W SMS32v50 jest obowiązkowa
  • Nie generuje kodu maszynowego
Znaczenie dla programu:
  • Informuje asembler o końcu kodu
  • Zapobiega próbom wykonania dalszych danych
  • Pozwala asemblerowi poprawnie zakończyć pracę
  • Jest ostatnim elementem każdego programu
OUT 01
Wyjście na port 01
Szczegółowe wyjaśnienie:
  • OUT - instrukcja wyjścia (Output)
  • 01 - numer portu wyjściowego
  • Wysyła wartość z AL na wskazane wyjście
  • W SMS32v50 port 01 to często wyświetlacz/LED
Działanie w systemie:
  • Komunikacja z urządzeniami zewnętrznymi
  • Wartość z AL jest wysyłana na port 01
  • Może sterować diodami, wyświetlaczami
  • Służy do sygnalizacji stanu programu
koniec_programu:
Etykieta końca
Szczegółowe wyjaśnienie:
  • Główna etykieta zakończenia programu
  • Punkt zbiorczy dla wszystkich ścieżek wykonania
  • Zapewnia jednolite zakończenie programu
  • W SMS32v50 wymagane poprawne zakończenie
Funkcje porządkowe:
  • Zbiera wszystkie ścieżki programu
  • Miejsce ostatecznego zatrzymania
  • Może zawierać kod sprzątający
  • Gwarantuje bezpieczne zakończenie