Programy WSMS32V50 8-bit Simulator – Laboratoria


Zadanie 1, Laboratorium 10

Cel i przeznaczenie

Program cyklicznie wczytuje dane z portu 00h i zapisuje je w pamięci, zaczynając od adresu 0xC0 aż do 0xFF. Gdy wskaźnik pamięci (rejestr DL) osiągnie 0xFF, następuje reset do 0xC0. Może to służyć do buforowania danych wejściowych.

Kod źródłowy

mov dl, c0
start:
    in 00
    mov [dl], al
    inc dl
    cmp dl, ff
    jz reset
    jmp start
reset:
    mov dl, c0
    jmp start
end

Omówienie linii

mov dl, c0 – Ustawia rejestr DL na 0xC0, początkowy adres zapisu.
start: – Etykieta rozpoczynająca główną pętlę.
in 00 – Wczytuje bajt z portu 0 do AL.
mov [dl], al – Zapisuje wartość AL do pamięci pod adresem wskazanym przez DL.
inc dl – Przesuwa wskaźnik pamięci do następnego adresu.
cmp dl, ff – Porównuje DL z wartością 0xFF.
jz reset – Jeśli DL osiągnie 0xFF, skok do etykiety reset.
jmp start – Powrót do początku pętli.
reset: – Etykieta resetująca wskaźnik.
mov dl, c0 – Resetuje DL do 0xC0.
jmp start – Wznawia pętlę.
end – Koniec programu.

Zadanie 2, Laboratorium 10

Cel i przeznaczenie

Program wczytuje znaki z portu 00h do momentu naciśnięcia ENTER (0x0D) lub osiągnięcia adresu 0x42, a następnie kopiuje te dane do obszaru pamięci zaczynającego się od 0xC0.

Kod źródłowy

jmp start
org 43
start:
    mov dl, 00
czasone:
    in 00
    cmp al, 0d
    jz entr
    mov [dl], al
    inc dl
    cmp dl, 42
    jz entr
    jmp czasone
entr:
    mov dl, 00
    mov cl, c0
czastwo:
    mov al, [dl]
    inc dl
    mov [cl], al
    inc cl
    cmp cl, ff
    jz end
    jmp czastwo
end:
    end

Omówienie linii

jmp start – Skok do głównej części programu, pomijając dane.
org 43 – Ustawia offset kodu na 0x43.
mov dl, 00 – Ustawia DL na 0x00, początek bufora wejściowego.
czasone: – Pętla wczytywania danych.
in 00 – Pobiera znak z portu 0 do AL.
cmp al, 0d – Sprawdza, czy znak to ENTER (0x0D).
jz entr – Jeśli tak, przechodzi do kopiowania danych.
mov [dl], al – Zapisuje znak w buforze.
inc dl – Przesuwa wskaźnik zapisu.
cmp dl, 42 – Sprawdza, czy osiągnięto limit bufora.
jz entr – Jeśli tak, kończy wczytywanie.
jmp czasone – Kontynuuje pętlę.
entr: – Etykieta rozpoczynająca kopiowanie.
mov dl, 00 – Resetuje wskaźnik wejścia.
mov cl, c0 – Ustawia wskaźnik docelowy na 0xC0.
czastwo: – Pętla kopiowania.
mov al, [dl] – Pobiera znak z bufora wejściowego.
inc dl – Przesuwa wskaźnik wejścia.
mov [cl], al – Kopiuje znak do docelowego obszaru.
inc cl – Przesuwa wskaźnik docelowy.
cmp cl, ff – Sprawdza, czy osiągnięto koniec obszaru docelowego.
jz end – Jeśli tak, kończy kopiowanie.
jmp czastwo – Kontynuuje kopiowanie.
end: – Koniec programu.

Zadanie 3, Laboratorium 10

Cel i przeznaczenie

Program wczytuje znaki od adresu 0x03 do 0x42 lub do momentu naciśnięcia ENTER, a następnie kopiuje te dane w odwrotnej kolejności do obszaru pamięci zaczynającego się od 0xC0.

Kod źródłowy

