OSDev

для всех
Текущее время: 09 дек 2019, 06:26

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Преобразование из LBA в CHS
СообщениеДобавлено: 21 янв 2011, 17:13 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Всем доброго вечера!

Пишу загрузчик для FAT12. Требуется написать функцию на ассемблере (тут они называются подпрограммами) для преобразования из LBA в CHS.

Покопавшись по материалам нашёл несколько формул. Вот формула с сайта http://ru.wikipedia.org/wiki/LBA:

Изображение

А вот с книги Кулакова "Программирование дисковых подсистем":

Изображение

Интересно получается, формулы то разные. И какая правильная? Лично я доверился Кулакову. Надеюсь я не зря это сделал.

А вот теперь по поводу реализованной функции. Я сейчас Вам её покажу и хочу в ответ услышать советы по коду.

Код:
; -------------------------------------------------------------------------------------
; Формат:      bool GetCHSFromLBA(
;                           unsigned short int _index,
;                           unsigned short int* _cylinder,
;                           unsigned short int* _head,
;                           unsigned short int* _sector);
; Описание:      Преобразование из LBA в CHS
; Параметры:   _index      - индекс сектора в системе LBA
;            _cylinder   - номер цилиндра в системе CHS
;            _head      - номер головки в системе CHS
;            _sector      - номер сектора в системе CHS
; Результат:   При успешном завершении возвращает true, в противном случае - false
; -------------------------------------------------------------------------------------
GetCHSFromLBA:
   push BP
   mov BP,SP
   
   ; Проверяем не является ли _cylinder нулевым указателем
   mov AX,[BP+6]
   test AX,AX
   jz _getCHSFromLBA_ExitFalse
   
   ; Проверяем не является ли _head нулевым указателем
   mov AX,[BP+8]
   test AX,AX
   jz _getCHSFromLBA_ExitFalse
   
   ; Проверяем не является ли _sector нулевым указателем
   mov AX,[BP+10]
   test AX,AX
   jz _getCHSFromLBA_ExitFalse
   
   ; Находим цилиндр
   mov AX,[BPB_NumHeads]
   mul [BPB_TotSec16]
   mov BX,AX
   mov AX,[BP+4]
   div BX
   mov [BP+6],BX
   mov [BX],AX
   
   ; Находим головку
   mov BX,[BP+6]
   mov AX,[BX]
   mov BX,[BPB_NumHeads]
   mul BX
   mov BX,[BPB_TotSec16]
   mul BX
   mov BX,[BP+4]
   sub BX,AX
   mov AX,BX
   mov BX,[BPB_TotSec16]
   div BX
   mov BX,[BP+8]
   mov [BX],AX
   
   ; Находим сектор
   mov BX,[BP+6]
   mov AX,[BX]
   mov BX,[BPB_NumHeads]
   mul BX
   mov BX,[BP+8]
   mov CX,[BX]
   add AX,CX
   mov BX,[BPB_TotSec16]
   mul BX
   mov BX,AX
   mov AX,[BP+4]
   sub AX,BX
   inc AX
   mov BX,[BP+10]
   mov [BX],AX
   
   jmp _getCHSFromLBA_ExitTrue
   
_getCHSFromLBA_ExitFalse:
   mov AX,0
   jmp _getCHSFromLBA_Exit
   
_getCHSFromLBA_ExitTrue:
   mov AX,1
   
_getCHSFromLBA_Exit:
   mov SP,BP
   pop BP
ret

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование из LBA в CHS
СообщениеДобавлено: 04 фев 2011, 16:37 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
Предлагаю посмотреть как я делал:
Код:
; =======================================================================
read_sector:
; ES:BX = destination
; AX:DX = sector
        push bx
        mov bx, 18
        div bx
        mov [sec], dl
        inc byte [sec]

        xor dx, dx
        mov bx, 2
        div bx
        mov [hea], dl

        xor dx, dx
        mov bx, 80
        div bx
        mov [cyl], dx

        pop bx
.readparams:
        mov ax, 0x0201        ; Load data / Read 1 sectors
        mov cx, [cyl]        ; Cylinder = 0
        xchg cl, ch
        or cl, [sec]        ; Sector = 2
        mov dh, [hea]        ; Head = 0
        mov dl, [drive]        ; Drive = A:
        int 13h          ;
        jc .readparams   ; Failed -> Try again

    ret


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB