Bios系统调用引发标志,但仍然正确读取内存

时间:2016-10-26 13:02:35

标签: x86 operating-system

我正在研究这个'如何建立一个操作系统:

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。我查了那个值,如果我理解正确,就意味着找不到软盘。

问题是,当我注释掉错误检查时,内存读取实际上是成功的。我完成了教程,并且能够从内存中成功启动内核。

发生了什么事?为什么我收到错误标志并返回值表示如果读取实际成功则无法找到磁盘?

0 个答案:

没有答案