Я пишу простую ОС в реальном режиме ASM для удовольствия. Недавно я решил перейти к файловой системе. Я собрал код с
nasm -f bin -o boot.o boot.asm
nasm -f bin -o kernel.o kernel.asm
nasm -f bin -o fs.o fs.asm
dd if=boot.o bs=512 of=os.img
dd if=kernel.o bs=512 of=os.img seek=1
dd if=fs.o bs=512 of=os.img seek=2
В моем загрузчике я загружаю файловую систему по адресу 0x1000: 0000, а мое ядро - по адресу 0x2000: 0000. Каждый по 512 байт (пока что) довольно мало. Итак, чтобы протестировать мою новую файловую систему, я написал ядро, которое выводит первую букву имени первого файла в таблице. Он помещает значение 0x2000 в si, перемещает байт по адресу в si в al. Затем он передает 0x0e в ah и вызывает int 0x10. Затем он останавливается. Однако, когда я загружаю ос в qemu, он просто показывает мне информацию о BIOS, говорит о загрузке с дискеты, а затем ничего не делает. Нет письма. Ничего такого. Вот соответствующий код:
соответствующий код загрузчика
;;the part that loads the file system.
;;The part for the kernel is identical, except that cl is 02 and bx is 0x2000
mov ah, 02
mov al, 01
mov ch, 00
mov cl, 03
mov dh, 00
mov dl, 00
mov bx, 0x1000
mov es, bx
xor bx, bx
int 0x13
;;jumps to address 0x2000 (where the kernel is)
mov ax, 0x2000
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
xor ax, ax
jmp 0x2000
;;halts
hlt
соответствующий код ядра
;;gets address
mov si, 0x1000
;;loads al
mov al, [si]
;;prints
mov ah, 0x0e
int 0x10
;;halts
hlt
соответствующий код файловой системы
;;declares first file (it is hard coded for testing purposes)
;;format: [name], [sector number], [number of sectors to load]
db 'file.bin', 4, 1
Если я сделал что-то неприятное при публикации этого сообщения, пожалуйста, простите меня, так как это мой первый пост.