Виртуальная коробка vdi nasm jump

Я занимаюсь исследованием загрузчиков. То есть я пытаюсь написать простой загрузчик с nasm, который будет работать в VB (vdi disk). На данный момент я настроил виртуальную среду для тестирования и успешно загрузил MBR, который находится по абсолютному адресу (HXD hex edito) 0x2000. Но теперь я хочу выйти за пределы MBR (0x2200 с прямым порядком байтов) и выполнить код, который находится там (фрагмент кода Bellow не выполняет свою работу). Я использую директиву NASM [org 0x7C00], нужно ли использовать это смещение при выполнении прыжков?

[BITS 16]
[org 0x7C00]

%define location 0x0022

start:

    mov al, 0x12
    mov ah, 0
    int 0x10

    jmp location:0000

TIMES 510 - ($ - $$) db 0
DW 0xAA55

Это шестнадцатеричный вид из vdi (2000h - это то место, где начинается MBR, 2200h - то, куда я хочу перейти):

Шестнадцатеричный вид

1 ответ

Решение

Загрузочный сектор будет загружен по адресу 0x7c00 (который из-за особенностей сегментов реального режима может быть адресован несколькими способами. Двумя общими являются 0:0x7c00 и 0x7c0:0 - вам не следует полагаться на конкретный). Тот факт, что он имеет смещение 0x2000 в образе вашего диска, возможно, связан с форматом указанного образа, он не имеет отношения к адресу памяти. Кроме того, процесс загрузки загружает только один сектор размером 512 байт, если вам нужно больше, вы должны загрузить его самостоятельно. Затем вы можете перейти к нему, используя адрес, на который вы загрузили его.

Другие вопросы по тегам