Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 尝试使用BIOS中断读取磁盘时出现磁盘错误_Assembly_Interrupt_Disk_Bios - Fatal编程技术网

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的问题。