Listing 1 Plik boot.asm
; Program w bootsektorze wypisuje * we wszystkich możliwych kolorach.
; Adres startowy 0000:7c00
[ORG 0x07c00]
[BITS 16] ; program ma być kompilowany jako 16 bitowy
mov ax, 0xb800 ; ustawiamy segment es na początek
mov es,ax ; pamięci karty video
mov bx, 0 ; pozycja kursora
mov cl, 0xff ; bieżacy kolor
loop1:
mov byte [es:bx], '*' ; wpisujemy znak * na biezaca pozycje
mov byte [es:bx+1], cl ; ustawiamy atrybuty (kolor i tło)
add bx, 2 ; przesuwamy się na następną pozycję
sub cl, 1 ; zmiejszamy kod koloru
cmp cl, 0xff
jne loop1
loop2: jmp loop2 ; zapętlamy
times 510 - ($-$$) db 0 ; uzupełniamy zerami do pozycji 510
dw 0x0aa55 ; wartość aa55 oznacza,
;że jest to sektor bootowalny
Kompilowanie
nasm -f bin boot.asm -o boot.bin
Kopiowanie systemu na pendrive
sudo dd if=./boot.bin of=/dev/sdb1 bs=512 count=1
Uruchamianie w emulatorze [w zaleźności od wersji]
qemu -hda ./boot.bin
kvm -hda ./boot.bin --boot order=c
qemu-system-i386 -drive format=raw,file=./boot.bin
Listing 2 Plik boot_dysk.asm
; Kompilacja
; nasm boot_dysk.asm -fbin -o boot.bin
; Uruchomienie
; qemu -hda ./boot.bin
; Adres startowy 0000:7c00
[ORG 0x07c00]
[BITS 16]
bootloader:
mov ax, 0
mov ds, ax ; ustawienie segmentu DS na zero
mov es, ax
mov ah, 0x42 ; odczyt LBA
mov dl, 0x80 ; numer dysku (dysk nr 0)
mov si, read_pocket ; DS:SI adres struktury definiujacej
; ile przeczytać i gdzie umieścić
int 0x13
mov bp, 0x7E00
mov cx, msglen ; długość tekstu
call write_text
loop1:
hlt ; zatrzymujemy procesor
jmp loop1 ; zapętlamy
read_pocket:
db 0x10 ; rozmiar rekordu (pocket)
db 0 ; zarezerwowane = 0
dw 1 ; ile sektorów odczytać
dd 0x00007E00 ; gdzie umieścić wynik
dd 1 ; który sektor odczytać
dd 0 ; starsze bajty sektora
; Wypisuje tekst
; BP - adres tekstu
; CX - dlugosc tekstu
write_text:
mov ah, 0x13 ; wypisanie tekstu
mov al, 0x01 ; tryb pisania : bit 0 - przesunąc kursor po zapisie
; bit 1 - tekst zawiera na przemian
; litery i atrybuty znaków
mov bh, 0x00 ; strona ekranu
mov bl, 0x70 ; atrybuty znaków (czarne na białym tle)
mov dx, 0x0000 ; gdzie wypisać (górny lewy róg)
int 0x10
ret
times 510 - ($-$$) db 0 ; uzupełniamy zerami do pozycji 510
dw 0x0aa55 ; wartość aa55 oznacza,
;że jest to sektor bootowalny
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TO jest juz poza pierwszym sektorem i bedzie wczytane naszym bootloaderem
msg:
db 'To jest tekst w drugim sektorze', 13, 10
msglen equ ($ - msg)
times 1024 - ($-$$) db 0 ; uzupełniamy zerami do pozycji 1024
http://lukaszsowa.pl/tag/systemy-operacyjne/
Wykorzystaj przerwania BIOSu, aby za pomocą klawiatury sterować poruszaniem się obiektu na ekranie (w trybie tekstowym lub graficznym).
Na tej bazie zaimplementuj prostą grę.
Napisać własny mini system operacyjny:
przygotować bootsektor, który uruchomi się wypisując przywitanie,
załaduje drugi program 32-bitowy, przejdzie do trybu chronionego i przekaże sterowanie programowi 32 bitowemu,
program 32 bitowy powinien implementować prostą aplikację.
Jako rozszerzenie można postarać się przygotować obsługę wybranego przerwania z trybu chronionego.