OSDev http://osdev.su/ |
|
Преобразование из LBA в CHS http://osdev.su/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/ |