我正在研究这个'如何建立一个操作系统:
https://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf
我正在使用qemu测试我的代码。我在代码的一部分,我正在使用bios系统调用从内存中读取。这是进行调用的代码部分。
disk_load :
push dx ; Store DX on stack so later we can recall
; how many sectors were request to be read ,
; even if it is altered in the meantime
mov ah, 0x02 ; BIOS read sector function
mov al, dh ; Read DH sectors
mov dh, 0x00 ; Select head 0
mov ch, 0x00
mov cl, 0x02 ; Start reading from second sector
int 0x13 ; BIOS interrupt
jc disk_error ; Jump if error ( i.e. carry flag set )
pop dx ; Restore DX from the stack
cmp dh , al ; if AL ( sectors read ) != DH ( sectors expected )
jne disk_error ; display error message
ret
disk_error :
mov bx, DISK_ERROR_MSG
call print_string
jmp $
DISK_ERROR_MSG:
db "Disk read error", 0
我完全复制了教程中发布的内容,并且我加倍检查了所有内容,以确保它有意义。它应该工作,但是当我运行代码时,设置进位标志并调用disk_error函数。我检查了寄存器ah的值为返回值,即0xc。我查了那个值,如果我理解正确,就意味着找不到软盘。
问题是,当我注释掉错误检查时,内存读取实际上是成功的。我完成了教程,并且能够从内存中成功启动内核。
发生了什么事?为什么我收到错误标志并返回值表示如果读取实际成功则无法找到磁盘?