Как записать на жесткий диск с прерыванием биос 13h
Я хочу скопировать мой загрузчик на первый сектор (512) жесткого диска внутри себя (я должен использовать прерывание BIOS 13h), и я нашел этот код:
mov bx, buffer1 ; set BX to the address (not the value) of BlahBlah
mov ah,03h ;When ah=, int13 reads a disk sector
mov al,5 ;Al is how many sectors to read
mov cl,0 ;Sector Id
mov dh,0 ;Head
mov dl,80h ;Drive (0 is floppy)
mov cx,512 ;One sector /2
mov ah, 0x3 ; set function 2h
int 0x13
бу это не работает!
2 ответа
Ваш код очень грязный. Для того, чтобы правильно использовать int 13h
с AH = 3
нужно также установить ES
(сегмент, в котором BX
проживает, например, ES:BX
адрес буфера, который должен быть прочитан и записан на жесткий диск), и CX
на комбинацию цилиндра и номера сектора (cylinder = CL[7:6] || CH
, sector = CL[5:0]
).
Предполагая, что вы хотите записать один сектор (512 байт) с физического адреса 5000h
до CHS 0:0:1 на жестком диске 0, ваш код будет выглядеть примерно так:
xor ax, ax
mov es, ax ; ES <- 0
mov cx, 1 ; cylinder 0, sector 1
mov dx, 0080h ; DH = 0 (head), drive = 80h (0th hard disk)
mov bx, 5000h ; segment offset of the buffer
mov ax, 0301h ; AH = 03 (disk write), AL = 01 (number of sectors to write)
int 13h
Вы также должны помнить, был ли установлен флаг переноса после выполнения прерывания. Будет ясно, если функция была выполнена правильно. Если он установлен, то AH
регистр будет содержать код ошибки.
Функции BIOS имеют входные параметры. Если вы не укажете все входные параметры правильно, функция BIOS не сможет угадать, что вы имели в виду. Для функции BIOS, которую вы используете, посмотрите: http://www.ctyme.com/intr/rb-0608.htm
Насколько я могу судить, вам не хватает нормальных значений для CH и ES, поэтому BIOS может записывать данные с совершенно другого адреса в совершенно другой сектор. Также обратите внимание, что CL является самой низкой половиной регистра CX - нет смысла загружать значение в CL, а затем перезаписывать его, загружая что-то в CX.
Функции BIOS тоже возвращают значения. В вашем случае BIOS может возвращать код состояния, который сообщает вам, что пошло не так, и потому что вы не проверяете, вы не знаете, если что-то пошло не так или что было, если это произошло.