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
相关产品推荐
相关产品推荐

