尝试使用BIOS中断读取磁盘时出现磁盘错误

时间:2014-10-04 10:15:05

标签: assembly interrupt disk bios

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

[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

1 个答案:

答案 0 :(得分:0)

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

通过将堆栈设置为0x8000,您只需获得512字节的堆栈空间。这可能还不够!在为您的通话服务之前,大多数BIOS都没有进行堆叠切换。为什么不用MOV SP,0x7C00初始化SP? 这将消除BIOS覆盖启动器的可能性。