本篇给出XMS(扩充内存)内存TC函数汇编码文件,要使用XMS,必须安装驱动程序EMM386.EXE。注意,XMS与EMS(扩展内存)是2种不同的内存管理技术规范,由于它们对内存的管理范围有重叠,所以在驱动程序中应指明EMS的大小,如果全部1M外的内存全部都给了EMS,那么,XMS就只能管理UMB和HMA内存了,而这些内存还必须在DOS中配置才有,下面的配置保证了基本内存以外的内存全部由XMS管理:
device=himem.sys
device=emm386.exe noems
dos=high,umb
/*XMS.H*/
#ifndef__XMS_H
#define__XMS_H
#defineXMS_MOVEFROM0
#defineXMS_MOVETO1
externintXMS_Flag;/*XMS内存可使用标记,0不可使用,非0可使用*/
#ifdef__cplusplus
extern"C"{
#endif
/*定义使用XMS内存函数*/
/*测试XMS内存是否可用,将测试结果放在XMS_Flag,并返回XMS_Flag*/
intXMS_Init(void);
/*返回最大XMS内存块字节数*/
unsignedlongXMS_GetFree(void);
/*分配XMS内存,参数为字节数(长整型),成功返回内存块句柄,失败返回0*/
unsignedXMS_Alloc(unsignedlong);
/*释放XMS内存块,参数位内存块句柄,成功返回1,失败返回0*/
intXMS_Free(unsigned);
/*传输数据,参数:缓冲区;XMS句柄;XMS偏移量;字节数;传输标记,成功返回1,失败返回0
传输标记:XMS_MOVEFROM从XMS中取数据到缓冲区;
XMS_MOVETO将缓冲区数据送到XMS*/
intXMS_Move(voidfar*,unsigned,unsignedlong,unsignedlong,int);
#ifdef__cplusplue
}
#endif
#endif
XMS.ASM
P386N
includetasm_c.inc
XMS_MOVEFROMequ0
XMS_MOVETOequ1
DATASEG
PUBLIC_XMS_GetFree
PUBLIC_XMS_Alloc
PUBLIC_XMS_Move
PUBLIC_XMS_Free
PUBLIC_XMS_Init
PUBLIC_XMS_Flag
XMS_addrdd0
_XMS_Flagdw0
;
XMS_Bytesdd0
XMS_SouHanddw0
XMS_SouAddrdd0
XMS_DesHanddw0
XMS_DesAddrdd0
;
CODESEG
;
;unsignedlongXMS_GetFree(void)
;
PROC_XMS_GetFree
movah,8
call[dwordXMS_addr]
movdx,ax
shlax,0ah
shrdx,06h
ret
ENDP
;
;intXMS_Init(void);
;
PROC_XMS_Init
movax,4300h
int02fh
cmpal,80h
jne@@1
movax,4310h
int02fh
mov[wordXMS_addr+2],es
mov[wordXMS_addr],bx
movah,8
call[dwordXMS_addr]
mov[word_XMS_Flag],ax
jmpshort@@2
@@1:
mov[word_XMS_Flag],0
xorax,ax
@@2:
ret
ENDP
;
;unsignedintXMS_Alloc(longsize)
;
PROC_XMS_Alloc
ARGsize:dword
movax,[_XMS_Flag]
cmpax,0
je@@1
moveax,[dwordsize]
addeax,3ffh
shreax,0ah
movdx,ax
movah,9
call[dwordXMS_addr]
cmpax,0
jz@@1
movax,dx
@@1:
ret
ENDP
;
;intXMS_Move(voidfar*buf,unsignedlongofs,unsignedlongbytes,intflag)
;
PROC_XMS_Move
ARGbuf:farptr,handle:word,ofs:dword,bytes:dword,flag:word
USESsi
moveax,[dwordbytes]
mov[dwordXMS_Bytes],eax
cmp[wordflag],XMS_MOVEFROM
jne@@1
movax,[handle]
mov[XMS_SouHand],ax
moveax,[dwordofs]
mov[XMS_SouAddr],eax
mov[wordXMS_DesHand],0
moveax,[dwordbuf]
mov[dwordXMS_DesAddr],eax
jmpshort@@2
@@1:
mov[wordXMS_SouHand],0
moveax,[dwordbuf]
mov[XMS_SouAddr],eax
movax,[handle]
mov[XMS_DesHand],ax
moveax,[dwordofs]
mov[dwordXMS_DesAddr],eax
@@2:
leasi,[XMS_Bytes]
movah,0bh
call[dwordES_XMS_addr]
ret
ENDP
;
;intXMS_Free(handle)
;
PROC_XMS_Free
ARGhandle:word
movah,0ah
movdx,[handle]
call[dwordXMS_addr]
ret
ENDP
;
END
上面的文件中使用的插入文件tasm_c.inc和编译文件在《Turbo C使用的汇编函数 -- VGA 12H模式图形函数(一)》中。本来想找个测试代码,可是代码确实太长(一个完整的程序),反正XMS函数调用也不复杂,也就免了。
连续几篇文章,将我十多年前自认为精华的代码全掏空了,从1998年,我就很少接触C/C++,虽说C/C++的代码还能看懂,也能写几句,但社会变化太快,近十年的时间不知改变了许多,有时候,我也用C/C++写点东西,但自从在Delphi版被一个自认为的C++“高手”的家伙所辱后,就没有再正二八经的用过“C++”(我其实是实话实说,说我不懂STL,也不喜欢它,他说,不懂STL就是不懂C++,当然还有他人帮腔也这么说,我只好无话可说了,原来我不用STL写的代码不能叫C++代码?!不过,偶尔也用BCB做点试验,反正BCB主要用VCL,极少用到STL)。幸好我只是个业余编程爱好者,不靠它吃饭!
再次声明,这几篇文章的代码是1995年前的东西,用现在的眼光去看它们,还不知道是不是C函数,只能供初学者们借鉴参考。至于是否有错误,我就不得而知了,不过,我以前使用时,没出过什么问题。有错误或建议,请来信:maozefa@hotmail.com
分享到:
相关推荐
tp pascal 编译器下使用汇编开发的xms内存管理程序,便捷高效,是pascal平台下使用扩展内存的好工具。
java_jvm_参数_-Xms_-Xmx_-Xmn_-Xss_调优总结.pdf java_jvm_参数_-Xms_-Xmx_-Xmn_-Xss_调优总结.pdf
migomiddle-xms-master_xms_vs2019element_woodh53_vueelementui_vue
JVM调优总结 -Xms -Xmx -Xmn -Xss
JVM调优总结 -Xms -Xmx -Xmn -Xss JVM调优总结 -Xms -Xmx -Xmn -Xss
java jvm 参数 -Xms -Xmx -Xmn -Xss -
XMS100数据手册
nginx的docker方式的部署,以及通过nginx去代理宿主主机上的Web服务应该怎么配
这是HimemX-FreeDOS的开源XMS内存管理器。 尽可能使用虚幻模式,并且传统内存占用量非常低。 有补丁吗? 注意到任何错误吗? 请在FreeDOS邮件列表中报告您的发现:freedos-user@lists.sourceforge.net
用于redis和java项目进行整合的jar包,必须免费,资源共享。
weblogic参数配置 整理的比较乱,但是具体的参数结合weblogic10的console进行调整
其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置 实例,以下给出1G内存环境下java jvm 的参数设置参考: 代码如下:JAVA_OPTS=”-server -Xms...
JVM参数_-Xms_-Xmx_-Xmn_-Xss_调优总结
一、 IDEA内存优化(秒开的快感!!) 因机器本身的配置而配置:\IntelliJ IDEA8\bin\idea.exe.vmoptions // (根据你的配置变大!!) ----------------------------------------- -Xms2048m -Xmx2048m -XX:...
添加:JAVA_OPTS=’-Xms512m -Xmx1024m’ 或者 JAVA_OPTS=”-server -Xms800m -Xmx800m -XX:MaxNewSize=256m” 或者 CATALINA_OPTS=”-server -Xms256m -Xmx300m” Windows服务器: 在/apache-tomcat-5.5.23/bin ...
Java数据库迁移备份软件源代码,作者 : 杨浚用于把数据库里的数据导出为insert语句,用于数据备份或迁移到另一个数据库,... -Xms不能大于当前系统可用的剩余内存,包括虚拟内存 -Xmx必须大于要导出的最大语法文件
OpenJDK是GPL许可(GPL-licensed)下的Java平台的实现。资源是Openjdk8源码。
很简单的一句脚本 将该文件放到文件夹--“启动”中,可以实现jar文件的开机自动运行