Сборка - Чтение следующего сектора виртуального диска

Как и любой программист в мире хотя бы раз в жизни, я пытаюсь создать свой "революционный", новый и единственный работающий system. :D

Ну, я использую виртуальный эмулятор (Oracle VM Virtual Box), для которого я создаю новую неизвестную операционную систему с диском vmdk. Мне нравится vmdk, потому что это просто файлы, поэтому я могу вставьте мой загрузчик в первые 512 байт виртуального жесткого диска.

Теперь я пытаюсь прочитать следующий сектор этого виртуального диска, на который я бы вставил простое ядро, которое будет отображать сообщение.

У меня два вопроса:

  • Правильно ли я читаю второй сегмент (первые -512 байт- заняты загрузчиком)? КОД:

    Чтение диска:
    мов бх, 0x8000 ; сегмент
    движения, бх
    мов бх, 0x0000 ; компенсировать
    
    мов ах, 0x02 ; функция чтения
    мов аль, 0x01 ; сектора - это может быть неправильно, пытаясь прочитать с hd
    мов кан, 0x00 ; цилиндр
    мов кл, 0x02 ; сектор
    мов дх, 0x00 ; голова
    мов дл, 0x80 ; диск - пытаюсь читать с hd
    интервал 0x13; диск внутр.
    JC ReadDisk
    jmp [es:bx] ; буфер
    

    Здесь я получаю сообщение об ошибке после проверки CF. Однако, если я использую INT 13, 1 будет последним сообщение о состоянии, AL равно 0, поэтому ошибка не сохраняется.

  • Правильно ли я вставляю свое простое ядро ​​внутри vmdk? Что я делаю, так это вставляю его после 512-го байта файла, первые 512 байт, как я уже сказал, это загрузчик.Файл будет выглядеть следующим образом:

    BE 45 7C E8 16 00 EB FE B4 0E B7 00 B3 07 CD 10 <- Первый сектор
    C3 AC 08 C0 74 05 E8 EF FF EB F6 C3 B4 00 B2 80
    CD 13 BE 5D 7C 72 F5 BB 00 80 8E C3 BB 00 00 B4
    02 B0 06 B5 00 B1 01 B6 00 B2 07 CD 13 BE 4E 7C
    72 CF 26 FF 27 57 65 6C 63 6F 6D 65 21 00 52 65
    61 64 69 6Е 67 20 65 72 72 6F 72 21 00 52 65 73
    65 74 74 69 6Е 67 20 65 72 72 6F 72 21 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA <- подпись загрузчика
    B4 0E B0 2E CD 10 EB FE 00 00 00 00 00 00 00 00 <- Начало второго сектора
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    

Таким образом я пытаюсь добавить ядро ​​во второй сектор.Как вы думаете, что в этом плохого? Спасибо!

ОБНОВИТЬ

ОК. Теперь я не получаю никаких ошибок, но я не вижу, чтобы загруженный код выполнялся. В окне должна отображаться точка:

;--------------------------------------------
; 'load.asm'
; loaded from 'boot.asm'

[org 0x8000]
[bits 16]

;--------------------------------------------

main:
mov ah, 0x0E  ; print function
mov al, '.'   ; ascii char
int 0x10   ; IO int

jmp $    ; hang
5
задан Michael Petch 29 August 2019 в 02:57
поделиться