All pastes #357670 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-02-15 21:17 UTC
rendered paste body
;tak jak poprzednio BIOS nasz bootsektor zaladowal pod 0x7C00
[org 0x7C00]

; w tybie rzeczywistym uzywamy 16 bitowego kodu
[BITS 16]
start:
  ; ustawiamy stos dla trybu rzeczywistego
  mov ax, 0x1000
  mov ss, ax
  xor esp, esp

  ; inicjujemy tryb wideo 80x25 (tekstowy)
  xor ah, ah
  mov al, 3
  int 0x10

  ; ladujemy jadro pod adres 0x1000
  xor ah, ah
  int 0x10

  mov ah, 2
  mov al, 10
  xor ch, ch
  mov cl, 2
  mov dh, 0
  mov bx, 0x1000
  mov es, bx
  mov bx, 0
  int 0x13
  
gdt:
  ; NULL Descriptor
  dd 0
  dd 0
 
  ; kod, baza: 0, limit: 4GB, DPL: 0
  dw 0xFFFF    ; mlodsze slowo limitu
  dw 0         ; mlodsze slowo bazy
  db 0         ; wlodszy bajt starszego slowa bazy
  db 10011010b ; kod / exec-read
  db 11001111b ; flagi i 4 bity limitu
  db 0         ; najstarszy bajt bazy
 
  ; dane (odczyt/zapis), baza: 0, limit: 4GB, DPL: 0
  dw 0xFFFF
  dw 0       
  db 0       
  db 10010010b
  db 11001111b
  db 0       
gdt_end:   
 
; naglowek
gdt_descr:
  dw gdt_end - gdt - 1    ; rozmiar gdt
  dd gdt                  ; adres pierwszego deskryptora

  lgdt [gdt_descr]

  mov eax, cr0
  or eax, 1
  mov cr0, eax

  mov ax, 0x10 ; deksryptor danych (8 * 2 = 16 = 0x10)
  mov ss, ax
  mov ds, ax
  mov es, ax
  mov fs, ax
  mov gs, ax

  jmp 0x08:start32 ; uzywamy segmentu kodu z GDT

[BITS 32]
start32:
  jmp 0x08:0x10000

times 510-($-$$) db 0
db      55h
db      0AAh