C語言實現擴展內存的訪問?

Tags: 語言, 內存,

本程序利用BIOS的INT15中斷來訪問擴展內存,運行時需要一個文件內容,寫到內存中

方法/步驟

首先打開VC++6.0

C語言實現擴展內存的訪問

選擇文件,新建

C語言實現擴展內存的訪問

選擇C++ source file 新建一個空白文檔

C語言實現擴展內存的訪問

先聲明頭文件

#include

#include

#include

#include

C語言實現擴展內存的訪問

下面是幾個結構體

定義GDT描述符表項結構

struct DESCRIPTION

{

unsigned int size;

unsigned int low16;

unsigned int high8;

unsigned char arribution;

unsigned int res;

};

C語言實現擴展內存的訪問

定義全局地址描述索引表結構

struct GDT

{

struct DESCRIPTION NullDsc;

struct DESCRIPTION GDTDsc;

struct DESCRIPTION SrcDsc;

struct DESCRIPTION DstDsc;

struct DESCRIPTION BioscsDsc;

struct DESCRIPTION BiosssDSC;

};

C語言實現擴展內存的訪問

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;

}

C語言實現擴展內存的訪問

設置源數據塊地址表項值

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);

}

C語言實現擴展內存的訪問

設置目的數據塊地址表項值

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);

}

C語言實現擴展內存的訪問

源數據塊到目的數據塊之間的數據傳遞

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);

}

C語言實現擴展內存的訪問

定義函數向擴展內存中寫數據

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;

}

C語言實現擴展內存的訪問

主函數

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;

}

C語言實現擴展內存的訪問

相關問題答案