保护模式第三章

来源:互联网 发布:智能电视直播软件2016 编辑:程序博客网 时间:2024/05/21 10:31

 第一代码,就单单第一个代码。从开始接触,到自认为明白后。再跟Xinix去讨论,又发现不足。再继续深入学习。还自作聪明的把代码抄出来,做个全面了解。花去的时间有3天了。今天中午没事干,把代码敲了一遍。一运行。错误。在nasm里面是通过的,但在dos下面就不能正确显示出P来。对着书,对照了起码有3遍,才发现一个错误。以为可以了,在dos下,系统还是崩溃了。奇怪,太奇怪了。我还把光碟上的代码和自己的写的代码放到word里面,启用对照功能。晕菜了,哈哈,最后真的有种崩溃的感觉。还好,自己静下心来,在一遍一遍的回想代码的过程。慢慢对照。结果就发现了自己的错误在那。呵呵,在对错的时候,脑海里面一直想着:电脑是不会出错的,错了,就是自己的程序有问题。 编程就是这样,一点马虎都不行。要有耐心和细心。

下面把今天自己的代码贴出来,警示以后要更加努力:

%include  "pm.inc"
org 0100h
  jmp LABEL_BEGIN

[SECTION .gdt]
;GDT
LABEL_GDT:   Descriptor 0, 0, 0
LABEL_DESC_CODE32:Descriptor 0, SegCode32Len - 1, DA_C +DA_32
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW

;GDT END

GdtLen equ $ -LABEL_GDT
GdtPtr dw  GdtLen - 1
   dd  0

;GDT选择子 
SelectorCode32  equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorVideo  equ LABEL_DESC_VIDEO - LABEL_GDT

;END OF [SECTION .gdt]

[SECTION .s16];漏掉了.后面的s
[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_SEG_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
 mov dword [GdtPtr+2], eax ;忘记+2

 lgdt [GdtPtr]

 cli

 in  al, 92h
 or  al,00000010b
 out 92h, al


 mov eax, cr0
 or  eax, 1
 mov cr0, eax


 jmp dword SelectorCode32:0

 [SECTION .s32]
 [BITS 32]

 LABEL_SEG_CODE32:


  mov ax, SelectorVideo
  mov gs, ax
  mov edi, (80*10+0)*2
  mov ah, 0CH
  mov al, 'P'       
  mov [gs:edi], ax

  jmp $
 SegCode32Len equ  $ - LABEL_SEG_CODE32
;END OF[SECTION .S32]
一共是3个错误,要是给Xinix知道了,非给他笑掉大牙不可。o(∩_∩)o...哈哈

原创粉丝点击