第一代码,就单单第一个代码。从开始接触,到自认为明白后。再跟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...哈哈