X86 QEMU提供空白输出,即使VGA内存已初始化

X86 QEMU提供空白输出,即使VGA内存已初始化,x86,nasm,qemu,bootloader,osdev,X86,Nasm,Qemu,Bootloader,Osdev,我正从这篇精彩的文章()中学习编写自己的操作系统。从16位实模式进入32位保护模式时,我面临一个奇怪的问题。我写的代码应该在16位模式下(使用中断)输出一个句子,在进入32位模式后(通过初始化VGA内存)再次输出一个句子。然而,由于某种原因,qemu中只打印第一句话。以下是代码的相关部分: 主引导扇区代码 [org 0x7c00] mov bp, 0x9000 mov sp, bp mov bx, MSG_REAL_MODE call print_string

我正从这篇精彩的文章()中学习编写自己的操作系统。从16位实模式进入32位保护模式时,我面临一个奇怪的问题。我写的代码应该在16位模式下(使用中断)输出一个句子,在进入32位模式后(通过初始化VGA内存)再次输出一个句子。然而,由于某种原因,qemu中只打印第一句话。以下是代码的相关部分:

主引导扇区代码

[org 0x7c00]

    mov bp, 0x9000
    mov sp, bp

    mov bx, MSG_REAL_MODE
    call print_string
    call print_newline

    call switch_to_pm

    jmp $

    %include "print_string.asm"
    %include "gdt.asm"
    %include "print_string_pm.asm"
    %include "switch_to_pm.asm"

[bits 32]

    BEGIN_PM:

        mov ebx, MSG_PROT_MODE
        call print_string_pm

        jmp $

    MSG_REAL_MODE db "Started in 16-bit Real Mode", 0
    MSG_PROT_MODE db "Loaded 32-bit Protected Mode", 0

    times 510-($-$$) db 0
    dw 0xaa55
32位打印功能

[bits 32]

VIDEO_MEMORY equ 0xb8000
WHITE_ON_BLACK equ 0x0f

print_string_pm:
    pusha
    mov edx, VIDEO_MEMORY

print_string_pm_loop:
    mov al, [ebx]
    mov ah, WHITE_ON_BLACK

    cmp al, 0
    je print_string_pm_done

    mov [edx], ax

    add ebx, 1
    add edx, 2

    jmp print_string_pm_loop

print_string_pm_done:
    popa
    ret

要以32位模式打印的文本已存储在寄存器ebx中。

是否确实未打印?我猜它在第一行屏幕的最顶端,但是你错过了。本教程有一些问题,因为它们没有加载DS寄存器,所以DS不能保证是一个特定的值(它只是碰巧在模拟器中工作)。我碰巧有一个答案是肯定的,事实上就是这样。这是我犯的一个非常愚蠢的错误,代码覆盖了qemu标题文本,我错过了。不用担心,你不是第一个犯这个错误的人。