预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

DOS中使用扩展内存 一HIMEM.SYS和XMS 扩展内存(extendedmemory)是指超过8086的1M限制的内存,在使用之前,必须有扩展内存驱动程序,MS-DOS7.10操作系统带有这个程序。在config.sys文件中要加上一句话:DEVICE=C:\DOS71\HIMEM.SYS,然后就能在程序中访问扩展内存了。 XMS是扩展内存管理规范,HIMEM.SYS程序符合XMS。如果有兴趣更深入地了解XMS规范,请打开本目录下的另一个文件<eXtendedMemorySpecification(XMS),ver3.0>。注意一下,本文是针对MS-DOS7.10中自带的扩展内存驱动程序HIMEM.SYS,不保证使用其它版本的或者其它扩展内存管理程序也能正确工作。 二驱动入口 在使用驱动程序的功能之前,首先确认驱动程序是否存在,并找到功能的入口地址。 DWORDxms_func;//保存XMS驱动程序的功能入口 boolxms_init() { //首先确定XMS驱动程序是否存在 BYTEis_exist; __asm { movAX,0x4300 int0x2F movis_exist,AL//如果已经装入XMS驱动,AL中会返回80h, }//否则,AL中的值不变 if(is_exist!=0x80) { printf("XMSnotexist!"); returnfalse; } //找到XMS功能入口点 WORDseg1,off1; __asm { movAX,0x4310 int0x2F movseg1,ES//ES:BX就是入口点地址 movoff1,BX } //入口地址保存到xms_func中,下次当函数调用 WORD*ptr_xms_func=(WORD*)(&xms_func); ptr_xms_func[0]=off1; ptr_xms_func[1]=seg1; returntrue; } 三分配和释放 使用扩展内存前要申请,用完之后要释放。 分配扩展内存,length以1K字节为单位,返回分配内存的句柄: WORDxms_alloc(WORDlenth) { WORDresult,handle; __asm { movDX,length movAH,9//功能号:9 callxms_func//调用XMS驱动 movresult,AX//AX=0,调用失败 movhandle,DX//DX=内存块句柄 } if(result==0) return0; else returnhandle; } 释放内存块: voidxms_free(WORDhandle) { __asm { movDX,handle//已分配的内存块句柄 movAH,10//功能号:10 callxms_func//调用XMS驱动 } } 四读和写 向扩展内存块中写数据或者从扩展内存块中读数据,都需要使用一个数据结构,暂时把它命名为"传送结构": structxms_trans { DWORDlength;//要传送的字节数 WORDsource;//源内存块句柄, voidfar*source_addr;//源地址在内存块中的偏移量 //如果source=0,表示在常规内存中,这时source_addr是一个16:16的指针 WORDdest;//目的内存块句柄 voidfar*dest_addr;//目的地址内存块中的偏移量 //如果dest=0,表示在常规内存中,这时dest_addr也是一个16:16的指针 }; 向扩展内存块中写数据: structxms_transtrans1;//作为全局变量,分配在数据段中 boolxms_write() { WORDtemp,result; trans1.length=66;//长度必须是偶数 trans1.source=0;//源数据在常规内存中 trans1.source_addr=(BYTEfar*)pBuf;//源数据的地址 trans1.dest=DestHandle;//目的地址在扩展内存中,向这个内存块中写数据 trans1.dest_addr=100;//内存块中的偏移量 temp=FP_OFF(&trans1); __asm { movAH,11//功能号:11 movSI,temp//DS:SI是trans1的地址 callxms_func//调用XMS驱动 movresult,AX//返回AX=0表示调用失败 } if(result==0) returnfalse; else returntrue; } 从扩展内存中读数据: boolxms_read() { WORDtemp,result; trans1.length