Assembly Bochs:INT13_软盘:ctrl未就绪
我对bochs读取我的软盘驱动器有问题。读取几个扇区(1-10)后,bochs退出,出现以下错误: [BIOS]int13_软盘:ctrl未就绪 执行中断13h时发生错误,但提供给中断的参数似乎没有问题: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
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详细信息。然而,这并不能使您的代码成为一个问题,因为它仍然无法独立地组装和执行以重现您的问题。关于你的下一个问题,请提供这样一个答案。