jeudi 16 août 2007

Hello World OS

Le but de cet article est de présenter comment coder un petit hello world au boot d'un PC.

Rappels sur le démarrage d'un PC


  • Le premier programme qui démarre est le bios
  • Il effectue des contrôles sur le PC
  • Il initialise les périphériques
  • Il charge le secteur de boot et il l'éxécute
Le secteur de boot

Rappel : un programme en assembleur se présente sous la forme d'une suite d'octets

Un secteur de boot contient :

  • Des informations donnant les caractéristiques du disque
  • Les octets du programme de secteurs de boot
  • 2 octets magiques indiquant que le disque est bootable
  • Le seul secteur chargé automatiquement par le bios
  • Il stocke moins de 512 octets pour le programme
Le source

[BITS 16]

[ORG 0x0]

; initialisation des segments en 0x07C0
mov ax,0x07C0
mov ds,ax
mov es,ax
mov ax,0x8000
mov ss,ax
mov sp, 0xf000

;--- les données ---
msgDebut db "Hello world OS is running ! ",13,10,0

; Affiche une chaine de caracteres se terminant par 0x0
; Entree: DS:SI -> pointe sur la chaine a afficher
afficher:
push ax
push bx
.debut:
lodsb ; ds:si -> al
cmp al,0 ; fin chaine ?
jz .fin
mov ah,0x0E ; appel au service 0x0e, int 0x10 du bios
mov bx,0x07 ; bx -> attribut, al -> caractere ascii
int 0x10
jmp .debut
.fin:
pop bx
pop ax
ret

;--- NOP jusqu'a 510 ---
times 510-($-$$) db 144
; nombre magique : indique au pc que le secteur est bootable
dw 0xAA55