自己动手写操作系统程序调试cpu关闭

问题描述

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

解决方案

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

时间: 2024-09-09 11:13:42

自己动手写操作系统程序调试cpu关闭的相关文章

ubuntu bochs-新手,学习自己动手写操作系统,卡在bochs配置,求大神救助

问题描述 新手,学习自己动手写操作系统,卡在bochs配置,求大神救助 1.bochs版本:bochs-2.6.8 编译前配置:提取文件,打开目录,在终端中打开; ./configure --enable debugger --enable-disasm sudo make sudo make install 安装完成,提前安装了一些需要的程序,未报错. 2.编辑bochesrc sudo gedit 然后用gedit打开/ect/bochs-init/bochsrc,编辑内容如下: #####

中断处理-关于自己动手写操作系统中嵌套中断的处理

问题描述 关于自己动手写操作系统中嵌套中断的处理 Oragner's 操作系统中时钟中断, 为了防止嵌入中断这里添加了 k__reenter 这个变量初始化为 -1, 在发生第一次中断时 inc [k_reenter] 将, k_reenter 变为0, 将进入输出 ^ 进入 delay 中由于延时将再次导致中断,这时 k_reenter 变为1,退出中断处理 k_reenter 变为0 当再次进入中断时, 每次 k_reenter 都变为 1 了,按道理应该直接就退出中断处理了,但为什么还是会

自己动手写操作系统源代码编译,链接错误,求解。

问题描述 自己动手写操作系统源代码编译,链接错误,求解. 自己动手写操作系统源码(D:Tinixchapter5h),编译结果如下: $ MAKE ld -s -Ttext 0x30400 -o kernel.bin kernel/start.o lib/string.o lib/klib.o kernel/kernel.o kernel/start.o:start.c:(.text+0xe): undefined reference to disp_str' kernel/start.o:st

自己动手写ASP.NET ORM框架(二):AdoHelper支持多数据库操作的封装(2)

在上一篇文章中已经分析了AdoHelper的部分代码,接下来将继续分析剩余的部分代码,这里分析ExecuteNonQuery方法的实现,代码块1-1: // <summary>//通过提供的参数,执行无结果集的数据库操作命令// 并返回执行数据库操作所影响的行数.// </summary>// <param name="connectionString">数据库连接字符串</param>// <param name="co

我想设计一个程序,点击关闭后会自动跳转到一个网址,请问代码怎么写

问题描述 我想用VC6.0设计一个程序,点击关闭(即右上角X号)后会自动跳转到一个网址(www.xxxx.com),请问代码怎么写小弟是个菜鸟,请说得详细些,好吗?谢谢! 解决方案 解决方案二:在关闭事件里system"iexplore.exehttp://xxxxx"先拦截关闭事件吧,俺用拦截SYS_COMMAND来实现,参数忘了.解决方案三:你响应窗口的WM_SYSCOMMAND消息,重载OnSysCommand函数,点X时查看传进来的参数是什么,以后可以判断遇到这样的参数是就是关

最原始的问题,高手帮忙解决一下吧——c#写的控制台怎么样让按回车键程序也不关闭啊,任意键也不关闭,只能关闭按钮关闭,解决马上结贴

问题描述 最原始的问题,高手帮忙解决一下吧--c#写的控制台怎么样让按回车键程序也不关闭啊,任意键也不关闭,只能关闭按钮关闭,解决马上结贴 解决方案 解决方案二:最后加上:while(true){Console.ReadKey(false);} 解决方案三:while(true){stringText=Console.ReadLine();//判断输入不管怎么样都是返回等待状态...}解决方案四:说白了,就是一直处于挂起状态解决方案五:我里面还有计时器,到每天的某个时间要访问数据库处理东西的,那

vs2012-C# 写的form程序 调试时突然出先“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”

问题描述 C# 写的form程序 调试时突然出先"尝试读取或写入受保护的内存.这通常指示其他内存已损坏." 前几天写的一个程序,今天准备用了,当打开exe文件的时候突然停止,然后进入vs2012调试报错,在数据库链接那个块的打开数据库(看图片),不知道怎么回事.昨天是用还好着呢,还有将exe文件放到别人的电脑上就可以是用!求各路大神给个觉解方法吧!急急急啊!还有个问题,所有链接数据库的方法都抱着个错! 解决方案 C#尝试读取或写入受保护的内存.这通常指示其他内存已损坏.C#尝试读取或写

图片-为什么我写的这个程序调试不了,求解

问题描述 为什么我写的这个程序调试不了,求解 解决方案 在第一个if那里的括号改正过来还是调试和不了. 解决方案二: 看错误提示什么内容就知道不能调试原因了.

.net的MVC程序调试后iisexpress.exe Cpu占用率很高

问题描述 .net的MVC程序调试后iisexpress.exeCpu占用率很高一调试就占用25%了I5的处理器页面刷新去还能到50%这个是什么原因啊 解决方案 解决方案二:自己找到原因了送分了解决方案三: 解决方案四: 解决方案五:接分来了