Hello World OS

Het maken van een Hello world OS is met een paar kleine stappen gerealiseerd. Je zorgt dat je een assembler hebt, bij voorkeur FASM. Je maakt een bestand gevuld met de onderstaande code en noemt deze bijvoorbeeld bootstrap.asm. Zelf gooi ik zulke programma's direct naar de commandline, maar via de andere interfaces is het ook te doen om dit naar een een binary te krijgen.

 

De binary zal dan de naam bootstrap.bin hebben en heeft een grote van 512 bytes. De laaste 2 bytes zullen de waarde hebben van 0xAA55. Dit is zeer belangrijk de BIOS kijkt hiernaar en weet daardoor of het uitvoerbare code betreft. Het boostrap gedeelde op een medium zoals floppy, hdd, dvd enz. zijn de eerste 512 bytes. De meeste mediums zijn opgesplits in sectors van 512 bytes groot maar, dit is niet altijd het geval. Desondanks kijkt de BIOS precies naar de 2 bytes op 510 bytes offset vanaf het begin.

 

Als je deze binary dus insteld in een medium en je start de machine op vanaf dit medium zul je heel mooi Hello world op het scherm krijgen. Maar niet iedereen heeft nog een oude PC klaar staan die je zo kunt aantrappen. Daarnaast is het opnieuw opstarten van je PC om iets te testen uiteraard ook veels te veel werk. Daarom is het ook makelijker om een virtuele machine te installeren. Dan stel je dit bestand in als een floppy image, de meeste accepteren het wel als het niet de officiele floppy maat is.

 

; Compiler instructions
use16      ; The bootloader start always in 16-bits mode ( Real Mode ) 
org 0x7C00 ; Startposition in memory

mov ax, 0x0000      ; Data Segment (ds) register klaarmaken voor gebruik 
mov ds, ax          ; Dit moet via ax omdat de ds register niet direct gevuld kan worden
mov si, HelloWorld ; De bekende zin in SourceIndex (si) laden
mov ah, 0x0E     ;
mov bh, 0x00     ; don't no what this is, but is needs to be 0
mov bl, 0x07     ; bg=black,ft=white  altough it does't seem to have any affect
nextchar:         ; Begin schrijven letter
  lodsb           ; Zet [SI] in AL en SI++ 
    or al,al       ; Als de vorige opdracht mislukt ( einde zin ) dan... 
    jz return   ; Sprong naar label return 
    int 0x10       ; BIOS video interrupt 
jmp nextchar       ; Volgende letter in SI
return: 
jmp $               ; Hier laten we de computer 'vastlopen' ( never ending loop )  

; De Hello World data die voor de fun eindigd met een enter en dan met een 0 om de loop te eindigen
HelloWorld db 'Hello World',13,10,0

; Opvullen
times 510-($-$$) db 0 ; Opvullen tot 510 bytes met '0'-en
dw 0xAA55 ; Boot loader signature 2 bytes = 512 bytes!!! 
; Daarnaast is deze signature nodig anders weet de bios niet dat er uitvoerbare code in dit segment zit

 

Mocht de virtuale machine het niet pikken, kun je heel makelijk door het toevoegen van de onderstaande regel aan het eind van de code er geldige floppy image grote van maken. Daarnaast kan het ook nut hebben om de extentie van het bestand te veranderen van *.bin naar *.img

times 1474560-($-$$) db 0