最近看了于渊的的书,自已动手试了试,可是无法正常运行,烦请各位帮看看是哪不对?
.model tiny
.386p
org 0100h
begin:JMP start
Addr dw 2 dup(0)
codeAddr dd 2 dup(0)
;GDT
Label_gdt: Descriptor 0,0,0
Label_Desc_Code: Descriptor 0,SegCodeLen-1,DA_C OR DA_32
Label_Desc_Vide: Descriptor 0b800h,0ffffh,DA_DRW
GdtLen equ $ -Label_gdt
GdtPtr dw GdtLen-1
dd 0
;
SelectorCode equ Label_Desc_Code - Label_gdt
SelectorVide equ Label_Desc_Vide - Label_gdt
start:
MOV ax,cs
MOV ds,ax
MOV es,ax
MOV ss,ax
MOV sp,0100h
MOV word ptr [Addr],0
MOV word ptr [Addr+2],SelectorCode
XOR eax,eax
MOV ax,cs
SHL eax,4
MOV word ptr [codeAddr],offset Label_Seg_Code
ADD eax, [codeAddr]
MOV word ptr [Label_Desc_Code+2],ax
SHR eax,16
MOV byte ptr [Label_Desc_Code+4],al
MOV byte ptr [Label_Desc_Code+7],ah
;计算GDT的实际地址,并将其保存在dword [GdtPtr+2]的单元内
XOR eax,eax
MOV ax,ds
SHL eax,4
ADD eax,dword ptr Label_gdt
MOV dword ptr [GdtPtr+2],eax
LGDT QWORD ptr GdtPtr
cli
in al,92h
OR al,00000010h
OUT 92h,al
MOV eax,cr0
OR eax,1
MOV cr0,eax
JMP dword ptr [Addr]
Label_Seg_Code:
MOV ax,SelectorVide
MOV gs,ax
MOV edi,(80*10+0)*2
MOV ah,0Ch
MOV al,'p'
MOV gs:[edi],ax
JMP $
SegCodeLen equ $ - Label_Seg_Code
end begin
用masm5.0编译后正常,可是运行是无法正常运行。烦请各位指正是那里错了?谢谢
------解决方案--------------------------------------------------------
那建议你还是自己摸索得好,他的只是个思路,完全按照他的代码来反而会困惑
linux内核偶也看了,觉得代码写的挺好的,不像他的这么乱,使用了这么多的宏。
自己可以完全按照他的思路做一个简单的实现,等成功之后再做一些完善,我是这么做的,觉得效果还好
------解决方案--------------------------------------------------------
OR al,00000010h 错了,改成 OR al,00000010b
另外很多电脑用这种方法开不了A20。
代码很烂。不过保护模式方面的书很少,凑合看吧。