📄 mem.c
字号:
#include "Mem.h"
#include "print.h"
struct GDT GdtForBios;
struct GDTPTR GdtPtrForBios;
void MoveToExtendMem(void * SrcBuf,unsigned long PhyMem,int WordSize){
unsigned long base=0;
GdtPtrForBios.limit=5*8;
GdtPtrForBios.base=0;
GdtPtrForBios.base=(unsigned long)(&GdtForBios)&0xffff;
/*以下代码取得数据段物理地址*/
_asm{
push ax
mov ax,ds
mov word ptr base,ax
pop ax
}
base=(base<<4);
GdtPtrForBios.base=base+GdtPtrForBios.base;/*现在才是GDT表的物理地址*/
/*下面建立数据段描述符*/
GdtForBios.SrcDsc.BaseLow=(unsigned int)(base&0xffff);/*只取低16位*/
GdtForBios.SrcDsc.BaseMiddle=(unsigned char)((base>>16)&0xff);/*只取中间8位*/
GdtForBios.SrcDsc.Size=GdtForBios.DstDsc.Size=0xffff;/*最大界限*/
GdtForBios.SrcDsc.NoUse=GdtForBios.DstDsc.NoUse=0;/*最高16位清零*/
GdtForBios.SrcDsc.Attribute=GdtForBios.DstDsc.Attribute=0x92;
GdtForBios.DstDsc.BaseLow=(unsigned int)(PhyMem&0xffff);
GdtForBios.DstDsc.BaseMiddle=(unsigned char)((PhyMem>>16)&0xff);
/*以下代码取得CS*/
base=0;
_asm{
push ax
mov ax,cs
mov word ptr base,ax
pop ax
}
base=base<<4;
GdtForBios.BiosCS.Size=0xffff;
GdtForBios.BiosCS.BaseLow=(unsigned int)(base&0xffff);
GdtForBios.BiosCS.BaseMiddle=(unsigned char)((base>>16)&0xff);
GdtForBios.BiosCS.Attribute=0x98;/*代码,0级,只执行*/
GdtForBios.BiosCS.NoUse=0;
/*以下取得SS*/
base=0;
_asm{
push ax
mov ax,ss
mov word ptr base,ax
pop ax
}
base=base<<4;
GdtForBios.BiosSS.Size=0xffff;
GdtForBios.BiosSS.BaseLow=(unsigned int)(base&0xffff);
GdtForBios.BiosSS.BaseMiddle=(unsigned char)((base>>16)&0xff);
GdtForBios.BiosSS.Attribute=0x92;
GdtForBios.BiosSS.NoUse=0;
ToProtectAndCopy(SrcBuf,WordSize);
}
unsigned int GetExMemSize(void){
/*取得扩展内存大小,以K为单位*/
unsigned int retvalue;
_asm{
pusha
mov ah,88h
int 15h
mov retvalue,ax
popa
}
return retvalue;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -