首页 > 解决方案 > 如何修复 x86 程序集中中断 0x13 中的“无效命令”错误?(实模式)

问题描述

我最近一直在编写一个小型(实模式)引导代码,并且遇到了一些 int 0x13 的问题。起初我试图使用'int 0x13,ah = 0x02'在引导扇区之后简单地将更多代码加载到RAM中。该输出错误代码 ah=0x01(无效命令),所以我尝试了 'int 0x13, ah= 0x41' 来尝试找出 int 0x13 是否正常工作。我在 qemu、我的戴尔 latitude E7240、我的带有 Intel DQ965GF 主板和 Q6600 CPU 的古老台式机以及各种其他更现代的 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 $

标签: assemblyx86operating-systemx86-16bootloader

解决方案


推荐阅读