【问题标题】:Disk error when trying to read disk with BIOS interrupt尝试使用 BIOS 中断读取磁盘时出现磁盘错误
【发布时间】:2014-11-29 06:30:13
【问题描述】:

我只是想从磁盘读取数据,但出现错误:

[org 0x7c00]                ; Offset to the boot sector for NASM

mov [BOOT_DRIVE], dl        ; Remember boot drive
mov bp, 0x8000              ; Set up base of the stack
mov sp, bp                  ; Set up top of the stack

mov bx, 0x0000
mov es, bx
mov bx, 0x9000
mov dh, 5
mov dl, [BOOT_DRIVE]
call disk_load

end:                        ; System end
    jmp end                 ; Endless scrolling

BOOT_DRIVE: db 0

; load DH sectors to ES:BX from drive DL
disk_load:
    pusha
    mov ah, 0x02            ; BIOS read sector
    mov al, dh          ; Read DH sectors
    mov ch, 0x00            ; Cylinder 0
    mov dh, 0x00            ; Head 0
    mov cl, 0x02            ; Sector 2
    int 0x13            ; BIOS read
    jc disk_load_error  ; If error, error <<< this jump happens
    popa
    ret
disk_load_error:
    mov ax, DISK_ERROR
    call print_string
    jmp $

DISK_ERROR: db "Disk error!", 0

; ... utility print procedures omitted

times 510-($-$$) db 0       ; Fitting into 512 bytes
dw 0xaa55                   ; Magic for the BIOS

times 256 dw 0xdada         ; Test data
times 256 dw 0xface         ; Test data

【问题讨论】:

  • 这是16位实模式吗?
  • THIS QUESTION 与您的问题有关吗?乍一看,我不知道它们有多相似
  • 我看不到 DSmov [BOOT_DRIVE], dl 的初始化。
  • 您尝试先设置 sp = 0x8000,然后按 dx 将驱动器号保存在 dl 中,然后再弹出 dx, mov dh, 5。这将暂时消除 ds 的问题。

标签: assembly interrupt disk bios


【解决方案1】:

从您的代码中,我看到您认为 DS=0 和 SS=0。你确定吗?
为什么不对 ES 做同样的假设呢?

通过在 0x8000 设置堆栈,您仅获得 512 字节的堆栈空间。这可能还不够!大多数 BIOS 在为您提供服务之前不会进行堆栈切换。为什么不用MOV SP,0x7C00 初始化 SP?
这将消除 BIOS 覆盖您的引导扇区的可能性。

【讨论】:

    猜你喜欢
    • 2014-07-23
    • 2015-10-15
    • 2019-03-20
    • 2020-01-03
    • 1970-01-01
    • 2016-08-13
    • 2021-12-11
    • 2018-05-09
    • 2016-06-02
    相关资源
    最近更新 更多