gdt.asm 1.0 KB

1234567891011121314151617181920212223242526272829303132333435
  1. gdt_start: ; don't remove the labels, they're needed to compute sizes and jumps
  2. ; the GDT starts with a null 8-byte
  3. dd 0x0 ; 4 byte
  4. dd 0x0 ; 4 byte
  5. ; GDT for code segment. base = 0x00000000, length = 0xfffff
  6. ; for flags, refer to os-dev.pdf document, page 36
  7. gdt_code:
  8. dw 0xffff ; segment length, bits 0-15
  9. dw 0x0 ; segment base, bits 0-15
  10. db 0x0 ; segment base, bits 16-23
  11. db 10011010b ; flags (8 bits)
  12. db 11001111b ; flags (4 bits) + segment length, bits 16-19
  13. db 0x0 ; segment base, bits 24-31
  14. ; GDT for data segment. base and length identical to code segment
  15. ; some flags changed, again, refer to os-dev.pdf
  16. gdt_data:
  17. dw 0xffff
  18. dw 0x0
  19. db 0x0
  20. db 10010010b
  21. db 11001111b
  22. db 0x0
  23. gdt_end:
  24. ; GDT descriptor
  25. gdt_descriptor:
  26. dw gdt_end - gdt_start - 1 ; size (16 bit), always one less of its true size
  27. dd gdt_start ; address (32 bit)
  28. ; define some constants for later use
  29. CODE_SEG equ gdt_code - gdt_start
  30. DATA_SEG equ gdt_data - gdt_start