72 lines
932 B
NASM
72 lines
932 B
NASM
global start
|
|
extern kmain
|
|
bits 32
|
|
|
|
; base, limit, access, flags
|
|
%macro gdt_entry 4
|
|
db %2 & 0xff
|
|
db (%2 >> 8) & 0xff
|
|
db %1 & 0xff
|
|
db (%1 >> 8) & 0xff
|
|
db (%1 >> 16) & 0xff
|
|
db %3
|
|
db ((%2 >> 16) & 0x0f) | (%4 << 4)
|
|
db (%1 >> 24) & 0xff
|
|
%endmacro
|
|
|
|
section .multiboot
|
|
align 8
|
|
mb_start:
|
|
; header
|
|
dd 0xe85250d6
|
|
dd 0
|
|
dd mb_end - mb_start
|
|
dd 0x100000000 - (0xe85250d6 + (mb_end - mb_start))
|
|
; null tag
|
|
dw 0
|
|
dw 0
|
|
dd 8
|
|
;
|
|
mb_end:
|
|
|
|
section .bss
|
|
align 16
|
|
stack_start:
|
|
resb 16384
|
|
stack_end:
|
|
|
|
section .rodata
|
|
align 16
|
|
gdt_start:
|
|
gdt_entry 0, 0, 0, 0
|
|
gdt_entry 0, 0xFFFFF, 0x9A, 0xC
|
|
gdt_entry 0, 0xFFFFF, 0x92, 0xC
|
|
gdt_end:
|
|
gdt_descriptor:
|
|
dw gdt_end - gdt_start - 1
|
|
dd gdt_start
|
|
|
|
|
|
section .text
|
|
align 8
|
|
start:
|
|
cli
|
|
lgdt [gdt_descriptor]
|
|
jmp 0x08:after_lgdt
|
|
after_lgdt:
|
|
mov ax, 0x10
|
|
mov ds, ax
|
|
mov ss, ax
|
|
mov es, ax
|
|
mov fs, ax
|
|
mov gs, ax
|
|
mov esp, stack_end
|
|
mov ebp, stack_end
|
|
sti
|
|
push ebx
|
|
call kmain
|
|
cli
|
|
halt:
|
|
hlt
|
|
jmp halt
|