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]