当前位置: 代码迷 >> 汇编语言 >> 各位达人帮看看为什么小弟我这程序无法正常运行
  详细解决方案

各位达人帮看看为什么小弟我这程序无法正常运行

热度:414   发布时间:2013-02-26 00:00:00.0
各位达人帮看看为什么我这程序无法正常运行
最近看了于渊的的书,自已动手试了试,可是无法正常运行,烦请各位帮看看是哪不对?

.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。

代码很烂。不过保护模式方面的书很少,凑合看吧。
  相关解决方案