jmp start
org 43
start:
    mov dl, 03
czasone:
    in 00
    cmp al, 0d
    jz entr
    mov [dl], al
    inc dl
    cmp dl, 42
    jz entr
    jmp czasone
entr:
    mov cl, c0
czastwo:
    mov al, [dl]
    dec dl
    mov [cl], al
    inc cl
    cmp dl, 02
    jz end
    jmp czastwo
end:
    end

Omówienie linii

mov dl, 03 – Ustawia początkowy adres bufora na 0x03.
czasone: – Pętla wczytywania danych.
in 00 – Odczytuje znak z portu 0.
cmp al, 0d – Sprawdza, czy wciśnięto ENTER.
jz entr – Jeśli tak, przerywa wczytywanie.
mov [dl], al – Zapisuje znak w buforze.
inc dl – Przesuwa wskaźnik bufora.
cmp dl, 42 – Sprawdza granicę bufora.
jz entr – Jeśli granica osiągnięta, przechodzi do kopiowania.
mov cl, c0 – Ustawia wskaźnik docelowy na 0xC0.
czastwo: – Pętla kopiowania w odwrotnej kolejności.
mov al, [dl] – Pobiera znak z bufora.
dec dl – Cofanie wskaźnika, aby odczytać poprzedni znak.
mov [cl], al – Kopiuje znak do docelowego obszaru.
inc cl – Przesuwa wskaźnik zapisu.
cmp dl, 02 – Sprawdza, czy osiągnięto początek bufora.
jz end – Jeśli tak, kończy program.
end – Koniec programu.

Zadanie 1, Laboratorium 11

Cel i przeznaczenie

Program demonstruje użycie przerwań (int 0C i int 0D) oraz ich obsługę. W zależności od wartości rejestru BL wykonywane są różne procedury przerwań umieszczone w segmentach pamięci 0x40 i 0x50.

Kod źródłowy

clo
call 10
org 10
    mov cl, 40
    mov [0d], cl
    mov cl, 50
    mov [0c], cl
start:
    mov al, a
    mov bl, 2
    cmp bl, 0
    jz swiatla
    int 0c
    jmp koniec
swiatla:
    int 0d
    jmp koniec2
org 40
    mov al, 90
    mov dl, 04
    push dl
    popf
    out 01
    iret
org 50
    mov dl, 0
petla:
    sub al, bl
    inc dl
    cmp al, 0
    js skok
    jmp petla
skok:
    dec dl
    push dl
    pop al
    iret

koniec:
    add al, 30
    mov [c0], al
koniec2:
    end

Omówienie linii

clo – Inicjalizuje ustawienia (czyszczenie flag).
call 10 – Wywołuje procedurę zaczynającą się pod org 10.
org 10 – Ustawia adres bazowy na 0x10.
mov cl, 40 – Ustawia wartość 0x40 w CL.
mov [0d], cl – Ustawia wektor przerwania (adres 0x0D) na 0x40.
mov cl, 50 – Ustawia CL na 0x50.
mov [0c], cl – Ustawia wektor przerwania (adres 0x0C) na 0x50.
start: – Główna pętla programu.
mov al, a – Ładuje wartość (0xA) do AL.
mov bl, 2 – Ustawia BL na 2.
cmp bl, 0 – Porównuje BL z 0.
jz swiatla – Jeśli BL = 0, skacze do procedury przerwania swiatla.
int 0c – Wywołuje przerwanie 0x0C.
jmp koniec – Skacze do zakończenia procedury.
swiatla: – Etykieta obsługi alternatywnej procedury przerwania.
int 0d – Wywołuje przerwanie 0x0D.
jmp koniec2 – Skacze do drugiego zakończenia.
org 40 – Umieszcza procedurę przerwania w segmencie 0x40.
mov al, 90 – Ustawia AL na 0x90.
mov dl, 04 – Ustawia DL na 4.
push dl / popf – Manipulacja flagami przy użyciu stosu.
out 01 – Wysyła wartość do portu 1.
iret – Powrót z procedury przerwania.
org 50 – Umieszcza drugą procedurę przerwania w segmencie 0x50.
petla: – Pętla przetwarzania wewnątrz procedury.
sub al, bl – Odejmowanie wartości BL od AL.
inc dl – Inkrementacja licznika.
cmp al, 0 – Sprawdza, czy AL jest ujemne.
js skok – Skok, jeśli wynik odejmowania jest ujemny.
jmp petla – Kontynuacja pętli.
skok: – Etykieta obsługi warunku ujemnego.
dec dl – Dekrementacja licznika.
push dl / pop al – Przeniesienie wartości DL do AL przez stos.
koniec: – Zakończenie głównej części programu.
add al, 30 – Konwersja wartości liczbowej do formatu ASCII.
mov [c0], al – Zapis wyniku do pamięci.
koniec2: – Druga etykieta zakończenia.
end – Koniec programu.

