以后告诉你 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 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3