Невозможно прочитать сектор, используя int13H, используя собственный загрузчик - PullRequest
0 голосов
/ 24 августа 2018

Недавно я изучал сборку x86 и для практики решил собрать свой собственный загрузчик. Перед работой с int13H в самом загрузчике я решил попробовать прочитать сектор (логический 19) на дискете. Но, к сожалению, после записи кода и запуска его в QEMU данные не были загружены сами собой. Я полагаю, что я где-то ошибаюсь. Вот мой код.

read_sector:
    mov     ah,02H                  ; Function code to Read Sector
    mov     al,01                   ; Read one sector
    lea     bx,[SECTOR]             ; Address of input buffer
    mov     ch,00                   ; Track 0
    mov     cl,02                   ; Sector 1
    mov     dh,01                   ; Head number 1
    mov     dl,00                   ; Drive Number ( 0 - Floppy)
    int     13H                     ; call the routine
    mov     ah,0EH
    add     al,48
    int     10H
    ret

Чтобы прояснить ситуацию, я на самом деле читаю:

Логический сектор 19: Трек 0 Голова -1 Сектор- 2

В коде SECTOR представляет метку, с помощью которой я получаю доступ для записи, а также для чтения входных данных из сектора.

Код моей функции печати (довольно простой):

print:

    mov al,03H
    int 10H
    .repeat:
        lodsb
        mov ah,0EH
        cmp al,0
        je  .done
        int  10H
        jmp .repeat     
    .done:
        ret

Извините за незначительные вещи, оставленные в коде: (

Относительно вызова этой функции и доступа (печати) к данным здесь есть код.

    call    read_sector 
    mov     si,[SECTOR]

Но его запуск на экране ничего не показывает. Я также сослался на файлы Ральфа Брауна и проверил все (int 13H fun: 02H). Я также проверил код возврата в топоре и флаге переноса, и был установлен флаг переноса, указывающий на успешное чтение. Без других источников, на мой взгляд, первое место, на которое нужно ссылаться, было переполнение стека. Я был бы чрезвычайно благодарен, если бы кто-нибудь помог мне.

1 Ответ

0 голосов
/ 28 августа 2018

Подобные проблемы обычно связаны с тем, что сегментный регистр ( ES ) установлен неправильно. Int 13h / AH = 2h задокументировано следующим образом:

AH = 02h
AL = number of sectors to read (must be nonzero)
CH = low eight bits of cylinder number
CL = sector number 1-63 (bits 0-5)
high two bits of cylinder (bits 6-7, hard disk only)
DH = head number
DL = drive number (bit 7 set for hard disk)
ES:BX -> data buffer

ES должен быть установлен на сегмент, в котором находится смещение буфера данных.

Когда вы настраиваете свой загрузчик или JMP для кодирования в другом сегменте, вы всегда должны убедиться, что регистры сегмента загружены с соответствующими значениями. Используемые сегменты будут зависеть от того, какую директиву ORG вы используете в своем коде.

У меня есть общие советы по загрузчику , которые могут быть полезны.

...