Кривые руки или прямые извилины?

Тема в разделе "WASM.BEGINNERS", создана пользователем DoctorWho, 10 ноя 2010.

  1. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    Доброго, форумчане! Я написал код начального загрузчика для FAT32, но он, гад этакий, не работает. Помогите понять в чём проблема. Простите, что нет комментов. Пишу его на флешку WinHex'ом (только код, структуры не затираю).

    Код (Text):
    1. ; fat32equates.inc
    2.  
    3. LEADSIG  EQU 0x41615252
    4. STRUCSIG EQU 0x61417272
    5. TRAILSIG EQU 0xAA550000
    6.  
    7. ATTR_READ_ONLY EQU 0x1
    8. ATTR_HIDDEN    EQU 0x2
    9. ATTR_SYSTEM    EQU 0x4
    10. ATTR_VOLUME_ID EQU 0x8
    11. ATTR_DIRECTORY EQU 0x10
    12. ATTR_ARCHIVE   EQU 0x20
    13. ATTR_LONG_NAME EQU 0x3F
    14.  
    15. struct BPB
    16.   BytsPerSec  dw ?
    17.   SecPerClus  db ?
    18.   RsvdSecCnt  dw ?
    19.   NumFATs     db ?
    20.   RootEntCnt  dw ?
    21.   TotSec16    dw ?
    22.   Media       db ?
    23.   FATz16      dw ?
    24.   SecPerTrk   dw ?
    25.   NumHeads    dw ?
    26.   HiddSec     dd ?
    27.   TotSec32    dd ?
    28. ends
    29. ;36d FAT32
    30. struct FAT32
    31.   FATSz32     dd ?
    32.   ExtFlags    dw ?
    33.   FSVer       dw ?
    34.   RootClus    dd ?
    35.   FSInfo      dw ?
    36.   BkBootSec   dw ?
    37.   Reserved    db 12 dup(?)
    38.   DrvNum      db ?
    39.   Reserved1   db ?
    40.   BootSig     db ?
    41.   VolID       dd ?
    42.   VolLab      db 11 dup(?)
    43.   FilSysType  db 8 dup(?)
    44. ends
    45.  
    46. struct FSI ;FSInfo
    47.   LeadSig     dd ?
    48.   Reserved1   db 480 dup(?)
    49.   StrucSig    dd ?
    50.   Free_Count  dd ?
    51.   Nxt_Free    dd ?
    52.   Reserved2   db 12 dup(?)
    53.   TrailSig    dd ?
    54. ends
    55.  
    56. DIR_SIZE       equ 32
    57.  
    58. struct DIR
    59.   Name         db 11 dup(?)
    60.   Attr         db ?
    61.   NTRes        db ?
    62.   CrtTimeTenth db ?
    63.   CrtTime      dw ?
    64.   CrtDate      dw ?
    65.   LstAccDate   dw ?
    66.   FstClusHI    dw ?
    67.   WrtTime      dw ?
    68.   WrtDate      dw ?
    69.   FstClusLO    dw ?
    70.   FileSize     dd ?
    71. ends
    72.  
    73. ;loader.asm
    74.  
    75. ; KERNEL.SYS must be unfragmented and have size less
    76. ; than bpb.BytsPerSec*255, because int 0x13 can't read >255 sectors.
    77.  
    78. org 0x7C00
    79. use16
    80. include 'macro/struct.inc'
    81. include 'fat32equates.inc'
    82.  
    83.   jmp short start
    84.   nop
    85.   OEMName db 8 dup(?)
    86.   bpb     BPB
    87.   fat32   FAT32
    88.  
    89. start:
    90.   cli
    91.   mov ax, 0x7C0
    92.   mov ds, ax
    93.   mov sp, ax
    94.  
    95.   xor ax, ax
    96.   mov ss, ax
    97.  
    98.   mov eax, [ds:fat32.RootClus]
    99.   xor ecx, ecx
    100.   push 0x1000
    101.   pop es
    102.  
    103. search_for_file:
    104.   push cx
    105.     mov cl, 1
    106.     call read
    107.       xor dx, dx
    108.       in_sector_loop:
    109.         mov di, dx
    110.         cmp byte [es:di+DIR.Name], 0
    111.         jz not_exist
    112.  
    113.         mov cx, 11
    114.         mov si, file_name
    115.         rep cmpsb
    116.         je found
    117.  
    118.         add dx, DIR_SIZE
    119.         cmp dx, [bpb.BytsPerSec]
    120.       jb in_sector_loop
    121.   pop cx
    122.   inc cx
    123.   lea eax, [ecx*4]
    124.   add eax, [ds:fat32.RootClus]
    125. jmp search_for_file
    126.  
    127. found:
    128.   mov di, dx
    129.   mov eax, [es:di+DIR.FileSize]
    130.   xor edx, edx
    131.   div [ds:bpb.BytsPerSec]
    132.   test edx, edx
    133.   jnz @f
    134.   inc eax
    135. @@:
    136.   mov cl, al
    137.   mov ax, [es:di+DIR.FstClusHI]
    138.   shl eax, 16
    139.   mov ax, [es:di+DIR.FstClusLO]
    140.   call read
    141.   jc error
    142.   sti
    143.   jmp 0x1000:0000
    144.  
    145. ;  in eax    base(LBA)
    146. ;  in es:0   buffer
    147. ;  in cl     sectors
    148.  
    149. read:
    150.   mov eax, esi
    151.   xor edx, edx
    152.   mov si, [ds:bpb.SecPerTrk]
    153.   imul si, [ds:bpb.NumHeads]
    154.   div si
    155.   mov bh, al  ; track
    156.  
    157.   mov eax, esi
    158.   xor edx, edx
    159.   div [ds:bpb.SecPerTrk]
    160.   xor edx, edx
    161.   div [ds:bpb.NumHeads]
    162.   push dx     ; head
    163.  
    164.   mov eax, esi
    165.   xor edx, edx
    166.   div [ds:bpb.SecPerTrk]
    167.   inc ax
    168.   mov bl, al  ; sector
    169.  
    170.   mov al, cl
    171.   mov cx, bx
    172.   xor bx, bx
    173.   pop dx
    174.   shl dx, 8
    175.   mov dl, [ds:fat32.DrvNum]
    176.   mov ah, 02
    177.   int 0x13
    178.   jc error
    179.   ret
    180.  
    181. print:
    182.   lodsb
    183.   test al, al
    184.   jz @f
    185.  
    186.   mov ah, 14
    187.   mov bx, 7
    188.   int 0x10
    189.   jmp print
    190. @@:
    191.   ret
    192.  
    193.   error:
    194.     mov si, read_error
    195.     call print
    196.     jmp reboot
    197.  
    198.   not_exist:
    199.     mov si, nexist_msg
    200.     call print
    201.  
    202. reboot:
    203.   mov si, reboot_msg
    204.   call print
    205.   sti
    206.   xor ah, ah
    207.   int 0x16     ; wait for any key press
    208.   int 0x18     ; transfer control back to BIOS
    209.  
    210.   read_error db "Read error!",0xA,0xD,0
    211.   nexist_msg db "KERNEL.BIN not found!",0xA,0xD,0
    212.   reboot_msg db "Press any key to restart",0
    213.   file_name  db "KERNEL  BIN"
    214.  
    215.   db 510-($-$$) dup (0)
    216.   signature db 0x55,0xAA
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    борщь пробовали?
     
  3. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    Не хочет с флешки грузиться.
    Пишет: ata0-0: could not open hard drive image file '\\.\PHYSICALDRIVE1'
     
  4. shm

    shm New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2010
    Сообщения:
    93
    Я тоже когда-то столкнулся с одними граблями: короче БИОСы для "совместимости" у флешек в буте прописывают по 0x24 номер загрузочного Диска, но(!!!) при это не проверяя что может на диске совсем не FAT16/12, а FAT32 и даже вообще другая ФС. При этом на FAT32 затирается поле FATSz32, лекарство в данном случае только одно (других стандартных способов нет повлиять на BIOS и его дисковый сервис) - дублировать это поле в резервной области, благо M$ уже давно ФАТ "похоронила" поэтому боятся несовместимости в будущем, я думаю, не стоит.
     
  5. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    shm
    Не, БИОС ничего не меняет.
     
  6. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    DoctorWho
    А образ сделать...
    К тому же у борща отладчик встроеный и usb можно в обход виндовых дисков подключить.
     
  7. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    max7C4
    Уже сделал с неё образ. Отлаживаю. Ошибка на ошибке, причём тупые...
     
  8. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    В начале исходника стоит ORG 7C00h, т.е. смещения в сегменте будут отсчитываться от 7C00h при обращении к переменным.
    А потом в DS ты пишешь 7C0h, для правильной адресации смещения должны с нуля отсчитываться.
    Т.е. вместо своих переменных ты будешь обращаться не известно куда.
    В SP пишешь 7С0h, что полная ерунда - трёшь область данных BIOS.
    Дальше нечитал. Ошибок куча.
     
  9. shm

    shm New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2010
    Сообщения:
    93
    Ну у тебя может и не меняет, а так имей в виду.
    Сперва я в код не залезал, ошибок у тебя и вправду куча, ты чего без отладки что ли код писал? В добавок к cppasm'му добавлю: при смене стека надо отключать прерывания, есть шанс, хоть и не большой, что произойдет аппаратное прерывании и твоя система упадет. Доступ к данным в DS можно задавать неявно у тебя - mov eax, [ds:fat32.RootClus], можно mov eax, [fat32.RootClus]. Чтение файла выглядит больно простовато, настоящий алгоритм намного сложней и еще помучаешься "запихать" в 480 байт. Ты путаешь кластер с линейным сектором, правильность вычисление которого у меня тоже вызывает сомнения. короче для отладки скачай bochs, он в логи прямо содержимое регистров пропишет в месте останова, для отладки бута - просто сказка. Теперь внимательно прочитай спецификацию ФАТ, а также посмотри нормальную формулу расчета CHS из LBA. Можешь почитать Кулакова.
     
  10. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    shm
    бош теперь умеет и пошаговую отладку выполнять, а не только регистры в логи. скачайте последнюю версию.
     
  11. shm

    shm New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2010
    Сообщения:
    93
    Спасибо, только загрузчик у меня давно уже отлажен :), а в ядре у меня свой отладчик, так что собираю на одной машине на флешку и тестю на другой.
     
  12. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    Стоп я не понял. Разве в сегментный регистр надо писать 0x7C00? Это же вроде будет ссылаться на 0x7C000.

    shm
    Да, код писал без отладки =) Кстати поначалу ds не было там. Точно cli не всё отключает И вот ещё что. В структурах не секторы, а кластеры используются? А то я что-то запутался.
     
  13. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    DoctorWho

    Никто не мешает загрузицца в "DOS" и загрузить в ЛЮБОЙ сегмент ваш кодец - с оффсета 7c00. Далее его можно трейсить любым дос отлатчегом (td/etc). Немного тока регистры поправить в начале (или напейсать сразу независимо от положения сегмента).
     
  14. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    PSR1257
    Отличный совет! Нафик борщ с его консолькой, а то страх, как неудобно. Хотя жаль что к нему GUI нормальной нет (
     
  15. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    DoctorWho

    :) Удачи.
     
  16. shm

    shm New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2010
    Сообщения:
    93
    С каких это пор SP (Stack Pointer) стал сегментным регистром? Скачай себе любой учебник по ассемблеру и будет тебе счастье. Ты указал, что код смещен относительно сегмента на 0x7C00, дак изволь подобным образом настроить сегментные регистры, а ты пишешь 0x7C0, т.е. обращение идет по физическому адресу адресу 0x7C0*16 + 0x7C00 = F800. Соответственно если у тебя org 0x7C00, пиши в сегментные регистры 0(DS, ES и по-усмотрению в сегмент стека SS, тогда и SP запиши такое значение, чтобы ты стеком ничего не потер (он растет СВЕРХУ ВНИЗ)).
    :O мда с твоим уровнем знаний ассемблера отладчик - твой лучший друг.
    Интересно, я после установки стека просто sti не увидел дальше и не глядел..., да увидел я у тебя cli, а где sti? ты надеешься что за тебя его что-то установит? если прерывания не разрешены, то твоя система упадет, скорее всего при первом же обращении к дисковому сервису.
    Подобный вопрос говорит о твоем полном непонимании файловой системы FAT. Скачай себе книжку в которой она описана - их полно, например Кулаков "программирование на аппаратном уровне", "Программирование дисковых подсистем". А еще официальную спецификацию на ФАТ: вроде fatgen.doc (может ошибаюсь). Все данные на диске с ФАТ хранятся в кластерах, есть еще таблица их размещения на диске (которую тоже нужно читать и извлекать цепочку принадлежащую файлу), откуда и произошло название FAT (File Allocation Table).
    Раз запутался так вооружись книжками, статьями и пр. и читай внимательно от начала до конца интересующей темы и все станет ясно...
     
  17. shm

    shm New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2010
    Сообщения:
    93
    А ты искал?
     
  18. shm

    shm New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2010
    Сообщения:
    93
    Тогда тебе далеко еще до разработки ОС (поверь, как ты загрузишься GUI с окошками мышкой, ... не появится), пиши на BCB под виндовс.
     
  19. shm

    shm New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2010
    Сообщения:
    93
    Я чего-то очень сомневаюсь, что это будет удобней, чем bochs.
     
  20. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    Cпасибо за информацию! Но то как ты её подаёшь, сильно отбивает желание что-либо спрашивать потом. Может это и хорошо...