Bootstrapping: Deel 2
---------------------
Moeilijkheidsgraad: makkelijk
Voorkennis: Matige i386 assemnbly
Referenties: zie startpost
Tools: Bochs, rawrite, nasm
Ik heb besloten deze tutorial zelfs te schrijven (anders is dat wel zo asociaal om alleen JayTaph's tutorials letterlijk te kopieren

Wel zal ik mijn info uit zijn tut's halen). We gaan nu iets verder, en gaan iets op het scherm printen. Meteen maar wat code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
| [bits 16] ;16 bits code
[org 0] ;we staan op 0
jmp start
bootdrv db 0 ;hierin zetten we onze bootdrive (0 voor diskette, 80 voor harddisk)
msg db 'Mijn bootloader',13,10,0
restartBericht db 'Druk op een toets om opnieuw te starten...',13,10,0
start:
; We weten niet of we op 0000:7C00 of 07C0:0000 staan, daarom kiezen
; we er zelf een.
mov ax, 0x7C0 ; Segment 07C0
mov ds, ax ; Data staat op 07C0:0000 ipv 0000:7C00
cli ; interrupts uitzetten
mov ax, 0x9000 ; Stack Segment Goedzetten
mov ss, ax ; Stack Segment = 0x9000 nu
mov sp, 0xFFFF ; Stack Pointer = 0xFFFF nu
sti ; interrupts weer aanzetten
mov si,msg ;kopieer het bericht naar SI
call Bericht ;roep functie Bericht aan
call Herstart
;-------Functie's----------------------
;-------Functie Bericht:---------------
;-------Plaats een string op het scherm
Bericht:
lodsb ;Laad byte op locatie DS:SI naar AL
or al,al ;kijk of karakter een 0 (nul) is
jz Klaar ;zoja spring naar Klaar
mov ah,0eh ;plaats karakter
mov bx,0007 ;attribuut
int 0x10 ;roep biosfunctie aan
jmp Bericht ;ga verder met het volgende karakter
Klaar:
ret ;keer terug
;-------Functie WachtToets:------------
;-------Wacht op een toets-------------
WachtToets:
mov ah,0 ;wacht op een toets
int 016h ;roep Biosfunctie aan
ret ;keer terug
;-------Functie Herstart:--------------
;-------Herstart de computer-----------
Herstart:
mov si,restartBericht ;stop het herstart bericht in het goede register (si)
call Bericht ;roep de bericht-op-scherm functie aan
call WachtToets ;en ff wachten maar
db 0x0EA ;REBOOT, jeweet wel, windows
dw 0000h
dw 0FFFFh
times 510-($-$$) db 0 ;vul tot byte 510 allemaal nullen (NOP)
dw 0xAA55 ;en als laatst de bootsignature |
Nu wat uitleg

Eerst vertellen we de compiler dat we
16 bits code gebruiken. We weten niet of we op
0000:7C00 of
07C0:0000 staan, daarom kiezen we er zelf een. We kopieren de segment
07C0 naar ax, en dan naar
DS zodat we op
07C0:0000 staan ipv
0000:7C00. Nu zetten we een stack op (ik neem aan dat je weet wat dat is, leer anders assembly

) Ik neem hier
0x9000, de boundry van je
640k bereik. Zo hebben we lekker veel ruimte. De
pointer zetten we op
0xFFFF. Waarom? Omdat de pointer omlaag gaat ipv omhoog, dus elke keer wanneer we iets
push'en op de stack dan gaat deze omlaag. In
dl staat de bootdrive, die slaan we even op in de variabele
bootdrv.
Nu willen we wat tekst op ons schermpje krijgen. We mov'en de string
msg naar SI en roepen daarna de functie
Bericht aan. Elke karakter in onze string die in
msg staat is 1 byte lang. In de functie Bericht laden we eerst de byte die op
DS:SI staat (dus de karakter die we willen printen) in
al. Daarna kijken we of er een nul karakter in zit (want dat is het laatste teken). Is dit het geval dan keren we terug naar waar we gebleven waren. Is dit niet het geval dan roepen we
Biosfunctie 10h aan. Kijk even op
Ralf Brown's site en zoek op
Int 10h. Daar staat alle info die je nodig hebt om die functie te gebruiken

Hetzelfde geldt ook voor de functie
WachtToets waar biosfunctie 16h wordt gebruikt. Deze moet je even uitzoeken anders ben ik morgen nog niet klaar

En als laatst hebben we functie
Herstart. Eerst plaatsen we het bericht
restartBericht in SI, plaatsen we het bericht op het scherm en wachten op een toets.
En aangezien ons bootloadertje
512 bytes lang moet zijn, plaatsen we tot
byte 510 allemaal nullen (NOP) en op
511 en 512 de bootsignature (0xAA55).
Ik hoop dat jullie het zullen begrijpen, dit is mijn eerste tutorial die ik helemaal zelf heb geschreven dus (ben nog 16)... Begrijp je iets niet stuur dan ff een mailtje
En mijn dank aan PrisonerOfPain
[
Voor 13% gewijzigd door
Oguz286 op 06-09-2003 18:26
]