Помогите исправить ошибки в коде.

Тема в разделе "WASM.OS.DEVEL", создана пользователем Zhelezka, 25 дек 2008.

  1. Zhelezka

    Zhelezka New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2008
    Сообщения:
    103
    Вот что у меня пока получилось.
    Но работает не всё
    После(находится в файле loader.asm):
    Код (Text):
    1. in al, 92h
    2. or al, 2
    3. out 92h, al
    Сообщение почему-то не выводится
    Код (Text):
    1. mov si, mess_3
    2. call p_loader_debug_mess
    Мне кажется что виновато не 92h, а вывод сообщения, но из-за этого я не могу проследить как выполняется моя ОС
    Пожалуйста, укажите и исправьте ошибки (если ошибка в выводе текста то скажите как его выводить правельнее).

    *Загрузчик загружает второй загрузчик(в расчёте на более долгую загрузку)
    *Переход в защищённый режим
    *Работа в защищённом режиме
    *Каждый шаг программы отображается на экране
    *Код находится в самой начальной стадии развития

    main.asm
    Код (Text):
    1. include 'boot.asm'
    2. times (512-2-($-7C00h)) db 0
    3. db 055h,0AAh
    4. include 'loader.asm'
    5. times (512-($-7E00h)) db 0
    6. include 'kernel.asm'
    boot.asm
    Код (Text):
    1. org 7c00h
    2. use16
    3.  
    4. mov ax, cs
    5. mov ds, ax
    6. mov es, ax
    7. mov ss, ax
    8. mov ax, 7fffh
    9. mov sp, ax
    10.  
    11. mov si, mess_boot
    12. call p_boot_debug_mess
    13.  
    14. mov dl, 0       ;drive number (A = 0)
    15. mov dh, 0       ;head
    16. mov ch, 0       ;cylinder
    17. mov cl, 2       ;sector
    18. mov ax, 0000h   ;segment
    19. mov es, ax      ;
    20. mov al, 2      ;sector count
    21. mov bx, 7E00h   ;offset
    22. mov ah, 2
    23. int 13h
    24.  
    25. mov si, mess_boot1
    26. call p_boot_debug_mess
    27.  
    28. jmp 7E00h
    29.  
    30. mess_boot db "[00:boot]  ", 0
    31. mess_boot1 db "[01:load loader]  ", 0
    32.  
    33. p_boot_debug_mess:
    34. xor ax,ax
    35. xor bx,bx
    36. @@:
    37. lodsb
    38. test al, al
    39. jz @F
    40. mov ah, 0Eh
    41. int 10h
    42. jmp short @B
    43. @@:
    44. xor ah,ah
    45. int 16h
    46. xor ax,ax
    47. xor bx,bx
    48. xor cx,cx
    49. xor dx,dx
    50. xor si,si
    51. ret
    loader.asm
    Код (Text):
    1. org 7E00h
    2. use16
    3.  
    4. jmp loader_start
    5. mess_1 db "[02:start loader]  ", 0
    6. mess_2 db "[03:out 20h;out 21h]  ", 0
    7. mess_3 db "[04:in\out 92h]  ", 0
    8. mess_4 db "[05:lgdt]  ", 0
    9. mess_5 db "[06:push 2;pop]  ", 0
    10. mess_7 db "[07:cr0]  [08:_protected]  ", 0
    11. mess_8 db "[09:es,ds,ss = 1000b]  ", 0
    12. mess_9 db "[0A:$=0]  ", 0
    13. mess_10 db "[0B:load kernel]  ", 0
    14. p_loader_debug_mess:
    15. xor ax,ax
    16. xor bx,bx
    17. @@:
    18. lodsb
    19. test al, al
    20. jz @F
    21. mov ah, 0Eh
    22. int 10h
    23. jmp short @B
    24. @@:
    25. xor ah,ah
    26. int 16h
    27. xor ax,ax
    28. xor bx,bx
    29. xor cx,cx
    30. xor dx,dx
    31. xor si,si
    32. ret
    33.  
    34. use32
    35. p_loader32_debug_mess:
    36. xor eax,eax
    37. xor ebx,ebx
    38. @@:
    39. lodsb
    40. test al, al
    41. jz @F
    42. mov ah, 0Eh
    43. int 10h
    44. jmp short @B
    45. @@:
    46. xor ah,ah
    47. int 16h
    48. xor eax,eax
    49. xor ebx,ebx
    50. xor ecx,ecx
    51. xor edx,edx
    52. xor esi,esi
    53. ret
    54.  
    55. use16
    56. loader_start:
    57.  
    58. mov si, mess_1
    59. call p_loader_debug_mess
    60.  
    61. use16
    62. mov al,00010001b
    63. out 20h,al
    64. mov al,20h
    65. out 21h,al
    66. mov al,00000100b
    67. out 21h,al
    68. mov al,00000001b
    69. out 21h,al
    70.  
    71. mov si, mess_2
    72. call p_loader_debug_mess
    73.  
    74. in al, 92h ;--------------------------------------------------------------------------------------
    75. or al, 2 ;-------------------------------------------?????----------------------------------------
    76. out 92h, al ;-------------------------------------------------------------------------------------
    77.  
    78. mov si, mess_3
    79. call p_loader_debug_mess
    80.  
    81. lgdt [gd_reg]
    82.  
    83. mov si, mess_4
    84. call p_loader_debug_mess
    85.  
    86. push 2
    87. popf
    88.  
    89. mov si, mess_5
    90. call p_loader_debug_mess
    91.  
    92. mov eax, cr0
    93. or al, 1
    94. mov cr0, eax
    95.  
    96. jmp 16:_protected
    97.  
    98.  
    99. use32
    100. _protected:
    101.  
    102. mov esi, mess_7
    103. call p_loader32_debug_mess
    104.  
    105. mov ax, 1000b
    106. mov es, ax
    107. mov ds, ax
    108. mov ss, ax
    109.  
    110. mov esi, mess_8
    111. call p_loader32_debug_mess
    112.  
    113. mov [$], byte 0
    114.  
    115. mov esi, mess_9
    116. call p_loader32_debug_mess
    117.  
    118. mov dl, 0       ;drive number (A = 0)
    119. mov dh, 0       ;head
    120. mov ch, 0       ;cylinder
    121. mov cl, 2       ;sector
    122. mov ax, 0000h   ;segment
    123. mov es, ax      ;
    124. mov al, 4      ;sector count
    125. mov bx, 1000h   ;offset
    126. mov ah, 2
    127. int 13h
    128.  
    129. mov esi, mess_10
    130. call p_loader32_debug_mess
    131.  
    132. xor eax, eax
    133. xor ecx, ecx
    134.  
    135. jmp 1000h
    136.  
    137. use16
    138.  
    139. gd_table:
    140. dw 0xFFFF,0x0000,0x9200,0x00CF
    141. dw 0xFFFF,0x0000,0x9A00,0x00CF
    142. db 0x67, 0,0,0,0 ,10001001b, 01000000b, 0
    143.  
    144. gd_reg:
    145. dw 255
    146. dd gd_table-8
    147.  
    148.  
    149. use32
    150.  
    151. jmp 1000h
    kernel.asm
    Код (Text):
    1. org 1000h
    2. use32
    3.  
    4. jmp kernel_start
    5.  
    6. mess_loading   db "[0C:start kernel]  ", 0
    7.  
    8. kernel_start:
    9.  
    10. mov esi, mess_loading
    11. call p_kernel_debug_mess
    12.  
    13. cli
    14. hlt
    15. jmp short $
    16.  
    17. p_kernel_debug_mess:
    18. xor eax,eax
    19. xor ebx,ebx
    20. @@:
    21. lodsb
    22. test al, al
    23. jz @F
    24. mov ah, 0Eh
    25. int 10h
    26. jmp short @B
    27. @@:
    28. xor ah,ah
    29. int 16h
    30. xor eax,eax
    31. xor ebx,ebx
    32. xor ecx,ecx
    33. xor edx,edx
    34. xor esi,esi
    35. ret
     
  2. researcher

    researcher New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2005
    Сообщения:
    45
    Адрес:
    Russia
    Предположу, что это из-за того, что при использовании порта 92h (порт из пространства PS/2) для открытия линии A20 иногда возникают проблемы с видео.
    Подробности способов включения линии A20 уже обсуждались http://www.wasm.ru/forum/viewtopic.php?id=9801
    Классический способ включения A20, через контроллер клавиатуры I8042 приведен далее
    Код (Text):
    1. call delay
    2. mov al,0D1h
    3. out 64h,al ;команда управление линией A20
    4. call delay
    5. mov al,0DFh ;разрешаем работу линии
    6. out 60h,al
    7. call delay
    8. .
    9. .
    10. .
    11. delay proc
    12. push cx
    13. xor cx,cx
    14. dec cx
    15. m:
    16. in al,64h
    17. test al,10b ;буфер контроллера клавы свободен?
    18. loopnz m
    19. pop cx
    20. ret
    21. delay endp
    Попробуй его, не заработает будем дальше смотреть:derisive:
     
  3. Clear_Energy

    Clear_Energy Алексей

    Публикаций:
    0
    Регистрация:
    3 ноя 2008
    Сообщения:
    375
    Я сам когда-то пробовал писать ось... Сходи на форум на osdev.ru там многое подскажут.
     
  4. Zhelezka

    Zhelezka New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2008
    Сообщения:
    103
    А можно-ли вывести символ на экран просто записав его в оперативную память.
    Например:
    Код (Text):
    1. mov word [0B800h], 1F01h
    Если да, то как узнать адрес куда надо записывать.
    Если нет, то как вывести символ на экран, не использовав биос.

    *Добавлено: Как это делать в реальном и в защищённом режиме?
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Для отладки таких вещей очень помогает Bochs (http://bochs.sf.net , который раз я этй ссылку привожу :) ).

    В видеопамять можно писать напрямую по адресу 0xB8000. В 16битном режиме это делается так:

    push es
    mov ax, 0xB800
    mov es, ax
    mov al, 'A'
    mov ah, 0x7
    mov [es:0x0], ax
    pop es

    этот код выводит символ 'A' белого цвета на черном фоне. В защищенном режиме то же самое, разве что адресовать 0xB8000 будет немного проще:

    mov al, 'A'
    mov ah, 0x7
    mov [0xB8000], ax