Spis treści

SMS32v50 - Odejmowanie Liczb w Systemie Dziesiętnym i Binarnym

📌 Główne Działanie Programu

Cel programu: Odejmowanie dwóch liczb (1-10 cyfr) w systemie dziesiętnym lub binarnym z obsługą pożyczki i sygnalizacją błędów.

  1. Wybór systemu liczbowego (dziesiętny/binarny)
  2. Wprowadzanie liczb z klawiatury z kontrolą długości (max. 10 cyfr)
  3. Wykonanie odejmowania cyfra po cyfrze z obsługą pożyczki
  4. Wyświetlenie wyniku na VDU lub sygnalizacja błędu (czerwona dioda)

Przykładowy kod fragmentu wyboru systemu:

; Inicjalizacja systemu
CLO
IN 00
CMP AL, 31
JZ system_dziesietny
; Domyślnie system binarny
MOV AL, 2

🧠 Architektura 8086 i Assembler

  1. Rejestry ogólnego przeznaczenia (AX, BX, CX, DX):
  2. Stos:

🔍 Analiza Kodu

1. Wybór Systemu Liczbowego

IN 00           ; Pobierz wybór użytkownika
CMP AL, 31      ; Czy to '1' (ASCII 49)?
JZ system_dziesietny ; Skocz do systemu dziesiętnego
MOV AL, 2       ; Domyślnie system binarny

2. Wprowadzanie Liczb

petla_wprowadzania:
IN 00           ; Pobierz cyfrę
CMP AL, 0D      ; Czy to ENTER (ASCII 13)?
JZ krok         ; Zakończ wprowadzanie
CMP CL, DL      ; Czy przekroczono 10 cyfr?
JZ blad_przekroczenia

3. Mechanizm Odejmowania

SUB BL, AL      ; Odejmij cyfry
CMP AL, 0
JS pozyczka     ; Jeśli wynik ujemny, obsłuż pożyczkę

Pożyczka: gdy wynik jest ujemny (np. 0-1), dodajemy wartość systemu (2 lub 10) i zmniejszamy poprzednią cyfrę:

pozyczka:
ADD AL, DL      ; DL = 2 (binarny) lub 10 (dziesiętny)
DEC CL          ; Cofnij się do poprzedniej cyfry
DEC BL          ; Zmniejsz poprzednią cyfrę o 1

4. Wyświetlenie Wyniku

wypisz_wynik:
ADD AL, 30      ; Konwersja na ASCII (np. 5 → '5')
MOV [CL], AL    ; Zapisz wynik w pamięci

❓ Przykładowe Pytania i Odpowiedzi

  1. Jak działa obsługa pożyczki w systemie binarnym?
    Gdy wynik odejmowania cyfr jest ujemny (np. 0-1), dodajemy 2 (wartość systemu) do wyniku (otrzymujemy 1) i zmniejszamy poprzednią cyfrę o 1.
  2. Dlaczego używasz PUSH i POP w obliczeniach?
    PUSH BL zapisuje wynik odejmowania na stosie, aby zwolnić rejestr BL do innych operacji. POP AL odczytuje go później.
  3. Jak program sygnalizuje błąd przekroczenia limitu cyfr?
    Gdy liczba przekroczy 10 cyfr, program ustawia wartość 90 w rejestrze AL i wyświetla ją na porcie 01 (czerwona dioda).
  4. Czym różni się JMP od przerwania INT?
    JMP zmienia tylko Instruction Pointer (IP), nie zapisuje stanu procesora. Przerwanie INT zapisuje stan (m.in. IP) na stosie i wykonuje procedurę obsługi przerwania.

🛠️ Potencjalne Problemy w Kodzie

  1. Adresacja pamięci:
    Czy C1-CB, D1-DB i E0-EF są poprawnie zdefiniowane? Należy upewnić się, że się nie nakładają.
  2. Obsługa ujemnych wyników:
    Program sygnalizuje błąd, gdy wynik końcowy jest ujemny (np. 3-5 w systemie dziesiętnym), ale nie wyświetla wartości ujemnej. Należy sprawdzić, czy tak ma być.

📚 Podsumowanie

Powodzenia na obronie! 🚀