загрузчик

Тема в разделе "WASM.OS.DEVEL", создана пользователем XshStasX, 27 фев 2011.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Код загрузчика в bochs строки правильно выводит, а вот в VWWare или при загрузке реального компа строки не выводятся...(

    Код (Text):
    1. format binary
    2. use16
    3. SECTOR_SIZE    = 200h
    4. BIOS_LOAD_ADDR = 7C00h
    5. MY_LOAD_ADDR  = BIOS_LOAD_ADDR + SECTOR_SIZE
    6. BUFFER_ADDR   = MY_LOAD_ADDR + SECTOR_SIZE
    7.  
    8. struc ExtDisk  number_sector,start_sector
    9. {
    10.     .size DB 10h
    11.     .reserve0 DB 0
    12.     .number_sector  DB ?
    13.     .reserve1       db 0
    14.     .buf_seg        DW ?
    15.     .buf_off        DW ?
    16.     .start_sector   dq 0
    17. };
    18.  
    19. ORG  MY_LOAD_ADDR
    20.  
    21. macro COPY_MEM from,to,count
    22. {
    23.     cld
    24.     mov cx,count
    25.     mov  si,from
    26.     mov  di,to 
    27.     rep movsb       ;   Move byte at address DS:(E)SI to address ES:(E)DI
    28. };
    29.  
    30.  COPY_MEM   BIOS_LOAD_ADDR,MY_LOAD_ADDR,SECTOR_SIZE
    31.  
    32.  
    33. jmp @main
    34.  
    35.    
    36. @main:
    37.  
    38. xor ax,ax
    39. mov es,ax
    40. mov sp,BIOS_LOAD_ADDR
    41. int 10h
    42.  
    43. mov bl,31
    44.  mov cx,7
    45.  mov bp,STR_ENTER
    46.  mov dh,10
    47.  mov dl,0
    48.  mov al,1
    49.  mov ah,13h
    50.  int 10h
    51.  
    52.  xor ax,ax
    53.  int 16h
    54.  sub al,'0'
    55.  
    56. mov [DEP.size],10h
    57. mov [DEP.number_sector],1
    58. mov [DEP.buf_seg],0
    59. mov [DEP.buf_off],BIOS_LOAD_ADDR
    60.  
    61. add al,80h
    62. mov ah,42h
    63. mov dl,al
    64. mov si,DEP
    65. int 13h
    66.  
    67. jc @ERROR_READ
    68.  mov bl,31
    69.  mov cx,2
    70.  mov bp,STR_OK
    71.  mov dh,11
    72.  mov dl,0
    73.  mov al,1
    74.  mov ah,13h
    75.  int 10h
    76.  
    77. jmp @loop_
    78.  
    79. @ERROR_READ:
    80.  
    81.  mov bl,31
    82.  mov cx,15
    83.  mov bp,STR_ERROR
    84.  mov dh,11
    85.  mov dl,0
    86.  mov al,1
    87.  mov ah,13h
    88.  int 10h
    89.  
    90. @loop_:
    91.  
    92.  nop
    93. jmp @loop_
    94.  
    95. DEP ExtDisk
    96. STR_OK    db 'OK'
    97. STR_ENTER db 'ENTER: '
    98. STR_ERROR db 'ERROR READ DISK'
     
  2. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Сочувствую.
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    хотя нетбук грузиться, образ на флешку сброшен(перезаписаны первые 200байт).
    А настольный ПК хоть и показывает что из флешки можно загрузиться, но в итоге просто серый екран...
     
  4. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Я к тому, что по приведенному коду трудно понять, в чем проблема. Хотя, возможно, виноват движок форума, обрезающий самое главное. Я с мобильника.
     
  5. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    В общем как оказалось проблема в том что я переносил первый сектор на адрес 0х7Е00.
    Хотя странно bochs нормально это воспринимает..
     
  6. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Если я правильно понимаю, то проблема может быть связана с отсутствием дальнего перехода или инициализации стека.
     
  7. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Phantom_84
    стек настроен: mov sp,0x7C00
    управление передаю на код jmp far 0000h:@main
    bochs - это нормально воспринимает, VMWare пишет нет ОС.
    нетбук перезагружаеться.
    если сделать так: jmp @main
    то нетбук грузит, только строки текста не выводит.
    точнее выводит но так текста не видно(только установленный фон букв видно,по нем и сужу о логике программы)...
     
  8. JucED

    JucED New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    23
    попробуй вместо этого воттак сделать:
    mov ax,7c00h
    mov es,ax
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Код (Text):
    1. mov ax,7c00h
    2. mov es,ax
    Так делать не надо.

    Я извиняюсь за вчерашнее. Я видел код только до jmp @main включительно. Однако оба мои замечания остаются в силе. Стек нужно инициализировать в самом начале и естественно при этом устанавливать не только sp, но и ss. Вместо jmp @main нужно использовать jmp 0:@main.

    также не понятен вот этот фрагмент.
    Код (Text):
    1. xor ax,ax
    2. ...
    3. int 10h
    Это что установка видеорежима 0? Обычно используют видеорежим 3.
    Код (Text):
    1.   mov ax,3
    2.   int 10h
    Дальше пока не смотрел.
     
  10. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Phantom_84
    Код (Text):
    1. xor ax,ax
    2. ...
    3. int 10h
    да это видео режим, мне все равно какой именно, главное чтоб строки выводил.

    про ss забыл.
    jmp 0:@main вот это попробую.
     
  11. JucED

    JucED New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    23
    А может быть bl настроить на нужную страницу? По идее там 0 ноль должен быть у тебя, но малоли может post не очистил....
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Сегментные регистры не помешало бы заполнить, разные системы по-разному заполняют при передаче управления загрузоному сектору. Я про ds/ss

    Кстати, твоё копирование в 7е00 бесполезно, потому что у тебя в начале стоит org 0x7e00
    jmp @main / @main: будет скомпилировано всегда в EB 00, а ты, вероятно, хотел передать управление в @main+200h
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    +1

    Данные-то из копии будут выбираться нормально, но только до того момента, пока он не попытается "поверх себя" загрузить новые данные с диска.

    jmp 0:@main исправляет ситуацию. Кстати я его предложил не для того, чтобы исправить эту глупую ситуацию, а потому что для актуализации кода в памяти перед передачей управления этому коду необходимо сделать хотя бы один дальний переход.
     
  14. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Нужно сделать как-то так:
    Код (Text):
    1. org 7C00h
    2. ...
    3. jmp 0:@main
    4.  
    5. org 7E00h+($-$$)
    6. @main:
    7. ...
    8. rb 7FFEh-$
    9. dw 0AA55h
    Можно даже лишнее не копировать.
     
  15. TXID

    TXID New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    6
    Код (Text):
    1. org 07C00h      ; смещение по которому программа загрузится в память 00000:07C00h
    2. jmp Begin   ; прыжок на начало кода
    3. nop
    4.  
    5. ;================== BPB sector ================
    6. db 'bootsect'
    7. SectSize dw 00200h
    8. ClustSize db 001h
    9. ResSecs dw 00001h
    10. FatCnt db 002h
    11. RootSz dw 000E0h
    12. TotSecs dw 00B40h
    13. Media db 0F0h
    14. FatSz dw 00009h
    15. TrkSecs dw 00012h
    16. HeadCnt dw 00002h
    17. HidnSec dw 00000h
    18. ;======================================================================
    19.  
    20. Begin:
    21.        
    22.         cli
    23.         xor cx, cx
    24.         mov ax,cx
    25.         mov ds,ax
    26.         mov es,ax
    27.         mov ss,ax
    28.         mov sp,07C00h
    29.         sti
    30.        
    31.         call GetCursorPos
    32.                                
    33.         mov bp, msg             ; Loading
    34.         mov cx, 12
    35.         call print
    36.  
    37.         call Turn_Off
    38.  
    39.  
    40.  
    41. ;===================== Подпрограммы ===================================
    42. ;----------------------------------
    43.     GetCursorPos:
    44.         mov ah,3h
    45.                       xor bh,bh
    46.                       int 10h
    47.         ret
    48. ;----------------------------------
    49.     print:
    50.         mov bl,7
    51.         mov ax,0x1301
    52.         int 10h
    53.         ret
    54. ;----------------------------------
    55.     Turn_Off:
    56.         mov ax,5301h
    57.                       sub bx,bx
    58.                       int 15h
    59.                       jb stop
    60.                       mov ax,530eh
    61.                       sub bx,bx
    62.                       int 15h
    63.                       jb stop
    64.                       mov ax,5307h
    65.                       mov bx,0001h
    66.                       mov cx,0003h
    67.                       int 15h
    68.        stop:
    69.                ret
    70.  
    71. ;----------------- data -----------------
    72. msg db 'Loading... ',0x00
    73. times(512-2-($-07C00h)) db 0                    ; заполняем остальную часть нулями
    74. db 55h,0AAh
    У меня вот такой код получился. Работаю в VirtualBox. Все работает.