我只是想从磁盘读取数据,但是我收到错误:
[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
答案 0 :(得分:0)
从您的代码中我看到您认为DS = 0且SS = 0。你确定吗?
为什么不为ES做同样的假设?
通过将堆栈设置为0x8000,您只需获得512字节的堆栈空间。这可能还不够!在为您的通话服务之前,大多数BIOS都没有进行堆叠切换。为什么不用MOV SP,0x7C00
初始化SP?
这将消除BIOS覆盖启动器的可能性。