Zadanie 2, Laboratorium 11

Cel i przeznaczenie

Program interpretuje wczytany znak z portu 0. W zależności od kodu (np. 'Q', 'q' lub cyfra) wykonuje różne akcje, w tym miganie sygnalizatora podłączonego do portu 1.

Kod źródłowy

clo
jmp start
db 30
start:
    call 20
org 20
    int 03
org 30
    in 00
    mov bl, 51
    cmp al, bl
    jz qq
    mov bl, 71
    cmp al, bl
    jz qq
    mov bl, 3a
    cmp al, bl
    js cyfratest
powrot:
    mov cl, ff
    mov al, 90
    out 01
    jmp start
cyfratest:
    mov bl, 29
    cmp bl, al
    js cyfra
    jmp powrot
cyfra:
    sub al, 30
    push al
    pop cl
    jmp mig
powrot1:
    jmp start
qq:
    mov cl, fe
    jmp koniec
mig:
    push cl
    pop dl
    cmp dl, 0
    jz powrot1
petla:
    mov al, 24
    out 01
    mov al, 0
    out 01
    dec dl
    cmp dl, 0
    jz powrot1
    jmp petla
    iret
koniec:
    end

Omówienie linii

clo – Resetuje ustawienia/flag.
jmp start – Przeskakuje początkowe dane (db 30).
db 30 – Definiuje bajt danych (0x30).
call 20 – Wywołanie procedury pod adresem 0x20.
org 20 – Ustawia offset kodu na 0x20.
int 03 – Wywołanie przerwania 0x03.
org 30 – Ustawia offset kodu na 0x30.
in 00 – Pobiera znak z portu 0.
mov bl, 51 – Ustawia BL na 0x51 (kod ASCII 'Q').
cmp al, bl – Porównuje wczytany znak z 0x51.
jz qq – Jeśli zgodne, przechodzi do etykiety qq.
mov bl, 71 – Ustawia BL na 0x71 (kod ASCII 'q').
cmp al, bl – Porównanie z 'q'.
jz qq – Jeśli zgodne, przechodzi do qq.
mov bl, 3a – Ustawia BL na 0x3A (':').
cmp al, bl – Porównanie wczytanego znaku z 0x3A.
js cyfratest – Jeśli mniejszy, skacze do cyfratest (obsługa cyfr).
powrot: – Etykieta powrotu dla nieobsłużonych znaków.
mov cl, ff – Ustawia CL na 0xFF.
mov al, 90 – Ustawia AL na 0x90.
out 01 – Wysyła wartość do portu 1.
jmp start – Powrót do głównej pętli.
cyfratest: – Etykieta sprawdzania cyfr.
mov bl, 29 – Ustawia BL na 0x29.
cmp bl, al – Porównuje, czy wczytany znak jest mniejszy niż 0x29.
js cyfra – Jeśli tak, skok do cyfra.
jmp powrot – W przeciwnym przypadku powrót do etykiety powrot.
cyfra: – Etykieta konwersji znaku cyfry.
sub al, 30 – Konwertuje znak ASCII cyfry do wartości numerycznej.
push al / pop cl – Przenosi wartość cyfry do CL.
jmp mig – Skok do procedury migania.
powrot1: – Etykieta powrotu w procedurze migania.
jmp start – Powrót do głównej pętli.
qq: – Etykieta obsługi 'Q'/'q'.
mov cl, fe – Ustawia CL na 0xFE.
jmp koniec – Przechodzi do zakończenia.
mig: – Etykieta procedury migania.
push cl / pop dl – Przenosi wartość CL do DL.
cmp dl, 0 – Sprawdza, czy licznik migania osiągnął 0.
jz powrot1 – Jeśli tak, zakończenie migania.
petla: – Pętla migania.
mov al, 24 – Ustawia AL na 0x24 (sygnał migania).
out 01 – Wysyła sygnał do portu 1.
mov al, 0 – Resetuje AL.
out 01 – Wyłącza sygnał migania.
dec dl – Dekrementuje licznik migania.
cmp dl, 0 – Sprawdza, czy miganie się zakończyło.
jz powrot1 – Jeśli tak, powrót do głównej pętli.
jmp petla – Kontynuuje miganie.
iret – Powrót z procedury przerwania.
koniec: – Etykieta kończąca procedurę.
end – Koniec programu.

