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 68 69 70 71 72 73 74 75 76 77 78 79
| %define BOOT_POS 0x07C0
%define BOOT_STACK_START 0x50
%define BOOT_STACK_SIZE 0x76FF
%define KERNEL_POS_SECTOR_START 0x2
%define KERNEL_SECTOR_SIZE 0x2
%define KERNEL_POS_COPY 0x7E0 ;Le kernel sera copié à l'adresse 0x7E00
mov ax, BOOT_POS
mov ds, ax
mov es, ax
mov ax, BOOT_STACK_START
mov ss, ax
mov sp, BOOT_STACK_SIZE
c_error:
xor ax, ax
xor dl, dl
int 0x13
jc c_error
;Le contrôleur de disquette est initialisé
;On copie 2 secteurs après le premier secteur de la disquette dans lequel le bootloader est chargé
mov ax, KERNEL_POS_COPY
mov es, ax
xor bx, bx
mov ah, 0x02
mov al, KERNEL_SECTOR_SIZE
xor ch, ch
mov cl, KERNEL_POS_SECTOR_START
xor dx, dx
int 0x13
;passage en mode 32bits
cli
mov ax, gdt_end
mov bx, gdt_start
sub ax, bx
mov word [gdtr_limit], ax
xor eax, eax
xor ebx, ebx
mov ax, ds
shl eax, 4
mov ebx, gdt_start
add eax, ebx
mov dword [gdtr_base], eax
lgdt [gdtr_limit]
mov eax, cr0
or eax, 1
mov cr0, eax
jmp nxt
nxt:
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov esp, BOOT_STACK_START
jmp 0x8:0x7E00
gdt_start:
null_segment: dd 0, 0
code_segment: db 0xFF, 0xFF, 0x0, 0x0, 0x0, 10011011b, 11011111b, 0x0
data_segment: db 0xFF, 0xFF, 0x0, 0x0, 0x0, 10010011b, 11011111b, 0x0
gdt_end:
gdtr_limit: dw 0x00
gdtr_base: dd 0x0
times 510 - ($ - $$) db 0x00
dw 0xAA55 |
Partager