[ Pobierz całość w formacie PDF ]
Jest to sterownik wymyślonego urządzenia znakowego MYSZKA1, który obsługuje tylko funkcję INIT
(oczywiście) i pobieranie danych z urządzenia, które sprowadza się do zwrócenia starego znacznika EOF
(1Ah).
Aby było widać, że mój sterownik się ładuje (dzięki linii DEVICE=... w config.sys), dorobiłem kod
wyświetlający na ekranie informację o ładowaniu.
Resztę zobaczcie sami:
(przeskocz przykładowy kod)
; Przykład sterownika typu .SYS
; Autor: Bogdan D.
; kontakt: bogdandr (małpka) op (kropka) pl
236 Bogdan Drozdowski
2009-02-25 Język asembler dla każdego Bogdan Drozdowski
;
; kompilacja:
; nasm -O999 -w+orphan-labels -o protosys.sys -f bin protosys.asm
dd 0FFFFFFFFh ; wskaznik na następny sterownik
; -1, bo mamy tylko 1 urządzenie
dw 08000h ; atrybuty (urz. znakowe), output till busy (A000)
dw strategia ; adres procedury strategii
dw przerwanie ; adres procedury przerwania
db "MYSZKA1 " ; nazwa urządzenia (8 znaków, dopełniane spacjami)
przerwanie:
pushf
push es
push bx
push ax
les bx, [cs:request_header] ; ES:BX -> nagłówek żądania
mov al, [es:bx + 2] ; kod rozkazu
test al, al ; 0 = INIT
jz .init
cmp al, 4 ; czy ktoś chce czytać dane?
je .czytanie
cmp al, 5
je .czytanie2
; innych żądań nie obsługujemy
.koniec_przer:
; słowo wyniku w [es:bx+3]
mov word [es:bx + 3], 100h ; mówimy, że wszystko zrobione
pop ax
pop bx
pop es
popf
retf
.init:
; podajemy adres końca kodu, który ma
; zostać w pamięci
; można usunąć niepotrzebny już kod
mov word [es:bx + 0eh], koniec
mov [es:bx + 10h], cs
pusha
push es
mov ah, 3 ; pobranie aktualnej pozycji kursora
xor bx, bx
int 10h ; DH, DL - wiersz, kolumna kursora
inc dh
xor dl, dl ; idziemy o 1 wiersz niżej,
; od lewej krawędzi
push cs
mov ax, 1301h ; AH=funkcja pisania na ekran.
; AL=przesuwaj kursor
Bogdan Drozdowski 237
Bogdan Drozdowski Język asembler dla każdego 2009-02-25
mov bx, 7 ; normalne znaki (szary na czarnym)
mov cx, init1_dl ; długość napisu
mov bp, init1 ; adres napisu
pop es ; segment napisu = CS
int 10h ; napis na ekran.
; DH, DL wskazują pozycję.
pop es
popa
jmp short .koniec_przer
.czytanie: ; jak ktoś chce czytać, zwracamy mu EOF
push es
push ax
push cx
push di
mov cx, [es:bx + 12h] ; liczba żądanych bajtów
les di, [es:bx + 0Eh] ; adres czytania/zapisywania
mov al, 1Ah ; 1ah = EOF
rep stosb ; zapisujemy
pop di
pop cx
pop ax
pop es
jmp short .koniec_przer
.czytanie2: ; jak ktoś chce czytać, zwracamy mu EOF
mov byte [es:bx+0Dh], 1Ah
jmp short .koniec_przer
request_header dd 0 ; wskaznik na nagłówek żądania
strategia:
pushf
mov [cs:request_header], bx ; zapisujemy adres nagłówka żądania
mov [cs:request_header+2], es
cmp byte [cs:pierwsze], 1
jne .nie_pisz
mov byte [cs:pierwsze], 0
pusha
push es
mov ah, 3 ; pobranie aktualnej pozycji kursora
xor bx, bx
int 10h ; DH, DL - wiersz, kolumna kursora
inc dh
xor dl, dl ; idziemy o 1 wiersz niżej,
; od lewej krawędzi
push cs
mov ax, 1301h ; AH=funkcja pisania na ekran.
; AL=przesuwaj kursor
mov bx, 7 ; normalne znaki (szary na czarnym)
mov cx, info1_dl ; długość napisu
mov bp, info1 ; adres napisu
pop es ; segment napisu = CS
238 Bogdan Drozdowski
2009-02-25 Język asembler dla każdego Bogdan Drozdowski
int 10h ; napis na ekran.
; DH, DL wskazują pozycję.
pop es
popa
.nie_pisz:
popf
retf
info1 db "*** Uruchamianie sterownika MYSZKA1...",10,13,10,13
info1_dl equ $ - info1
init1 db "*** INIT", 13, 10, 13, 10
init1_dl equ $ - init1
pierwsze db 1
; wszystko od tego miejsca zostanie wyrzucone z pamięci
koniec:
Jak widać, było tu o wiele więcej opisu niż samej roboty i wcale nie okazało się to takie straszne.
Aby zobaczyć, czy nasz sterownik rzeczywiście został załadowany i ile zajmuje miejsca w pamięci, należy
wydać polecenie mem /c/p.
Miłej zabawy.
Spis treści off-line (Alt+1)
Spis treści on-line (Alt+2)
Ułatwienia dla niepełnosprawnych (Alt+0)
Bogdan Drozdowski 239
Bogdan Drozdowski Język asembler dla każdego 2009-02-25
240 Bogdan Drozdowski
2009-02-25 Język asembler dla każdego Bogdan Drozdowski
Bezpośredni dostęp do ekranu
Jeśli myślicie, że odpowiednie funkcje przerwań 10h i 21h są jedynym sposobem na to, aby napisać coś na
ekranie, to ten kurs pokaże Wam, jak bardzo się mylicie.
Na ekran w trybie tekstowym składa się 80x25 = 2000 znaków. Nie oznacza to jednak 2000 bajtów, gdyż
każdy znak zaopatrzony jest w pewną wartość (1 bajt) mówiącą o jego wyglądzie. Aącznie jest więc 2000
[ Pobierz całość w formacie PDF ]
ebook @ pobieranie @ pdf @ do ÂściÂągnięcia @ download
Wątki
- Home
- 0036. Pickart Joan Elliott KaĹźde nowe jutro
- Anne Perry [Pitt 22] Southampton Row (pdf)
- Glen Cook Dread Empire 07 An Ill Fate Marshalling
- statut katalonii po ang
- Fred Saberhagen Dracula 03 Vlad Tapes
- Agatha Christie Dom nad kanaśÂem
- Ray Angie Duchy
- Kowalewski_WćąĂ˘ÂÂodzimierz_ _Bóg_zapśÂacz
- Harry Harrison Galactic Dreams (SS Collection)
- Flesa Black Big Bad Wolf
- zanotowane.pl
- doc.pisz.pl
- pdf.pisz.pl
- ninetynine.opx.pl
Cytat
Ibi patria, ibi bene. - tam (jest) ojczyzna, gdzie (jest) dobrze
Dla cierpiącego fizycznie potrzebny jest lekarz, dla cierpiącego psychicznie - przyjaciel. Menander
Jak gore, to już nie trza dmuchać. Prymus
De nihilo nihil fit - z niczego nic nie powstaje.
Dies diem doces - dzień uczy dzień.