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

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

  1. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    DoctorWho,

    cppasm ведь внятно сказал, загрузка 0x7C0 в ds вкупе с org 0x7C00 ломает адресацию. mov eax, [ds:fat32.RootClus] берёт dword[7C0h*16 (AKA ds:) +7C2Ch], а какой там мусор — ХЗ.

    ОтладБокс (bochsdbg) сделал бы это явным на раз-два, но вследствие лени сие оказалось преградой.
     
  2. shm

    shm New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2010
    Сообщения:
    93
    DoctorWho
    Просто стоит задуматься над своими вопросами. Большая часть того чего ты спрашиваешь описана во множестве статей книжках, а уж на различных форумах данные вопросы поднимались огромное количество раз, есть целая статья по разработке операционных систем, вбей в поисковик "Разработка операционных систем. Выпуск 1". Прежде чем программировать чего-то надо это подробно изучить (будь то файловые системы, загрузчики, железо и т.п.), потом попробовать реализовать, опять же прежде чем спрашивать о проблеме посмотри в том, на основе чего ты это пишешь, можешь поискать другие статьи и если упрется то пиши проблему на форум. Ты конечно извини, но вот вопросы твои вопрос про стек в частности говорит о том, что ты перед разработкой своего загрузчика не уделил должного внимания архитектуре х86 и ассемблеру, т.е. без знания регистров и их назначения вообще не возможно чего-либо стоящего написать на ассемблере. Вот поэтому я и намекнул тебе, что вопросы-то крайне тривиальны нужно такие вещи научиться решать самостоятельно иначе дальше вообще врят-ли получится чего сделать. Конечно есть сложные и интересные вопросы например, про реализацию многозадачности в защищенном режиме, хотя эта тема тоже поднимается крайне часто, но в каждом случае (если человек писал сам а не использовал готовые наработки) возникаю свои трудности и я с удовольствием готов помочь в подобных вопросах. Также сложными являются большинство тем про программирование железо (особенно современного) ну и еще много чего. НУ в в общем вопросы надо задавать, только перед эти надо попытаться самому решить проблему. Просто приятно разговаривать с человеком, который знает тему, но у него не получается, но вот "уперлось" и все, тогда быстро находишь взаимопонимание, а когда выясняется, что человек толком не понимает чего написал... ну сам понимаешь
     
  3. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    При отладке борщ по обращению к диску выдаёт "int13_harddisk: function 02, parameter out of range!", хотя передаю ему:

    Код (Text):
    1. rax: 0x00000000:00000201 rcx: 0x00000000:00000700
    2. rdx: 0x00000000:00003e80 rbx: 0x00000000:00000000
    3. rsp: 0x00000000:0000ffee rbp: 0x00000000:00000000
    4. rsi: 0x00000000:00003ec1 rdi: 0x00000000:0000ffac
    5. r8 : 0x00000000:00000000 r9 : 0x00000000:00000000
    6. r10: 0x00000000:00000000 r11: 0x00000000:00000000
    7. r12: 0x00000000:00000000 r13: 0x00000000:00000000
    8. r14: 0x00000000:00000000 r15: 0x00000000:00000000
    9. rip: 0x00000000:00007d2b
    10. eflags 0x00000202: id vip vif ac vm rf nt IOPL=0 of df IF tf sf zf af pf cf
    Что я не так делаю?
     
  4. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    DoctorWho,

    Сектора, в отличие от треков/цилиндров, нумеруются начиная с единицы. cl & 63 == 0, так что бокс абсолютно прав.
     
  5. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    Ёмаё. Регистры перепутал. Спасипос baldr
     
  6. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    Ура, товарищи! Эта хрень благополучно заработала! Спасибо всем за помощь.
     
  7. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    Снова всем доброго! Опять появились проблемы =) Решил подправить свой загрузчик, т.к. не может нормально читать фрагментированные файлы. Ещё раз почитал маны, по FATу в принципе всё понял. Написал код, скомпилировал и попытался отладить, но после первого же обращения к диску ни один бряк не срабатывал (даже если ставить прямо за int, bochs просто напросто виснет), т.е. посмотреть "на лету" чего я опять накосячил я не смог. Несколько раз просмотрел код и ничего не нашёл. В общем завал. Если кому в коде копаться лень, подскажите хоть что с отладкой делать?

    Код (Text):
    1. org 0
    2. use16
    3. include 'macro/struct.inc'
    4. include 'fat32equates.inc'
    5.  
    6.   jmp short start
    7.   nop
    8.   OEMName db 8 dup(?)
    9.   bpb     BPB
    10.   fat32   FAT32
    11.  
    12. start:
    13.   cli
    14.   mov ax, 0x7C0
    15.   mov ds, ax
    16.   mov ss, ax
    17.  
    18.   xor ax, ax
    19.   mov sp, ax
    20.   sti
    21.  
    22.   push 0x1000
    23.   pop es
    24.  
    25.   xor ebp, ebp
    26. search_for_file:
    27.   mov esi, [fat32.RootClus]
    28.   mov edi, ebp
    29.   xor bx, bx
    30.   call read_cluster
    31.   jc not_exist
    32.     xor bx, bx
    33.     mov ax, [bpb.BytsPerSec]
    34.     movzx cx, [bpb.SecPerClus]
    35.     mul cx
    36.     cluster_loop:
    37. ;  piece of FAT32 File System Specification:
    38. ;  "If DIR_Name[0] == 0x00, then the directory entry is free,
    39. ;  and there are no allocated directory entries after this one."
    40.       cmp byte [es:bx+DIR.Name], 0
    41.       je not_exist
    42.       cmp byte [es:bx+DIR.Name], 0xE5 ; Free entry
    43.       je next_entry
    44.       mov si, file_name
    45.       mov di, bx
    46.       mov cx, 11
    47.       rep cmpsb
    48.       je has_found
    49.     next_entry:
    50.       add bx, DIR_SIZE
    51.       cmp bx, ax
    52.     jb cluster_loop
    53.   inc ebp
    54.   jmp search_for_file
    55. has_found:
    56. ;  es:bx     DIR_ENTRY of KERNEL.BIN
    57.   mov si, [es:bx+DIR.FstClusHI]
    58.   shl esi, 16
    59.   mov si, [es:bx+DIR.FstClusLO]
    60.   xor edi, edi
    61. loading_loop:
    62.     call read_cluster
    63.     jc loading_loop
    64.     inc edi
    65.     jmp loading_loop
    66.   jmp far 0x1000:0000
    67.  
    68. ;  in esi    FAT_ENTRY
    69. ;  in edi    number in list
    70. ;  in es:bx  buffer
    71.  
    72. read_cluster:
    73.   pushad
    74.   mov eax, esi
    75.   test edi, edi
    76.   jz @f
    77.   dec edi
    78.   add esi, edi
    79.   shl esi, 2            ; element of FAT32 is DWORD
    80.   mov eax, esi
    81.   xor edx, edx
    82.   movzx ecx, [bpb.BytsPerSec]
    83.   div ecx
    84.   movzx ecx, [bpb.RsvdSecCnt]
    85.   add eax, ecx
    86.   mov esi, eax
    87.   call read
    88.   mov di, dx
    89.   mov eax, [es:di]
    90.   cmp eax, EOC
    91.   jne @f
    92.     popad
    93.     stc
    94.     ret
    95. @@:
    96. ; in EAX now number of cluster to read
    97.   sub eax, 2            ; two reserved FAT records
    98.   movzx edi, [bpb.SecPerClus]
    99.   mul edi
    100.   push eax
    101.   mov eax, [fat32.FATSz32]
    102.   shl eax, 1            ; eax = eax * FATNum (default FATNum = 2)
    103.   add eax, ecx          ; ecx = bpb.RsvdSecCnt
    104. ; in EAX now first sector of data area
    105.   pop ecx
    106. ;  lea esi, [eax+ecx]    ; esi = eax + ecx
    107.   add eax, ecx
    108.   mov esi, eax
    109.   mov cx, di            ; di = bpb.SecPerClus
    110. reading:
    111.   call read
    112.   inc esi
    113.   loop reading
    114.   popad
    115.   clc
    116.   ret
    117.  
    118. ;  in esi    LBA
    119. ;  in es:bx  buffer
    120.  
    121. read:
    122.   pushad
    123.   movzx eax, [bpb.NumHeads]
    124.   mul [bpb.SecPerTrk]
    125.   xchg eax, esi         ; LBA
    126.   xor edx, edx
    127.   div esi
    128.   mov ch, al            ; Cylinder
    129.   mov eax, edx
    130.   xor edx, edx
    131.   div [bpb.SecPerTrk]
    132.   mov dh, al            ; Head
    133.   inc dl
    134.   mov cl, dl            ; Sector
    135.   mov dl, [fat32.DrvNum]
    136.   mov ax, 0x0201
    137.   int 0x13
    138.   jc error
    139.   popad
    140.   ret
    141.  
    142. print:
    143.   lodsb
    144.   test al, al
    145.   jz @f
    146.   mov ah, 14
    147.   mov bx, 7
    148.   int 0x10
    149.   jmp print
    150. @@:
    151.   ret
    152.  
    153.   error:
    154.     mov si, read_error
    155.     call print
    156.     jmp reboot
    157.  
    158.   not_exist:
    159.     mov si, nexist_msg
    160.     call print
    161.  
    162. reboot:
    163.   mov si, reboot_msg
    164.   call print
    165.   xor ah, ah
    166.   int 0x16              ; wait for any key press
    167.   int 0x18              ; transfer control back to BIOS
    168.  
    169.   read_error db "Read error",0
    170.   nexist_msg db "KERNEL.BIN not found",0
    171.   reboot_msg db ", press any key to restart.",0xA,0xD,0
    172.   file_name  db "KERNEL  BIN"
    173.  
    174.   db 510-($-$$) dup (0)
    175.   signature db 0x55,0xAA
     
  8. max7C4

    max7C4 New Member

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

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    Так и делал. Зацикливается где-то в коде BIOS, не пойму почему...
     
  10. max7C4

    max7C4 New Member

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

    DoctorWho New Member

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

    З.Ы. Как shm и говорил, еле уложился в размер =)