OSDev
http://osdev.ru/

Преобразование из LBA в CHS
http://osdev.ru/viewtopic.php?f=6&t=391
Страница 1 из 1

Автор:  s3dworld [ 21 янв 2011, 17:13 ]
Заголовок сообщения:  Преобразование из LBA в CHS

Всем доброго вечера!

Пишу загрузчик для 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

Автор:  qeos [ 04 фев 2011, 16:37 ]
Заголовок сообщения:  Re: Преобразование из LBA в CHS

Предлагаю посмотреть как я делал:
Код:
; =======================================================================
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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/