Недавно я работал над небольшим (реальным режимом) загрузочным кодом и столкнулся с некоторыми проблемами с int 0x13.Сначала я пытался использовать int 0x13, ah = 0x02, чтобы просто загрузить больше кода в оперативную память сразу после загрузочного сектора.Этот выходной код ошибки ah = 0x01 (недопустимая команда), поэтому я попытался 'int 0x13, ah = 0x41', чтобы попытаться выяснить, работает ли int 0x13.Я попробовал это на qemu, моей dell latitude E7240, моем старом настольном компьютере с материнской платой Intel DQ965GF и процессором Q6600, а также в ассортименте других более современных компьютеров x86.Конечно, qemu работал, но единственным реальным компьютером, который работал, был рабочий стол DQ965GF, все остальные компьютеры выводили код ошибки ah = 0x01 (недопустимая команда).Любая помощь будет принята с благодарностью!Спасибо!Вот код ошибки:
Да, я не забыл определить таблицу разделов и магический загрузочный номер, и да, я уверен, что printHex работает.Я использовал это для отладки.
[org 0x7c00]
[bits 16]
jmp start
bootDrive db 0
start:
mov [bootDrive], dl ; Stores the drive # in bootDrive
; Inits all relevant registers------------------------------------------
xor si, si
xor di, di
mov ax, 0x7c00
mov bp, ax ; Set bp (base pointer) for our stack
mov sp, ax ; Set sp (stack pointer) equal to the bp
mov ax, 0x0000
mov ss, ax ; Set ss (stack segment) to zero
mov ds, ax ; Set ds (data segment) to zero
mov es, ax
; Inits all relevant registers------------------------------------------
; Boot code goes here---------------------------------------------------
mov ax, 0x0000 ; int 10/ah= 0x00 -> set video mode (clear screen)
int 0x10
mov ah, 0x41
mov dl, [bootDrive]
mov bx, 0x55AA
int 0x13 ; Check extentions present
jc .errMain ; If theres an error
mov dx, cx ; Print Extensions
call printHex
jmp .done
.errMain:
mov dx, ax ; Print Error Code
call printHex
.done:
jmp $