Zadanie 3, Laboratorium 11

Cel i przeznaczenie

Program odbiera znaki z portu 0, zapisuje je w pamięci od adresu 0x80 do 0x85, a następnie po naciśnięciu ENTER kopiuje je do innego obszaru (0xC0 do 0xC5) z wykorzystaniem procedur przerwania.

Kod źródłowy

clo
jmp start
db 1
db 40
start:
    mov bl, 80
    mov dl, c0
    jmp program
program:
    cmp bl, 85
    jz reset
    int 04
    inc bl
    jmp program
reset:
    mov bl, 80
    jmp program
org 40
petla:
    mov cl, 5
    in 00
    cmp al, 0d
    jz wypisz
    mov [bl], al
    iret
wypisz:
    inc bl
    cmp bl, 85
    jz powrot
powrot1:
    mov al, [bl]
    mov [dl], al
    inc dl
    cmp dl, c5
    jz powrot2
powrot3:
    dec cl
    cmp cl, 0
    jnz wypisz
    jmp program
powrot2:
    mov dl, c0
    jmp powrot3
powrot:
    mov bl, 80
    jmp powrot1
end

Omówienie linii

clo – Resetuje ustawienia/przygotowuje środowisko.
jmp start – Pomija dane (db 1, db 40) i przechodzi do głównej pętli.
db 1, db 40 – Dane wykorzystywane do konfiguracji.
mov bl, 80 – Ustawia BL na 0x80, początek bufora wejściowego.
mov dl, c0 – Ustawia DL na 0xC0, początek docelowego obszaru.
jmp program – Przechodzi do głównej pętli programu.
program: – Etykieta głównej pętli.
cmp bl, 85 – Sprawdza, czy osiągnięto koniec bufora wejściowego.
jz reset – Jeśli tak, resetuje wskaźnik BL.
int 04 – Wywołuje przerwanie 0x04, odpowiedzialne za odczyt znaku.
inc bl – Przesuwa wskaźnik bufora wejściowego.
reset: – Etykieta resetu bufora.
org 40 – Umieszcza procedurę przerwania w segmencie 0x40.
petla: – Pętla w procedurze przerwania.
in 00 – Odczytuje znak z portu 0.
cmp al, 0d – Sprawdza, czy naciśnięto ENTER.
jz wypisz – Jeśli tak, przechodzi do kopiowania danych.
mov [bl], al – Zapisuje znak do bufora.
iret – Powrót z procedury przerwania.
wypisz: – Etykieta kopiowania danych po ENTER.
inc bl – Przesuwa wskaźnik bufora.
cmp bl, 85 – Sprawdza granicę bufora.
jz powrot – Jeśli osiągnięto granicę, resetuje bufor.
powrot1: – Etykieta pomocnicza przy kopiowaniu.
mov al, [bl] – Pobiera znak z bufora wejściowego.
mov [dl], al – Kopiuje znak do docelowego obszaru.
inc dl – Przesuwa wskaźnik docelowy.
cmp dl, c5 – Sprawdza, czy osiągnięto koniec obszaru docelowego.
jz powrot2 – Jeśli tak, przechodzi do etykiety powrot2.
powrot3: – Pętla opóźniająca kopiowanie.
dec cl – Dekrementuje licznik opóźnienia.
cmp cl, 0 – Sprawdza warunek zakończenia opóźnienia.
jnz wypisz – Jeśli licznik nie osiągnął 0, powrót do kopiowania.
jmp program – Po zakończeniu opóźnienia, powrót do głównej pętli.
powrot2: – Resetuje wskaźnik docelowy, gdy osiągnięto koniec.
mov dl, c0 – Resetuje DL do 0xC0.
jmp powrot3 – Powrót do opóźniającej pętli.
powrot: – Resetuje bufor wejściowy.
mov bl, 80 – Ustawia BL na 0x80.
jmp powrot1 – Powrót do kopiowania danych.
end – Koniec programu.

