You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QEMU执行代码后重启而非停机问题求助(NASM+X86_64环境)

问题:QEMU中32位保护模式代码执行后系统重启而非停机

我在NASM和QEMU x86_64环境下编写引导程序,启动QEMU后代码能正常执行,但执行完毕后系统会重启,而非保持停机状态。尝试使用-nographic参数运行,控制台仍出现相同问题,推测可能是切换到保护模式时存在异常。

编译与运行命令

  • 编译命令:nasm -f bin .\src\boot\bootloader\bootloader.s -o .\build\build.bin -i .\src\boot\bootloader
  • 运行命令:qemu-system-x86_64 -hda .\build\build.bin

相关代码

bootloader.s

[org 0x7C00]
[bits 16]

_start:
    ; 初始化栈
    mov bp, 0x9000
    mov sp, bp

switch:
    ; 禁用中断
    cli

    ; 加载GDT
    lgdt [gdt_descriptor]

    ; 切换到32位保护模式
    mov eax, cr0
    or eax, 0x1
    mov cr0, eax

    jmp CODE:init

[bits 32]
init:
    ; 更新段寄存器
    mov ax, DATA
    mov ds, ax
    mov ss, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    ; 更新栈指针
    mov ebp, 0x90000
    mov esp, ebp

    ; 恢复中断
    sti

    call begin

[bits 32]
begin:
    mov eax, string
    call print
    jmp $

%include "gdt.s"
%include "print.s"

string: db "Hello World!", 0x0

times 510-($-$$) db 0
dw 0xAA55

gdt.s

[bits 16]

    ; GDT描述符
gdt_descriptor:
    dw gdt_end - gdt_start - 1
    dd gdt_start

    ; GDT表
gdt_start:
    dd 0
    dd 0

gdt_code:
    dw 0xFFFF
    dw 0x0
    db 0x0
    db 10011010b
    db 11001111b
    db 0x0

gdt_data:
    dw 0xFFFF
    dw 0x0
    db 0x0
    db 10010010b
    db 11001111b
    db 0x0

gdt_end:

CODE EQU gdt_code - gdt_start
DATA EQU gdt_data - gdt_start

内容的提问来源于stack exchange,提问作者OutsideApe3019

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:54:56