Assembly 尝试使用BIOS中断读取磁盘时出现磁盘错误
我正试图从磁盘读取数据,但出现错误:Assembly 尝试使用BIOS中断读取磁盘时出现磁盘错误,assembly,interrupt,disk,bios,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 b
[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
[org 0x7c00];NASM引导扇区的偏移量
mov[BOOT_DRIVE],dl;还记得启动驱动器吗
mov bp,0x8000;设置堆栈的底部
mov-sp,bp;设置堆栈顶部
mov bx,0x0000
mov es,bx
mov bx,0x9000
莫夫dh,5
mov dl,[启动驱动器]
调用磁盘加载
完:;系统端
jmp端;无休止的滚动
启动驱动器:db 0
; 将DH扇区从驱动器DL加载到ES:BX
磁盘加载:
普沙
mov-ah,0x02;BIOS读扇区
莫夫艾尔,dh;读取DH扇区
mov-ch,0x00;气缸0
mov-dh,0x00;头0
mov-cl,0x02;部门2
int 0x13;BIOS读取
jc磁盘加载错误;如果错误,错误从您的代码中,我看到您认为DS=0,SS=0。你确定吗?
你为什么不对埃斯做同样的假设呢
通过将堆栈设置为0x8000,您只获得512字节的堆栈空间。这可能还不够!大多数BIOS在为您的呼叫提供服务之前不会进行堆栈切换。为什么不使用MOV SP,0x7C00
初始化SP?
这将消除BIOS覆盖引导扇区的可能性。这是16位实模式吗?与您的问题有关吗?乍一看,我看不出它们有多相似。对于mov[BOOT_DRIVE],dl
,我看不到初始化的DS
。您尝试先设置sp=0x8000,然后按dx将驱动器号保存在dl中,然后再按dx,mov dh,5。这将暂时消除ds的问题。