以后告诉你 2015-01-08 14:07 采纳率: 0%
浏览 1976

自己动手写操作系统程序调试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, 92h

or 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]

  • 写回答

1条回答

  • diMneEgfILL 2016-01-01 09:30
    关注

    我也遇到了同样的问题,但是后来仔细看了一下书之后发现,作者的意思不是把这段代码编译成bin文件直接放到虚拟机里。作者的意思是我们先得有个
    DOS系统,然后在DOS下运行编译后得到的文件。这个需要DOS在实模式下的引导。

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)