Лисья Нора

Оглавление


§ Через CHS

Для загрузки секторов используется классический подход с указанием цилиндра, головки и сектора (CHS – Cylinder Head Sector). Ссылка на [[http://www.codenet.ru/progr/dos/int_0012.php источник]].
mov ax, $02 ; 02-Чтение 03-Запись
mov al, 48 ; Количество секторов, 48 секторов по 512 байт
mov bx, $8000 ; ds:bx Указатель на буфер
mov cx, $0002 ; Номер сектора и цилиндра (первый сектор - 1, последний - 63)
mov dh, $00 ; Номер головки (от 0 до 255)
mov dl, $80 ; Номер диска (0-Floppy, $80-Drive C, $81-Drive D и т.д.)
int 13h
 
; По следующим адресам хранится информация
; 0:0078 => таблица параметров дискеты
; 0:0104 => таблица параметров диска
; ---
; +5-4-3-2-1-0-9-8-7-6-5-4-3-2-1-0+
; ¦c c c c c c c c C C s s s s s s¦
; +7-6-5-4-3-2-1-0¦9+8+-+-+-+-+-+-+
В регистре CL (биты 0..5) содержится номер сектора от 1 до 63. В регистре CH содержится младшие 8 бит цилиндра, и в старших 2 битах регистра CL – биты 8..9 номера цилиндра, то есть вычисляется так:
Сектор = CL & 63;
Цилиндр = ((CL & 0xC0) << 2) + CH;
Номер цилиндра может быть равным от 0 до 1023, головки от 0 до 255, а сектора от 1 до 63. Чтобы вычислить положение сектора на диске в режиме LBA (Large Block Array), считается так:
LBA = (Sector-1) + Head*63 + Cylinder*63*256

§ Через LBA

В современных BIOS есть специальные функции для работы с плоской моделью дисков. Ссылка на https://en.wikipedia.org/wiki/INT_13H#INT_13h_AH=42h:_Extended_Read_Sectors_From_Drive функцию.
mov ah, 42h ; Код функции чтения диска (43h запись)
mov si, DAP ; ds:si Таблица с параметрами
mov dl, $80 ; Номер диска
int 13h
Таблица параметров
DAP:
db 10h ; Размер DAP (всегда 10h)
db 00h ; Не используется
dw 0001h ; Количество секторов для чтения (до 127)
dw 0000h ; Смещение данных
dw 0800h ; Сегмент данных
dq 0 ; Номер сектора от 0 до n-1