Помогите с загрузочным сектором

Тема в разделе "WASM.ASSEMBLER", создана пользователем Loginanton, 17 июн 2008.

  1. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    а есть возможность отладки в виртуальных машинах ПО, записанного в ROM extension?
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    shoo
    А чем отладка любого кода отличается от ROM extension?
    В Bochs можно свой биос записать.
     
  3. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    я просто никогда не занимался этим серьезно, меня как раз и заинтересовало: есть ли возможность подключать в эмуляторах дополнительные образы пзу (желательно не вмешиваясь в основное), а затем его отлаживать.
     
  4. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Видимо это тоже самое, на что дал ссылку Pavia: EDDspec30.pdf
     
  5. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Ох! Ты!
    Кстати, где-то у меня есть статья про то как BIOS можно изменить!
    Найду, если, то ссылочку кину! Я внимание обратил, что Bochs начинает трассировать не с 7c00h, а с какого-то другого адреса - наверное, это BIOS...
    Вот и BIOS, по идее, можно поотлаживать и поизменять!

    Никто графический интерфейс BFE к Bochs не пробывал подключать?
    Кстати, а FASM очень даже ничего! Мне нравится!

    Отлаживать вроде бы получается, сейчас вот что попробую:
    Если эта штучка получится - значит считай загрузчик уже написан!
    Кстати:
    Phantom_84
    Pavia
    Спасибо за ссылочки! Обязательно посмотрю!
    Пока тут с Bochs-debugger'ом упражняюсь... и с FASM'ом...
    Кстати, вот вопрос:
    Код (Text):
    1.     if ax==0
    2.         mov cx,count
    3.         rep movsb
    4.     end if
    Почему-то такой код в FASM ошибку даёт... Хотя, вроде в FASM_manual есть такие примеры, где это используется:
    А хочется как в MASM сделать так:
    Код (Text):
    1. .if eax==0h
    2. ...
    3. ...
    4. .endif
     
  6. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Мда, что-то пока ничего не получается с чтением секторов...
    Вот, что в bochs-log:
    00035730690i[BIOS ] Booting from 0000:7c00
    00035734649i[BIOS ] int13_diskette: unsupported AH=41
    00035737466i[BIOS ] int13_diskette: unsupported AH=42
    00035737560i[CPU0 ] WARNING: HLT instruction with IF=0!


    Вот код а FASM, который я отлаживаю в Bochs:
    Код (Text):
    1. org 0x7C00
    2.  
    3. start:
    4.  
    5. cli
    6. mov ax, cs
    7. mov ds, ax
    8. mov ss, ax
    9. mov sp, start
    10. sti
    11.  
    12.  
    13. mov ax,0201h
    14. push 50h
    15. pop es
    16. xor bx,bx
    17. mov cx,1h
    18. mov dh,0h
    19. mov dl,80h
    20. int 13h
    21.  
    22.  
    23. mov ax,4100h
    24. mov bx,55AAh
    25. mov dx,2h
    26. int 13h
    27.  
    28. jmp over_lba
    29.  
    30. lba:
    31. db 16h ;struct size
    32. db 0 ;0
    33. db 2 ;sectors
    34. db 0 ;0
    35. dd 500000h ;seg:offset
    36. dd 1 ;LBA address!
    37. over_lba:
    38. mov ax,4200h
    39. mov dx,2h ;disk C
    40. xor si,si
    41. lea si,[lba]
    42. int 13h
    43.  
    44.  
    45. cli
    46. hlt
    47. jmp short $
    Вот это читает сектор:
    Код (Text):
    1. mov ax,0201h
    2. push 50h
    3. pop es
    4. xor bx,bx
    5. mov cx,1h
    6. mov dh,0h
    7. mov dl,80h
    8. int 13h
    А функция 42 (EDD) вообще не поддерживается!
    То есть LBA для данного BIOS не поддерживается получается...
    То есть VGABIOS-lgpl-latest не подходит?
    Поддерживается или не поддерживается EDD это от BIOS'а зависит?
    Кажется, придётся повозиться...

    Посмотрел ссылки:
    http://www.msc-ge.com/download/pc-system/ipc-produkte/isa96at96/BIOS%20Programmers%20Guide%20v10.pdf - ссылка битая!
    http://www.t13.org/Documents/UploadedDocuments/Project/d1386r5-EDD.pdf - смотрел!
    http://www.phoenix.com/NR/rdonlyres/19FEBD17-DB40-413C-A0B1-1F3F560E222F/0/specsedd30.pdf - смотрел!
    http://www.phoenix.com/NR/rdonlyres/5AF5C50D-9E06-4298-9E58-E52BFFCC8D7D/0/userman.pdf - смотрел!
    http://www.phoenix.com/en/Customer+Services/White+Papers-Specs/PC+Industry+Specifications.htm - тоже смотрел!

    userman.pdf - это где какие настройки в BIOS'е... полезно, но с EDD не поможет.
    specsedd30.pdf и d1386r5-EDD.pdf по сути тоже самое, что и та статья - http://hdpt.page.by/int13.html, но только не по-русски.
     
  7. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Meatcoins
    Дискета и не должна поддерживать 42. Вот диски те могут. Поддержку нужно проверять для каждого устройства в отдельности.
    Для дискет int 13h ax,2 для дисков до определенного размера int 13h ax,2 после уже int 13h ax,42

    int 13h ax,2 имеет ограничения 256 -головок ;1024- дорожек; 63-секторора на дороже и 512 байт в секторе
    256*1024*63*512=8 455 716 864=7,875 ГБ Если нужно получить доступ к большим дискам то тут только int 13h ax,42
     
  8. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Pavia
    Погоди-погоди, а я для чего проверяю?
    Код (Text):
    1. mov ax,4100h
    2. mov bx,55AAh
    3. mov dx,2h
    4. int 13h
    0 - A
    1 - B
    2 - C
    Я для диска C проверяю!

    А всё понял! Косяк!
    Ну, да исправил!
    Для жёстких дисков в DL бит 7 должен быть установлен, поэтому диск C - это 80h, а не 2h и не 42h!
    Вот как получается:
    Код (Text):
    1. mov ax,4100h
    2. mov bx,55AAh
    3. mov dx,80h
    4. int 13h
    CF - 0h
    cx - 7h




    Оппа!
    Ну, думаю, скоро получится:
    00035730690i[BIOS ] Booting from 0000:7c00
    00035734520i[BIOS ] int13_harddisk: function 42. LBA out of range
    Код (Text):
    1. jmp over_lba
    2.  
    3. lba:
    4. db 16h ;struct size
    5. db 0 ;0
    6. db 2 ;sectors
    7. db 0 ;0
    8. dd 500000h ;seg:offset
    9. dd 1 ;LBA address!
    10. over_lba:
    11. ;mov ax,cs
    12. ;mov [lba+4h],ax
    13. ;mov ax,7d00h
    14. ;mov [lba+6h],ax
    15. ;xor ax,ax
    16. mov ax,4200h
    17. mov dx,80h ;disk C
    18. xor si,si
    19. lea si,[lba]
    20. int 13h
    21.  
    22.  
    23. cli
    24. hlt
    25. jmp short $
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Meatcoins
    И еще если ты загрузился с диска, то этот диск будет имеет 80h. Дискета 0h.
    Flash и CD-ROM как выберешь. Либы 0 эмуляция дискетылибы 80h эмуляция диска.

    В любом случии код диска с которого загрузился будет лежать в DL при загруке.
     
  10. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Всё!
    Работает!
    Вот так правильно:
    Код (Text):
    1. jmp over_lba ;LBA в сегменте cs
    2.  
    3. lba:
    4. db 10h ;struct size
    5. db 0 ;0
    6. db 2 ;sectors
    7. db 0 ;0
    8. dd 500000h ;seg:offset
    9. dq 0 ;LBA address!
    10. over_lba:
    11.  
    12. mov ax,4200h
    13. mov dx,80h ;disk C
    14. xor si,si
    15. lea si,[lba]
    16. int 13h
    После устранения нескольких косяков всё заработало!
    Этот код читает 2 сектора: самый первый, где загрузчик и следующий в память по линейному адресу 0x500h!

    Pavia
    Спасибо за on-line поддержку!!!
     
  11. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Самый распространенный в прошлом бут-сектор, исходники :)
     
  12. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    С этим сегодня целый день занимаюсь!
    В 3-х командах заблудился!
    В начале я в 0x0 затёр и долго не мог понять почему у меня прерывания не работают, а вот теперь не понимаю вот это:
    ;Если это раскоментировать, то символы выводятся на экран!!!
    ;lea si,[msg+(7c00h-400h)]
    ;call kputs
    ;А в этом месте символы не выводятся на экран!!!
    mov si,msg
    call kputs
    Хотя происходит одно и тоже!
    Просто один участок кода расположен в 0x7c00, а другой в 0x400!
    Почему? Не понятно!

    Код (Text):
    1. include "/FASM/INCLUDE/MACRO/IF.inc"
    2. include "/FASM/INCLUDE/MACRO/PROC16.INC"
    3. include "/FASM/INCLUDE/MACRO/STRUCT.INC"
    4.  
    5. macro invokew proc,[arg]                 ; indirectly call STDCALL procedure
    6.  { common
    7.     if ~ arg eq
    8.    reverse
    9.      pushw arg
    10.    common
    11.     end if
    12.     call word [proc] }
    13.  
    14.  
    15. macro read_sectors disk,lba
    16. {
    17. mov ax,4200h
    18. mov dx,disk ;disk C
    19. xor si,si
    20. lea si,lba
    21. int 13h
    22. }
    23.  
    24.  
    25. use16
    26. org 400h
    27.  
    28. struct LBA_STRUCT
    29. struct_size db ?
    30. reserv1 db ?
    31. sectors db ?
    32. reserv2 db ?
    33. offset dd ?
    34. lba_address dq ?
    35. ends
    36.  
    37.  
    38. start:
    39. cli
    40. mov ax, cs
    41. mov ds, ax
    42. mov ss, ax
    43. mov es, ax
    44. mov sp, start
    45. sti
    46.  
    47.  
    48. ;Если это раскоментировать, то символы выводятся на экран!!!
    49. ;lea si,[msg+(7c00h-400h)]
    50. ;call kputs
    51.  
    52.  
    53.  
    54.  
    55.  
    56. ;Перепишем код в начало памяти после таблицы векторов прерываний!
    57. xor ax,ax
    58. mov es,ax
    59. mov si,7C00h
    60. mov di,400h
    61. mov cx,128
    62. rep movsd
    63. nop
    64. nop
    65. nop
    66. jmp 0h:go
    67.  
    68.  
    69.  
    70. go:
    71. cli
    72. xor ax,ax
    73. mov ds,ax
    74. mov es,ax
    75. mov ax,800h
    76. mov sp,ax
    77. mov bp,ax
    78. mov ax,900h
    79. mov ss,ax
    80. sti
    81.  
    82.  
    83. ;А в этом месте символы не выводятся на экран!!!
    84. mov si,msg
    85. call kputs
    86.  
    87.  
    88. ;read_sectors 80h,[lba]
    89.  
    90.  
    91. cli
    92. hlt
    93. jmp short $
    94.  
    95.  
    96. proc some_proc
    97.  locals
    98.     hDC dd ?
    99.     rc dd ?
    100.   endl
    101. xor ax,ax
    102. ret
    103. endp
    104.  
    105. proc kputs
    106. .loop:
    107. lodsb
    108. test al, al
    109. jz quit
    110. mov ah, 0x0E
    111. int 0x10
    112. jmp short .loop
    113. quit:
    114. ret
    115. endp
    116.  
    117.  
    118.  
    119.  
    120.  
    121.  
    122. lba LBA_STRUCT 10h,0h,2h,0h,400000h,0h
    123. msg: db "Hello from the world of real programming!",0x0A,0x0D,"Hellow World!!!",0
    124. clear_symbol: db " ",0h
    125. times 510-($-$$) db 0
    126. db 0x55, 0xAA
     
  13. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Обнаружил очень странную вещь:

    Если в проге написать вот так:
    Код (Text):
    1. ....
    2. ....
    3. ABS_OFFSET equ 1000h
    4.  
    5. use16
    6. org ABS_OFFSET
    7. ....
    8. ....
    То я вижу 4 надписи Hello from the world of real programming!
    А если написать вот так:
    Код (Text):
    1. ....
    2. ....
    3. ABS_OFFSET equ 400h
    4.  
    5. use16
    6. org ABS_OFFSET
    7. ....
    8. ....
    То я вижу только одну Hello from the world of real programming!

    А почему? Так и непонятно!
    Вчера думал над этим и сегодня, но получилось экспериментально...
    Вроде бы все правильно и при ABS_OFFSET equ 400h, но почему-то на экран ничего не выводится! Ничего важного в памяти я, вроде бы, не стираю - ведь всё, что есть важного находится с 0x0 по 0x400 - это таблица векторов прерываний. Если я сразу после неё воткну свой код, то ничего страшного по идее быть не должно, но почему-то на экран ничего не выводится...
    Короче, говоря непонятно почему!


    Код (Text):
    1. include "/FASM/INCLUDE/MACRO/IF.inc"
    2. include "/FASM/INCLUDE/MACRO/PROC16.INC"
    3. include "/FASM/INCLUDE/MACRO/STRUCT.INC"
    4.  
    5. macro invokew proc,[arg]                 ; indirectly call STDCALL procedure
    6.  { common
    7.     if ~ arg eq
    8.    reverse
    9.      pushw arg
    10.    common
    11.     end if
    12.     call word [proc] }
    13.  
    14.  
    15. macro read_sectors disk,lba
    16. {
    17. mov ax,4200h
    18. mov dx,disk ;disk C
    19. xor si,si
    20. mov si,lba
    21. int 13h
    22. }
    23.  
    24.  
    25. ABS_OFFSET equ 1000h
    26.  
    27. use16
    28. org ABS_OFFSET
    29.  
    30. struct LBA_STRUCT
    31. struct_size db ?
    32. reserv1 db ?
    33. sectors db ?
    34. reserv2 db ?
    35. offset dd ?
    36. lba_address dq ?
    37. ends
    38.  
    39.  
    40. start:
    41. cli
    42. mov ax, cs
    43. mov ds, ax
    44. mov ss, ax
    45. mov es, ax
    46. mov sp, start
    47. sti
    48.  
    49.  
    50. lea si,[msg+(7c00h-ABS_OFFSET)]
    51. call kputs
    52.  
    53. ;cli
    54. ;hlt
    55. ;jmp short $
    56.  
    57.  
    58. ;Перепишем код в начало памяти после таблицы векторов прерываний!
    59. xor ax,ax
    60. mov es,ax
    61. mov si,7C00h
    62. mov di,ABS_OFFSET
    63. mov cx,128
    64. rep movsd
    65. nop
    66. nop
    67. nop
    68. jmp 0h:go
    69.  
    70.  
    71.  
    72. go:
    73. cli
    74. xor ax,ax
    75. mov ds,ax
    76. mov es,ax
    77. mov ax,800h
    78. mov sp,ax
    79. mov bp,ax
    80. mov ax,900h
    81. mov ss,ax
    82. sti
    83.  
    84.  
    85.  
    86. mov si,msg
    87. call kputs
    88. mov si,msg
    89. call kputs
    90. mov si,msg
    91. call kputs
    92.  
    93. ;read_sectors 80h,lba
    94.  
    95.  
    96. cli
    97. hlt
    98. jmp short $
    99.  
    100.  
    101. proc some_proc
    102.  locals
    103.     hDC dd ?
    104.     rc dd ?
    105.   endl
    106. xor ax,ax
    107. ret
    108. endp
    109.  
    110. proc kputs
    111. .loop:
    112. lodsb
    113. test al, al
    114. jz quit
    115. mov ah, 0x0E
    116. int 0x10
    117. jmp short .loop
    118. quit:
    119. ret
    120. endp
    121.  
    122.  
    123.  
    124.  
    125.  
    126.  
    127. lba LBA_STRUCT 10h,0h,2h,0h,400000h,0h
    128. msg: db "Hello from the world of real programming!",0x0A,0x0D,0
    129. clear_symbol: db " ",0h
    130. times 510-($-$$) db 0
    131. db 0x55, 0xAA
     
  14. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    А с 0x400 по 0x500 находятся важные данные BIOS, которые тоже стирать нельзя, если нужно обращаться к функциям BIOS.
     
  15. Argogo

    Argogo New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2008
    Сообщения:
    5
    Адрес:
    Республика Крым
    И ходят слухи, что по адресу 0х501 тоже что-то находится, видно незря загрузчики MS-DOS 6.22 и 7.10 (другие не смотрел) оккупирует память с адреса 0x600.
     
  16. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Ходят, но лично я использовал память начиная с 0x500 без каких-либо проблем. А на MS в этом случае вообще сложно ровняться, потому что они могли использовать адрес 0x600 "от балды", например, исключительно для выравнивания на 512-байтовую границу. По адресу 0x500 находится т.н. print-screen status, но не факт, что эта переменная относится к BIOS, а например не к той же MS-DOS.
     
  17. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Перешёл в защищённый режим!
    Но хочется попользоваться прерываниями BIOS'а!
    По идее можно взять из таблицы векторов прерываний смещение и сегмент, преобразовать их в линейный адрес и сделать call edi, например.
    Но вот проблема:
    FFD7 - это код команды call edi.
    И оказывается, что:
    FFD7 - это код команды call di.
    Прочитать значения таблицы векторов прерываний нет проблем, а сделать call по этому адресу почему-то не получается!
    Часть программули:
    Код (Text):
    1. org ABS_OFFSET+200h
    2.  
    3. ;Âõîäèì â çàùèù¸ííûé ðåæèì!
    4.  
    5. OFF equ 2000h-ABS_OFFSET-200h
    6.  
    7. /*
    8. mov al,00010001b
    9. out 20h,al
    10. mov al,20h
    11. out 21h,al
    12. mov al,00000100b
    13. out 21h,al
    14. mov al,00000001b
    15. out 21h,al
    16. */
    17.  
    18. cli
    19. lgdt [gdt_reg+OFF]
    20.  
    21. in al,92h
    22. or al,2h
    23. out 92h,al
    24.  
    25. mov eax,cr0
    26. or al,1h
    27. mov cr0,eax
    28.  
    29. jmp 8h:PM+OFF
    30.  
    31. use32
    32. PM:
    33. mov ax,10h
    34. mov ds,ax
    35. mov es,ax
    36. mov ss,ax
    37. sti
    38.  
    39.  
    40. call edi
    41. jmp 18h:UnM+OFF
    42.  
    43.  
    44.  
    45. use16
    46. UnM:
    47.  
    48.  
    49. mov si,msg
    50. call PM_kputs
    51.  
    52.  
    53.  
    54.  
    55. cli
    56. hlt
    57. jmp short $
    58.  
    59. proc PM_kputs
    60. .loop:
    61. lodsb
    62. test al, al
    63. jz .quit
    64. mov ah, 0x0E
    65. push esi
    66. push edi
    67. xor esi,esi
    68. xor edi,edi
    69. mov si,[10h*4]
    70. mov di,[10h*4+2h]
    71. ;shl edi,4h
    72. ;add edi,esi
    73. ;mov es,di
    74. ;jmp eax  ;Копмпилируется почему-то как jmp ax!
    75.  
    76. use32
    77. call edi ;Копмпилируется почему-то как jmp di!
    78. use16
    79.  
    80.  
    81. pop edi
    82. pop esi
    83. jmp short .loop
    84. .quit:
    85. ret
    86. endp
    87.  
    88. gdt:
    89. dd 0h,0h
    90. db 0FFh,0FFh,0h,0h,0h,10011010b,0CFh,0h
    91. db 0FFh,0FFh,0h,0h,0h,10010010b,0CFh,0h
    92. db 0FFh,0FFh,0h,0h,0h,10011010b,08Fh,0h ;16-ти разрядный код с 4Гб лимитами!
    93.  
    94.  
    95. gdt_reg:
    96. dw 2000h
    97. dd gdt+OFF
    98.  
    99. times 512-($-$$) db 0
     
  18. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Meatcoins
    Разберись с 16 и 32 битном кодом.
    Если код 16 то
    У команды call edi. будет код db 66h,0FFh,0D7h
    У команды call di. будет код db 0FFh,0D7h
    Если код 32 то
    У команды call edi. будет код db 0FFh,0D7h
    У команды call di. будет код db 66h,0FFh,0D7h

    use32 и use16 позволяют сказать компилятору для какой системы компилировать. В отладчике ты это никак не отличишь ты сам должен знать где код 16 где 32битный.
     
  19. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Мда... забыл 66h - это префикс изменения разрядности... Спасибо!
    Но, я вроде бы, это неявно учёл...
    Код (Text):
    1. use32
    2. call edi ;Копмпилируется почему-то как call di!
    3. use16
    В отладчике почему-то call di...
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Кто-нибудь в курсе как собрать mbr в тасме?
    А то сейчас мне приходиться WinHex-ом отрезать от него необходимый участок, несложно конечно, но лишнее движение. ^)