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
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.
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.
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
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.