Assembly Bochs:INT13_软盘:ctrl未就绪

Assembly Bochs:INT13_软盘:ctrl未就绪,assembly,x86-16,osdev,bochs,floppy,Assembly,X86 16,Osdev,Bochs,Floppy,我对bochs读取我的软盘驱动器有问题。读取几个扇区(1-10)后,bochs退出,出现以下错误: [BIOS]int13_软盘:ctrl未就绪 执行中断13h时发生错误,但提供给中断的参数似乎没有问题: AX: 0x0201 BX: 0x0900 CX: 0x0004 DX: 0x0100 ES: 0x0000 这是软盘读取部分: ; input: ; dl -> device ; es:bx -> Buffer to read to ; ax -> Sta

我对bochs读取我的软盘驱动器有问题。读取几个扇区(1-10)后,bochs退出,出现以下错误:

[BIOS]int13_软盘:ctrl未就绪

执行中断13h时发生错误,但提供给中断的参数似乎没有问题:

AX: 0x0201 
BX: 0x0900
CX: 0x0004
DX: 0x0100
ES: 0x0000
这是软盘读取部分:

; input: 
;   dl -> device
;   es:bx -> Buffer to read to
;   ax -> Start sector
;   cx -> Number of sectors
;
; output:
;   carry -> On error

fat_read_device:
    mov di, FAT_READ_RETRIES ; retries for error -> 5

    .try_load:
        push ax
        push bx
        push cx

        push bx
        mov bl, dl ; remember device
        mov dx, ax

        int 0xe2 ; Convert lba to chs -> Writing to cl, ch and dh

        mov dl, bl
        pop bx

        mov ah, 0x02 ; Read device es:bx
        mov al, 0x01 ; Number of sectors to read
        ;xchg bx, bx
        int 0x13
        jnc .done ; test if succeeded

        xor ax, ax ; Reset disk
        int 0x13
        dec di ; decrement error counter
        pop cx
        pop bx
        pop ax
        jnz .try_load ; attempt to read again

        stc
        ret

    .done:
        int 0xcf ; Feedback disk operation -> Print a "."

        pop cx
        pop bx
        pop ax
        add bx, word [bpbBytesPerSector] ; next sector
        inc ax ; read next sector
        loop fat_read_device ; repeat until cx sectors are read
        ret
我还使用以下代码将PIT 0(可编程间隔计时器)重新编程为1000hz,而不是18.2hz:

TIMER_DIVISOR EQU 1193

timer_init:
    cli

    mov al, 36h ; PIT channel 0
    out 43h, al ; select channel

    mov ax, TIMER_DIVISOR
    out 40h, al ;send low byte
    mov al, ah
    out 40h, al ;send high byte

    sti

    mov word [cs:timer_tick_count], 0

    ret
我只有在调试模式下使用bochs时才会出现此错误。如果我在非调试模式下启动系统,它可以正常工作


有没有人遇到过同样的问题,或者有人知道我做错了什么?

你能给我们看一份所有寄存器值(包括所有段寄存器)的完整列表吗。基本上,在发生故障的
int 13h
之前,BOCHS中
REG
SREG
的完整输出。通常这种错误是由于某种内存损坏造成的。就像在堆栈顶部加载代码一样。我没有在显示的代码中看到明显的错误。它不跨越DMA边界等,CHS值似乎在1.4MB磁盘映像的标准范围内。您的问题可能不是您在此处显示的内容造成的。例如,我现在知道您修改了BIOS/Int 13h可能用于计时的PIT计时器0。我不会修改它,它可能会导致bochs正在使用的BIOS出现问题。正如Michael Petch所说,问题是由于重新编程PIT造成的,如果我不去碰它,一切都会正常工作。软盘中断使用处于默认状态(约18 Hz)的PIT计算等待驱动器所需的时间。由于PIT的频率增加(我将其设置为1000Hz),中断13h失败。两种可能的解决方案是:不重新编程PIT,或直接写入软盘控制器并自己处理计时。@fuz:这不是一个幸运的猜测;-)。我已经注意到PIT 0被设置在另一个论坛上,这是交叉发布的。感谢添加PIT 0详细信息。然而,这并不能使您的代码成为一个问题,因为它仍然无法独立地组装和执行以重现您的问题。对于你的下一个问题,请提供这样一个。你能给我们一个所有寄存器值(包括所有段寄存器)的完整列表吗。基本上,在发生故障的
int 13h
之前,BOCHS中
REG
SREG
的完整输出。通常这种错误是由于某种内存损坏造成的。就像在堆栈顶部加载代码一样。我没有在显示的代码中看到明显的错误。它不跨越DMA边界等,CHS值似乎在1.4MB磁盘映像的标准范围内。您的问题可能不是您在此处显示的内容造成的。例如,我现在知道您修改了BIOS/Int 13h可能用于计时的PIT计时器0。我不会修改它,它可能会导致bochs正在使用的BIOS出现问题。正如Michael Petch所说,问题是由于重新编程PIT造成的,如果我不去碰它,一切都会正常工作。软盘中断使用处于默认状态(约18 Hz)的PIT计算等待驱动器所需的时间。由于PIT的频率增加(我将其设置为1000Hz),中断13h失败。两种可能的解决方案是:不重新编程PIT,或直接写入软盘控制器并自己处理计时。@fuz:这不是一个幸运的猜测;-)。我已经注意到PIT 0被设置在另一个论坛上,这是交叉发布的。感谢添加PIT 0详细信息。然而,这并不能使您的代码成为一个问题,因为它仍然无法独立地组装和执行以重现您的问题。关于你的下一个问题,请提供这样一个答案。