本程序利用BIOS的INT15中斷來訪問擴展內存,運行時需要一個文件內容,寫到內存中
方法/步驟
首先打開VC++6.0
選擇文件,新建
選擇C++ source file 新建一個空白文檔
先聲明頭文件
#include
#include
#include
#include
下面是幾個結構體
定義GDT描述符表項結構
struct DESCRIPTION
{
unsigned int size;
unsigned int low16;
unsigned int high8;
unsigned char arribution;
unsigned int res;
};
定義全局地址描述索引表結構
struct GDT
{
struct DESCRIPTION NullDsc;
struct DESCRIPTION GDTDsc;
struct DESCRIPTION SrcDsc;
struct DESCRIPTION DstDsc;
struct DESCRIPTION BioscsDsc;
struct DESCRIPTION BiosssDSC;
};
unsigned char *buffer;
long filelength=0;
long loop;
struct GDT gdtAddrTable={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0x93,0},{0,0,0,0x93,0},{0,0,0,0,0},{0,0,0,0,0}};
下面是幾個函數
定義函數GetEmmsize獲取擴展內存容量
unsigned int GetEmmsize()
{
union REGS rd,op;
rd.h.ah=0x88;
int86(0x15,&rd,&op);
return op.x.bx;
}
設置源數據塊地址表項值
struct GDT SetSrcaddr(struct GDT *emm,long emmaddr,unsigned size)
{
emm->SrcDsc.low16=emmaddr&0x0ffff;
emm->SrcDsc.high8=emmaddr>>16;
emm->SrcDsc.size=size;
return (*emm);
}
設置目的數據塊地址表項值
struct GDT SetDstaddr(struct GDT *emm,long emmaddr,unsigned size)
{
emm->DstDsc.low16=emmaddr&0x0ffff;
emm->DstDsc.high8=emmaddr>>16;
emm->DstDsc.size=size;
return (*emm);
}
源數據塊到目的數據塊之間的數據傳遞
void TrasData(struct GDT *emm,unsigned size)
{
union REGS in,out;
struct SREGS seg;
seg.es=FP_SEG(emm);
in.x.si=FP_OFF(emm);
in.x.cx=size>>1;
in.x.ax=0x8700;
int86x(0x15,&in,&out,&seg);
}
定義函數向擴展內存中寫數據
int InputEmm(char *filename,long emmaddr)
{
FILE *fp;
long size,addr;
unsigned num,i,buffersize=0x8000;
if(!(fp=fopen(filename,"rb")))
{
printf("can't open file %s \n",filename);
exit(0);
}
fseek(fp,0L,SEEK_END);
filelength=ftell(fp);
rewind(fp);
size=GetEmmsize();
/*計算數據文件的頁數*/
loop=filelength/buffersize+1;
/*計算地址*/
addr=FP_SEG(buffer);
addr=(addr<<4)+FP_OFF(buffer);
/*設置源數據塊地址表項值*/
SetSrcaddr(&gdtAddrTable,addr,buffersize);
addr=emmaddr;
/*依次將各頁寫入到擴展內存中去*/
for(i=0;i
{
num=fread(buffer,sizeof(char),buffersize,fp);
SetDstaddr(&gdtAddrTable,addr,num);
TrasData(&gdtAddrTable,num);
addr=addr+buffersize;
}
fclose(fp);
return 1;
}
主函數
int main(int argc,char **argv)
{
int i=0;
if(argc!=2)
{
printf("Please input the sourcefile\n");
return 0;
}
buffer=malloc(0x8000*sizeof(char));
if(!buffer)
{
printf("malloc memery error!\n");
exit(0);
}
i=InputEmm(argv[1],0x400000);
if(i==1)
printf("Input the file %s to extend memorsy successfully!\n",argv[1]);
else
printf("Input the file to extend memory error\n");
free(buffer);
getch();
return 1;
}