Kod Źródłowy v1.0 (Strukturalny)
; ===== SEKCJA 1: Inicjalizacja i wybór systemu =====
CLO ; Reset wszystkich rejestrów i pamięci
IN 00 ; Pobranie wyboru systemu od użytkownika
CMP AL, 31 ; Porównanie z kodem ASCII '1' (wybór dziesiętny)
JZ system_dziesietny ; Skok do konfiguracji systemu 10
MOV AL, 2 ; Domyślny system binarny
MOV [BC], AL ; Zapis systemu do komórki konfiguracyjnej BC
JMP wprowadz_liczby ; Przejście do wprowadzania danych
; ===== SEKCJA 2: Ustawienie systemu dziesiętnego =====
system_dziesietny: ; Konfiguracja dla systemu 10
MOV AL, 10 ; Wartość bazowa dla operacji
MOV [BC], AL ; Zapis do komórki konfiguracyjnej
JMP wprowadz_liczby ; Kontynuacja wprowadzania
; ===== SEKCJA 3: Wprowadzanie liczb =====
wprowadz_liczby: ; Główna pętla wprowadzania
MOV CL, C1 ; Adres początkowy dla liczby 1
MOV DL, CB ; Maksymalny adres (ograniczenie do 10 cyfr)
petla_wprowadzania: ; Pętla wprowadzania cyfr
IN 00 ; Pobranj cyfry od użytkownika
CMP AL, 0D ; Sprawdzenie czy ENTER
JZ krok ; Przejście do następnego kroku
CMP CL, DL ; Sprawdzenie limitu cyfr
JZ blad_przekroczenia ; Błąd przy przekroczeniu
MOV [CL], AL ; Zapis cyfry do pamięci
INC CL ; Inkrementacja wskaźnika
JMP petla_wprowadzania ; Kontynuacja pętli
; ===== SEKCJA 4: Przejście do obliczeń =====
krok: ; Przygotowanie do obliczeń
CMP CL, CF ; Sprawdzenie czy wprowadzono 2 liczby
JNS oblicz_wynik ; Skok do obliczeń jeśli gotowe
MOV CL, D1 ; Ustawienie adresu dla liczby 2
MOV DL, DB ; Maksymalny adres dla liczby 2
JMP petla_wprowadzania ; Powrót do wprowadzania
; ===== SEKCJA 5: Obliczenia (odejmowanie) =====
oblicz_wynik: ; Główna procedura obliczeniowa
MOV DL, [BC] ; Pobranie systemu liczbowego
DEC CL ; Korekta wskaźnika
petla_obliczen: ; Pętla obliczeń dla każdej cyfry
CMP CL, CF ; Sprawdzenie końca danych
JZ koniec_programu ; Zakończenie jeśli koniec
MOV AL, [CL] ; Pobranie cyfry odjemnej
CMP AL, 20 ; Sprawdzenie spacji (separator)
JZ koniec_programu ; Zakończenie jeśli separator
SUB CL, 10 ; Przejście do cyfry odjemnika
MOV BL, [CL] ; Pobranie cyfry odjemnika
ADD CL, 20 ; Przejście do komórki wynikowej
SUB BL, AL ; Odejmowanie cyfr
PUSH BL ; Tymczasowe przechowanie wyniku
POP AL ; Przywrócenie wyniku
CMP AL, 0 ; Sprawdzenie czy wynik ujemny
JS pozyczka ; Obsługa pożyczki jeśli potrzebna
JMP wypisz_wynik ; Wyświetlenie wyniku
; ===== SEKCJA 6: Obsługa pożyczki =====
pozyczka: ; Mechanizm pożyczania
ADD AL, DL ; Korekta wyniku (dodanie podstawy systemu)
DEC CL ; Przejście do wyższej cyfry
MOV BL, [CL] ; Pobranie wartości cyfry
DEC BL ; Zmniejszenie cyfry o 1
MOV [CL], BL ; Aktualizacja wartości
ADD CL, 10 ; Powrót do aktualnej pozycji
; ===== SEKCJA 7: Wyświetlenie wyniku =====
wypisz_wynik: ; Formatowanie wyniku
ADD AL, 30 ; Konwersja na ASCII
MOV [CL], AL ; Zapis wyniku do pamięci
SUB CL, 11 ; Przejście do następnej pary cyfr
JMP petla_obliczen ; Kontynuacja obliczeń
; ===== SEKCJA 8: Sygnalizacja błędu =====
blad_przekroczenia: ; Procedura błędu
MOV AL, 90 ; Kod błędu
OUT 01 ; Sygnalizacja świetlna
JMP koniec_programu ; Przejście do zakończenia
; ===== SEKCJA 9: Zakończenie programu =====
koniec_programu: ; Procedura końcowa
MOV CL, E0 ; Komórka kontrolna
MOV AL, [CL] ; Pobranie flagi
CMP AL, 1 ; Sprawdzenie dodatkowej akcji
JZ dodatkowa_akcja ; Wykonanie dodatkowej procedury
JMP zakoncz_program ; Standardowe zakończenie
dodatkowa_akcja: ; Dodatkowe operacje
ADD AL, 30 ; Konwersja specjalnej wartości
MOV [CL], AL ; Zapis do pamięci
zakoncz_program: ; Ostateczne zakończenie
END ; Zatrzymanie programu
graph TD
A[Rozpoczęcie programu] --> B[Wybór systemu liczbowego]
B --> C{System dziesiętny?}
C -->|Tak| D[Konfiguracja systemu 10]
C -->|Nie| E[Konfiguracja systemu 2]
D --> F[Wprowadzanie liczby 1]
E --> F
F --> G[Sprawdzenie limitu cyfr]
G -->|Przekroczono| H[Błąd 90]
G -->|W porządku| I[Wprowadzanie liczby 2]
I --> J[Obliczenia]
J --> K{Sprawdzenie wyniku}
K -->|Ujemny| L[Pożyczka]
K -->|Dodatni| M[Konwersja na ASCII]
L --> M
M --> N[Zapis wyniku]
N --> O[Zakończenie programu]