Всем привет. Пытаюсь написать программу, которуя будет загружать свой код с диска(т.к. bios загружает только 512 байт) в память и передавать туда управление. Код получился такой:
use16
org 0x7c00
section .text
start:
mov al, '&'
mov ah, 0x0E; номер функции BIOS
mov bh, 0; страница видеопамяти
int 0x10; выводим символ
push es
push ds
mov ax, 0x100 ; сегмент куда пишем
mov es, ax
mov bx, 0; адрес куда пишем
mov ch, 0; дорожка 0
mov cl, 2 ; начиная с сектора 2
mov dl, 0x80; номер диска
mov dh, 1; номер головки
mov ah, 2; номер функции
mov al, 1;считать 1 сектор
int 0x13
jnc .no_error
mov al, '!'
mov ah, 0x0E; номер функции BIOS
mov bh, 0; страница видеопамяти
int 0x10; выводим символ
jmp $
.no_error:
pop ds
pop es
jmp 0x100:0
finish:
times 0x1FE-finish+start db 0; тут выравниваем блок кода до размера сектора(512 байт)
db 0x55, 0xAA; сигнатура загрузочного сектора
main:
mov al, '.'
mov ah, 0x0E; номер функции BIOS
mov bh, 0; страница видеопамяти
int 0x10; выводим символ
jmp 0:0x7c00
но он выдаёт ошибку(carry flag = 1) после попытки прочитать второй сектор с диска, где должен быть код после метки main. Код ошибки 12(регистр ah) что бы это ни значило. Также нашёл код для чтения в LBA режиме, он как я понял должен читать первый сектор с диска(т.е. сам себя), но там тоже ошибка:
use16
org 0x7c00
section .text
start:
load:
mov al, '&'
mov ah, 0x0E; номер функции BIOS
mov bh, 0; страница видеопамяти
int 0x10; выводим символ
mov ax, 0x100
mov ds, ax
mov ah, 0x42; читать в LBA режиме
mov dl, 0x80
mov si, 0x0
int 0x13
jnc no_error
mov al, '!'
mov ah, 0x0E; номер функции BIOS
mov bh, 0; страница видеопамяти
int 0x10; выводим символ
jmp $
no_error:
jmp 0x100:0; прыгаем туда, куда загрузили
finish:
times 0x1FE-finish+start db 0
db 0x55, 0xAA; сигнатура загрузочного сектора
main:
mov al, '.'
mov ah, 0x0E; номер функции BIOS
mov bh, 0; страница видеопамяти
int 0x10; выводим символ
Компилю так: nasm -f bin code.asm
Запускаю так: qemu-system-i386 code
Пробовал подключать как дискету и в dl писать 0, тоже самое.