devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻

Как загрузить код с диска в оперативную память в реальном режиме ассемблера?

Всем привет. Пытаюсь написать программу, которуя будет загружать свой код с диска(т.к. 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, тоже самое.
  • Вопрос задан
  • 464 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Головки нумеруются с 0. Поправь в первом примере mov dh, 1 на mov dh, 0 и увидишь свои &.&.&.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы