Как загрузить приложение из секторов? - PullRequest
0 голосов
/ 19 октября 2018

Я создаю пользовательскую MBR, которая должна загружать приложение, хранящееся в следующих 32 секторах, все работает, кроме загрузки приложения, и я не понимаю, что я делаю неправильно, поэтому, если кто-то знает, что и как это исправить, пожалуйста,помоги мне.

Victoria.asm

org 0x7c00
bits 16

Kernel:
    ;---Setup Segments
    xor ax, ax               ;AX=0
    mov ds, ax               ;DS=ES=0 because we use an org of 0x7c00 - Segment<<4+offset = 0x0000<<4+0x7c00 = 0x07c00
    mov es, ax
    mov ss, ax
    mov sp, 0x7c00           ;SS:SP= 0x0000:0x7c00 stack just below bootloader

    ;---Read Kernel
    mov bx, buffer           ;ES: BX must point to the buffer
    mov [BOOT_DRIVE], dl     ;save the boot drive
    mov dl, [BOOT_DRIVE]     ;use boot drive passed to bootloader by BIOS in DL
    mov dh,0                 ;head number
    mov ch,0                 ;track number
    mov cl,2                 ;sector number
    mov al,128               ;number of sectors to read
    mov ah,2                 ;read function number
    int 13h

    ;---Start Application
    jmp buffer

;Fake MBR Signature
BOOT_DRIVE: db 0
times 510 - ($ - $$) db 0
dw 0xAA55

;Victoria Freeware - The Kernel
victoria: incbin "Victoria.com"
times 65536 - ($ - $$) db 0

;Buffer
buffer:

1 Ответ

0 голосов
/ 19 октября 2018

Основная проблема в том, что когда вы звоните int 0x13, ah = 0x02, вам нужен номер устройства для устройства, с которого вы хотите прочитать, в dl.Номер устройства, с которого вы загрузились, предоставляется BIOS в dl, но код перезаписывает это (предыдущий mov dx, 0x184F), поэтому вы просите прочитать данные с совершенно другого устройства (которое, вероятно, не существует).).

Существует множество других проблем.Регистры сегментов установлены неправильно (например, mov ax,ds вместо mov ds,ax) и не установлены в нужном месте (это следует сделать до использования сегментов - например, до того, как сегмент ds будет использоватьсяmov al,[si] инструкция в коде для печати строки).Вы не можете просто предположить, что int 0x13, ah = 0x02 работал без проверки на наличие ошибок (и, если есть ошибка, вы должны отобразить хорошие сообщения об ошибках, читаемые конечным пользователем), которые дают пользователю некоторую надежду выяснить, что они могут сделать, чтобы исправить ошибку.проблема).

Наконец, есть концептуальная проблема.Для многораздельных устройств (жестких дисков, USB-накопителей и т. Д.) Главное, что должен делать MBR, это запускать загрузчик операционной системы из активного раздела (MBR не следует рассматривать как часть какой-либо конкретной операционной системы, начинается загрузочный код операционной системы).с 1-м сектором раздела операционной системы).Для нераспределенных устройств (дискет) по разным причинам вам необходим BPB (блок параметров BIOS) (чтобы другие операционные системы не считали диск неформатированным и чтобы BIOS считал его действительным для различных особых случаев, таких как «USB-флэш-память»).эмулирующая дискета "и" загрузочный компакт-диск эмулирующая дискета ").

ОБНОВЛЕНИЕ

Да, вопрос трансформируется, и некоторые ответы выше не применяются.Текущие проблемы:

  • ds не задан до того, как он используется инструкцией mov [BOOT_DRIVE], dl, которая его использует
  • mov ax,cs не может быть правильным.Когда BIOS запускает код, он может сделать jmp 0x0000:0x7C00 или jmp 0x07C0:0x0000 (или любую комбинацию), поэтому cs не установлен на известное значение, и загрузка неизвестного значения в ax не сильно поможет.
  • mov ax,ds (сразу после mov ax,cs) не устанавливает ds, но загружает ax со значением, которое BIOS оставил в ds.Я думаю, что эта инструкция должна была быть mov ds,ax (которая могла бы или не могла бы работать, в зависимости от того, какой компьютер / BIOS используется)
  • mov ax, ds, mov ax, es и mov ax, ss (сразу после метки kernel: имеют ту же проблему (должно быть mov ds, ax, mov es, ax и mov ss, ax
...