Всем доброго вечера!
Пишу загрузчик для 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