Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.25 KB | None | 0 0
  1. [bits 16]
  2. [org 0x7c00]
  3.  
  4. jmp 0:kernel_start
  5.  
  6. gdt_start:
  7.  
  8. gdt_null:
  9. dd 0x0
  10. dd 0x0
  11.  
  12. gdt_code:
  13. dw 0xffff
  14. dw 0x0
  15. db 0x0
  16. db 10011010b
  17. db 11001111b
  18. db 0x0
  19.  
  20. gdt_data:
  21. dw 0xffff
  22. dw 0x0
  23. db 0x0
  24. db 10010010b
  25. db 11001111b
  26. db 0x0
  27.  
  28. gdt16_code:
  29. ; 16-bit 4gb flat r/w/executable code descriptor
  30. dw 0xFFFF ; limit low
  31. dw 0 ; base low
  32. db 0 ; base middle
  33. db 10011010b ; access
  34. db 10001111b ; granularity
  35. db 0 ; base high
  36.  
  37. gdt16_data:
  38. ; 16-bit 4gb flat r/w data descriptor
  39. dw 0xFFFF ; limit low
  40. dw 0 ; base low
  41. db 0 ; base middle
  42. db 10010010b ; access
  43. db 10001111b ; granularity
  44. db 0 ; base high
  45.  
  46. gdt_end:
  47.  
  48. gdt_descriptor:
  49. dw gdt_end - gdt_start - 1
  50. dd gdt_start
  51.  
  52. CODE_SEG equ gdt_code - gdt_start
  53. DATA_SEG equ gdt_data - gdt_start
  54. DATASEL16 equ gdt16_data - gdt_start
  55. CODESEL16 equ gdt16_code - gdt_start
  56.  
  57. print:
  58. pusha
  59. mov ah, 14
  60. mov bh, 0
  61. .loop:
  62. lodsb
  63. cmp al, 0
  64. je .done
  65. int 0x10
  66. jmp .loop
  67. .done:
  68. popa
  69. ret
  70.  
  71. modo16 db 'hello modo real ', 0
  72. modo162 db '///// voltou modo real', 0
  73. modo32 db 'hello modo protegido', 0
  74.  
  75. kernel_start:
  76. mov ax, 0
  77. mov ss, ax
  78. mov sp, 0xFFFC
  79.  
  80. mov ax, 0
  81. mov ds, ax
  82. mov es, ax
  83. mov fs, ax
  84. mov gs, ax
  85.  
  86. mov si, modo16
  87. call print
  88.  
  89. cli
  90. lgdt[gdt_descriptor]
  91. mov eax, cr0
  92. or eax, 0x1
  93. mov cr0, eax
  94. jmp CODE_SEG:b32
  95.  
  96. idt_real:
  97. dw 0x3ff ; 256 entries, 4b each = 1K
  98. dd 0 ; Real Mode IVT @ 0x0000
  99.  
  100. savcr0:
  101. dd 0 ; Storage location for pmode CR0.
  102.  
  103. Entry16:
  104. ; We are already in 16-bit mode here!
  105.  
  106. cli ; Disable interrupts.
  107.  
  108. ; Need 16-bit Protected Mode GDT entries!
  109. mov eax, DATASEL16 ; 16-bit Protected Mode data selector.
  110. mov ds, eax
  111. mov es, eax
  112. mov fs, eax
  113. mov gs, eax
  114. mov ss, eax
  115.  
  116.  
  117. ; Disable paging (we need everything to be 1:1 mapped).
  118. mov eax, cr0
  119. mov [savcr0], eax ; save pmode CR0
  120. and eax, 0x7FFFFFFe ; Disable paging bit & disable 16-bit pmode.
  121. mov cr0, eax
  122.  
  123. jmp 0:GoRMode ; Perform Far jump to set CS.
  124.  
  125. GoRMode:
  126. mov sp, 0x8000 ; pick a stack pointer.
  127. mov ax, 0 ; Reset segment registers to 0.
  128. mov ds, ax
  129. mov es, ax
  130. mov fs, ax
  131. mov gs, ax
  132. mov ss, ax
  133. lidt [idt_real]
  134. sti ; Restore interrupts -- be careful, unhandled int's will kill it.
  135. jmp kernel_end
  136.  
  137. kernel_end:
  138. mov si, modo162
  139. call print
  140.  
  141. jmp $
  142.  
  143. [bits 32]
  144.  
  145. VIDEO_MEMORY equ 0x0B85A0
  146. WHITE_ON_BLACK equ 0x0f
  147.  
  148. print32:
  149. pusha
  150. mov edx, VIDEO_MEMORY
  151. .loop:
  152. mov al, [ebx]
  153. mov ah, WHITE_ON_BLACK
  154. cmp al, 0
  155. je .done
  156. mov [edx], ax
  157. add ebx, 1
  158. add edx, 2
  159. jmp .loop
  160. .done:
  161. popa
  162. ret
  163.  
  164. b32:
  165. mov ax, DATA_SEG
  166. mov ds, ax
  167. mov es, ax
  168. mov fs, ax
  169. mov gs, ax
  170. mov ss, ax
  171.  
  172. mov ebp, 0x2000
  173. mov esp, ebp
  174.  
  175. mov ebx, modo32
  176. call print32
  177.  
  178. jmp CODESEL16:Entry16
  179.  
  180. [SECTION signature start=0x7dfe]
  181. dw 0AA55h
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement