Как исправить ошибку «неверная команда» из прерывания 0x13 в сборке x86?(реальный режим) - PullRequest
0 голосов
/ 04 мая 2019

Недавно я работал над небольшим (реальным режимом) загрузочным кодом и столкнулся с некоторыми проблемами с 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 $
...