Zadanie 1, Laboratorium 12

Cel i przeznaczenie

Program konfiguruje obsługę przerwań reagującą na dane z portu 7. Dla określonych klawiszy ('w', 's', 'a', 'd') wysyła odpowiednie wartości do portu 4, co może służyć jako prosty mechanizm sterowania.

Kod źródłowy

jmp start
db 10
db 12
start:
    clo
    out 07
    mov al, ff
    out 04
petla:
    sti
    jmp petla
org 10
    iret
org 12
    cli
    in 07
    cmp al, 77
    jz gora
    cmp al, 73
    jz dol
    cmp al, 61
    jz lewo
    cmp al, 64
    jz prawo
    jmp koniec
gora:
    mov al, 8f
    out 04
    jmp koniec
dol:
    mov al, 4f
    out 04
    jmp koniec
lewo:
    mov al, 2f
    out 04
    jmp koniec
prawo:
    mov al, 1f
    out 04
koniec:
    iret
end

Omówienie linii

jmp start – Pomija dane (db 10, db 12) i przechodzi do głównej sekcji.
db 10, db 12 – Dane wykorzystywane jako wektory przerwań.
clo – Resetuje ustawienia/flag.
out 07 – Konfiguruje port 7 (np. odbiór klawiatury).
mov al, ff – Ustawia AL na 0xFF.
out 04 – Wysyła 0xFF do portu 4 (ustawienie początkowe).
petla: – Pętla główna, aktywna w trybie przerwań.
sti – Włącza przerwania.
jmp petla – Nieskończona pętla oczekiwania.
org 10 – Sekcja obsługi przerwania dla adresu 0x10.
iret – Powrót z przerwania.
org 12 – Sekcja obsługi przerwania dla adresu 0x12.
cli – Wyłącza przerwania na czas obsługi.
in 07 – Odczytuje wartość z portu 7 (kod klawisza).
cmp al, 77 – Sprawdza, czy klawisz to 'w' (0x77).
jz gora – Jeśli tak, przechodzi do procedury gora.
cmp al, 73 – Sprawdza, czy klawisz to 's' (0x73).
jz dol – Jeśli tak, przechodzi do procedury dol.
cmp al, 61 – Sprawdza, czy klawisz to 'a' (0x61).
jz lewo – Jeśli tak, przechodzi do procedury lewo.
cmp al, 64 – Sprawdza, czy klawisz to 'd' (0x64).
jz prawo – Jeśli tak, przechodzi do procedury prawo.
jmp koniec – Jeśli żaden warunek nie jest spełniony, przechodzi do koniec.
gora: – Procedura dla ruchu w górę.
mov al, 8f – Ustawia AL na 0x8F.
out 04 – Wysyła wartość do portu 4.
dol: – Procedura dla ruchu w dół.
mov al, 4f – Ustawia AL na 0x4F.
lewo: – Procedura dla ruchu w lewo.
mov al, 2f – Ustawia AL na 0x2F.
prawo: – Procedura dla ruchu w prawo.
mov al, 1f – Ustawia AL na 0x1F.
koniec: – Zakończenie procedury przerwania.
iret – Powrót z procedury przerwania.
end – Koniec programu.