问题描述
- 自己动手写操作系统程序调试cpu关闭
-
直接在裸机上运行此程序,电脑直接重起。
本人的cpu是i5 4590,程序该如何改?
%include "pm.inc"
org 7c00h
jmp LABEL_BEGIN
;[SECTION.GDT]
;GDT
LABEL_GDT: Descriptor 0,0,0 ;空描述符
LABEL_DESC_CODE32: Descriptor 0,SegCode32Len-1,DA_C+DA_32
;代码段,32位
LABEL_DESC_VIDEO: Descriptor 0B8000h,0ffffh,DA_DRW
;显存首地址
;GDT结束
GdtLen equ $-LABEL_GDT ;GDT长度
GdtPtr dw GdtLen ;GDT界限
dd 0 ;GDT基址
;GDT选择子
SelectorCode32 equ LABEL_DESC_CODE32-LABEL_GDT
SelectorVedio equ LABEL_DESC_VIDEO-LABEL_GDT
;END of [SECTION.GDT]
;[SECTION.S16]
;[BITS 16]
LABEL_BEGIN:
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0100h
;初始化32位代码段描述符
xor eax,eax
mov ax,cs
shl eax,4
add eax,LABEL_DESC_CODE32
mov word [LABEL_DESC_CODE32+2],ax
shr eax,16
mov byte [LABEL_DESC_CODE32+4],al
mov byte [LABEL_DESC_CODE32+7],ah
;为加载gdtr做准备
xor eax,eax
mov ax,ds
shl eax,4
add eax,LABEL_GDT ;eax<-GDT基址
mov dword [GdtPtr+2],eax ;[GdtPtr+2]<-GDT基址
;加载gdtr
lgdt [GdtPtr]
;关中段
cli
;打开20号地址线
in al, 92hor al, 00000010b
out 92h, al
;准备切换到保护模式 mov eax, cr0 or eax, 1 mov cr0, eax ;进入保护模式 jmp dword SelectorCode32:0 ;加载cs,跳至32位代码段
;[SECTION.s32]
;[BITS 32]
LABEL_SEG_CODE32:
mov ax,SelectorVedio
mov gs,ax ;装载视频段选择子
mov edi,(80*30+40)*2 ;屏幕第30行,40列
mov ah,0Ch ;0000黑底,1100红字
mov al,'P'
mov [gs:edi],ax
;到此停止
jmp $
SegCode32Len equ $-LABEL_SEG_CODE32
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节dw 0xaa55 ; 结束标志
;END of[SECTION.s32]
解决方案
我也遇到了同样的问题,但是后来仔细看了一下书之后发现,作者的意思不是把这段代码编译成bin文件直接放到虚拟机里。作者的意思是我们先得有个
DOS系统,然后在DOS下运行编译后得到的文件。这个需要DOS在实模式下的引导。
时间: 2024-09-09 11:13:42