org 0x07c00 ; Adresse de début 0000:7c00 jmp short begin_boot ; Saut sur la routine d'amorçage & passe les autres données bootmesg db "Chargement du secteur d'amorçage de notre OS ......" pm_mesg db "Basculement en mode protégé ...." dw 512 ; Nombre d'octets par secteurs db 1 ; Nombre de secteurs par grappe dw 1 ; Nombre de secteurs réservés db 2 ; Nombre de FATs dw 0x00e0 ; Nombre de répertoires à la racine dw 0x0b40 ; Nombre de secteurs dans le volume db 0x0f0 ; Descripteur du media dw 9 ; Nombre de secteurs par FAT dw 18 ; Nombre de secteurs par piste dw 2 ; Nombre de secteurs en lecture/écriture dw 0 ; Nombre de secteus cachés print_mesg : mov ah,0x13 ; Fonction 13h de l'int 10h écrivant une chaîne à l'écran mov al,0x00 ; Le bit 0 détermine la position du curseur,0->pointe sur le début de la prochaine ligne ,1->pointe après le dernier caractère écrit mov bx,0x0007 ; bh -> page écran ie 0,bl = 07 ie blanc sur noir mov cx,0x20 ; Ici la taille de la chaîne est 32 mov dx,0x0000 ; dh->ligne curseur,dl->colonne curseur int 0x10 ; appelle de l'interruption bios 10h ret ; Retour à la routine appelante get_key : mov ah,0x00 int 0x16 ; Get_key Fonction 00h de l'int 16h, lit le caractère sur le clavier ret clrscr : mov ax,0x0600 ; Fonction 06 de l'int 10h, fait défiler la fenêtre vers le haut,si al = 0 efface l'écran mov cx,0x0000 ; Efface la fenêtre de 0,0 mov dx,0x174f ; à 23,79 mov bh,0 ; rempli avec la couleur 0 int 0x10 ; appelle l'interruption bios 10h ret begin_boot : call clrscr ; Efface l'écran mov bp,bootmesg ; Positionne le pointeur de chaîne sur le message call print_mesg ; Affiche le message call get_key ; Attend l'appui d'une touche bits 16 call clrscr ; Efface l'écran mov ax,0xb800 ; fait pointer gs sur la mémoire vidéo mov gs,ax ; On désire afficher un 'A' de couleur marron mov word [gs:0],0x641 ; dans le mode réel call get_key ; Appelle à nouveau Get_key again, (affiche jusqu'à ce qu'une touche soit pressée) mov bp,pm_mesg ; Défini le pointeur de chaîne call print_mesg ; Appelle la sous-routine print_mesg call get_key ; Attends l'appui d'une touche call clrscr ; Efface l'écran cli ; Désactive les interruptions lgdt[gdtr] ; Charge la TDG mov eax,cr0 ; Le bit poids faible cr0 est le bit du mode protégé or al,0x01 ; Met à 1 le bit du mode protégé mov cr0,eax ; Charge le mot modifié dans le registre de contôle jmp codesel:go_pm bits 32 go_pm : mov ax,datasel mov ds,ax ; Initialise les segments de données ds & es mov es,ax mov ax,videosel ; Initialise gs sur la mémoire vidéo mov gs,ax mov word [gs:0],0x741 ; Affiche un 'A' blanc dans le mode protégé spin : jmp spin ; Boucle bits 16 gdtr : dw gdt_end-gdt-1 ; Taille de la TDG dd gdt ; Adesse physique de la TDG gdt nullsel equ $-gdt ; $->position actuelle, donc nullsel = 0h gdt0 ; Descripteur vide, par convention gdt0 vaut 0 dd 0 ; Chaque entrée de la tdg est de 8 octets, alors à 08h il y a CS dd 0 ; Il y a 64 bits dans tous les descripteurs de segments codesel equ $-gdt ; C'est 8h (le 2nd descripteur de la tdg) code_gdt ; descripteur de code, segment uniforme de 4Gb à l'adresse 0000:0000h dw 0x0ffff ; Limite de 4Gb bits 0-15 du descripteur de segment dw 0x0000 ; Base 0h bits 16-31 du descripteur de segment db 0x00 ; addresse de base du segment 16-23 offset 32bit addr,32-39 de sd db 0x09a ; P,DPL(2),S,TYPE(3),A->Present bit 1,Descripteur 3,descripteur de segment 1 ie code db 0x0cf ; Les 4 bits de poids fort G,D,0,AVL ->1 segment len est la page 1, la taille de l'opération est de 32 bits par défaut ; AVL : champ disponible pour l'utilisateur ou l'OS ; bit de poids faible 16-19 pour la limite du segment db 0x00 ; Adresse de base addr of seg 24-31 of 32bit addr,56-63 of sd datasel equ $-gdt ; ie 10h, début des 8 octets octets pour le descripteur de segment data_gdt ; Descripteur de données 4Gb segment plat à 0000:0000h dw 0x0ffff ; Limite de 4Gb dw 0x0000 ; Base 0000:0000h db 0x00 ; Le format du descripteur est identique à celui ci-dessus db 0x092 db 0x0cf db 0x00 videosel equ $-gdt ; ie 18h,prochaine entrée tdg dw 3999 ; Limite 80*25*2-1 dw 0x8000 ; Base 0xb8000 db 0x0b db 0x92 ; present,ring 0,data,expand-up,writable db 0x00 ; granularité de 16 bits db 0x00 gdt_end times 510-($-$$) db 0 ; Rempli de 0 des octets de l'adresse courante à l'adresse 510 dw 0x0aa55 ; Ecrit aa55 dans les octets bytes 511,512 pout indiquer qu'il s'agit d'un secteur amorçable.