Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [bits 16]
- [org 0x7c00]
- jmp 0:kernel_start
- gdt_start:
- gdt_null:
- dd 0x0
- dd 0x0
- gdt_code:
- dw 0xffff
- dw 0x0
- db 0x0
- db 10011010b
- db 11001111b
- db 0x0
- gdt_data:
- dw 0xffff
- dw 0x0
- db 0x0
- db 10010010b
- db 11001111b
- db 0x0
- gdt16_code:
- ; 16-bit 4gb flat r/w/executable code descriptor
- dw 0xFFFF ; limit low
- dw 0 ; base low
- db 0 ; base middle
- db 10011010b ; access
- db 10001111b ; granularity
- db 0 ; base high
- gdt16_data:
- ; 16-bit 4gb flat r/w data descriptor
- dw 0xFFFF ; limit low
- dw 0 ; base low
- db 0 ; base middle
- db 10010010b ; access
- db 10001111b ; granularity
- db 0 ; base high
- gdt_end:
- gdt_descriptor:
- dw gdt_end - gdt_start - 1
- dd gdt_start
- CODE_SEG equ gdt_code - gdt_start
- DATA_SEG equ gdt_data - gdt_start
- DATASEL16 equ gdt16_data - gdt_start
- CODESEL16 equ gdt16_code - gdt_start
- print:
- pusha
- mov ah, 14
- mov bh, 0
- .loop:
- lodsb
- cmp al, 0
- je .done
- int 0x10
- jmp .loop
- .done:
- popa
- ret
- modo16 db 'hello modo real ', 0
- modo162 db '///// voltou modo real', 0
- modo32 db 'hello modo protegido', 0
- kernel_start:
- mov ax, 0
- mov ss, ax
- mov sp, 0xFFFC
- mov ax, 0
- mov ds, ax
- mov es, ax
- mov fs, ax
- mov gs, ax
- mov si, modo16
- call print
- cli
- lgdt[gdt_descriptor]
- mov eax, cr0
- or eax, 0x1
- mov cr0, eax
- jmp CODE_SEG:b32
- idt_real:
- dw 0x3ff ; 256 entries, 4b each = 1K
- dd 0 ; Real Mode IVT @ 0x0000
- savcr0:
- dd 0 ; Storage location for pmode CR0.
- Entry16:
- ; We are already in 16-bit mode here!
- cli ; Disable interrupts.
- ; Need 16-bit Protected Mode GDT entries!
- mov eax, DATASEL16 ; 16-bit Protected Mode data selector.
- mov ds, eax
- mov es, eax
- mov fs, eax
- mov gs, eax
- mov ss, eax
- ; Disable paging (we need everything to be 1:1 mapped).
- mov eax, cr0
- mov [savcr0], eax ; save pmode CR0
- and eax, 0x7FFFFFFe ; Disable paging bit & disable 16-bit pmode.
- mov cr0, eax
- jmp 0:GoRMode ; Perform Far jump to set CS.
- GoRMode:
- mov sp, 0x8000 ; pick a stack pointer.
- mov ax, 0 ; Reset segment registers to 0.
- mov ds, ax
- mov es, ax
- mov fs, ax
- mov gs, ax
- mov ss, ax
- lidt [idt_real]
- sti ; Restore interrupts -- be careful, unhandled int's will kill it.
- jmp kernel_end
- kernel_end:
- mov si, modo162
- call print
- jmp $
- [bits 32]
- VIDEO_MEMORY equ 0x0B85A0
- WHITE_ON_BLACK equ 0x0f
- print32:
- pusha
- mov edx, VIDEO_MEMORY
- .loop:
- mov al, [ebx]
- mov ah, WHITE_ON_BLACK
- cmp al, 0
- je .done
- mov [edx], ax
- add ebx, 1
- add edx, 2
- jmp .loop
- .done:
- popa
- ret
- b32:
- mov ax, DATA_SEG
- mov ds, ax
- mov es, ax
- mov fs, ax
- mov gs, ax
- mov ss, ax
- mov ebp, 0x2000
- mov esp, ebp
- mov ebx, modo32
- call print32
- jmp CODESEL16:Entry16
- [SECTION signature start=0x7dfe]
- dw 0AA55h
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement