有没有什么办法可以指定dos com程序的加载位置?
我想将编译好的程序加载到常规内存中80000h的位置,c语言有什么办法么?或者是哪个编译器可以指定内存的加载位置?
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我想将编译好的程序加载到常规内存中80000h的位置,c语言有什么办法么?或者是哪个编译器可以指定内存的加载位置?
谢谢
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(7)
dos 下的com程序加载的起始offset地址是100h,如果要到指定的地址,那么你自己要给它分配好cs和ip,可以在程序中用压栈和程序返回(ret)的方法来运行它. 不过注意dos下内存没有保护的功能,你可以强制指定指针到80000h,你要保证其他程也不用这个空间,幸好dos是单任务的,保证这点不是太难.
[ 本帖最后由 system888net 于 2009-1-7 11:31 编辑 ]
这里的0x100应该是相对偏移,里面的代码应该是位置无关的吧。
代码是否跟位置无关有点记不清楚了,可能是无关的.
com程序的代码段和数据段都是相同的,而且限制在了64k,里面的数据的地址都是0x100+address的,因此加载时必须满足100h的要求,否则会出错。
谢谢
我想想其他办法
DOS上有.COM和.EXE两种机器码可执行程序文件格式。
1).COM
大小不能超过64KB(一个段)。由DOS将其装载在当前最低段里。代码从0100H可是执行。前面的256B由DOS写入,相当于UNIX里的进程块。
2).EXE
大小可以是几个段。开始执行地址可以由编码员设定,如果是汇编语言开发的话。用C开发,要看C编译器是否支持。好像TC可以,记不清了。
3).COM格式也有办法,可以在程序的开头写一段代码,当执行时,将代码整个搬到8000H处,再跳转到那里执行。
[ 本帖最后由 beepbug 于 2009-1-9 18:11 编辑 ]
最后就是用3着这种方式在汇编开始搬移跳转的 。
好象没有办法,com加载不能限定其位置。快10年没有去接触过com了,我印象中的com貌似就是这样。不过还有一个长驻程序,忘记是怎么回事了。
不过我说的不一定对,你可以去查查com的加载,以及其他的一些与com相关的东西
[ 本帖最后由 cjaizss 于 2009-1-7 10:14 编辑 ]