Как записать на жесткий диск с прерыванием биос 13h - PullRequest
1 голос
/ 30 января 2012

Я хочу скопировать мой загрузчик на первый сектор (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 ]

9 голосов
/ 30 января 2012

Ваш код очень грязный. Для правильного использования 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 будет содержать код ошибки.

2 голосов
/ 30 января 2012

Функции BIOS имеют входные параметры.Если вы не правильно укажете все входные параметры, функция BIOS не сможет угадать, что вы имели в виду.Для функции BIOS, которую вы используете, посмотрите на: http://www.ctyme.com/intr/rb-0608.htm

Насколько я могу судить, вам не хватает нормальных значений для CH и ES, поэтому BIOS может записывать данные из полностьюдругой адрес для совершенно другого сектора.Также обратите внимание, что CL является нижней половиной регистра CX - нет смысла загружать значение в CL, а затем перезаписывать его, загружая что-либо в CX.

Функции BIOS также возвращают значения.В вашем случае BIOS может возвращать код состояния, который сообщает вам, что пошло не так, и потому что вы не проверяете, вы не знаете, если что-то пошло не так или что было, если это произошло.

...