求助:如何使用汇编直接载入纯dos下的exe文件,并执行!谢谢!

cainiao001 2007-05-08 11:42:05
上网找了很多资料,关于纯dos下的介绍都写的不是特详细。基本只提供了dos下EXE文件头的结构定义,但是对于每个如何使用这些数据,没有找到更加详细的介绍

我想实现一个纯实模式下的引导程序,该程序引导计算机启动以后载入一个用C/C++编译出来的Exe文件,实现简单的互操作。

我来回捣腾了好多次还是没有成功,但是直接载入一个Com文件是可以的

不知道哪位前辈做过相关的程序,提供点文档资料,最好能有源码学习学习!!!!


不胜感激!!!!
...全文
979 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lw549 2007-05-23
  • 打赏
  • 举报
回复
莫非是这样的?

invoke CreateProcess
todototry 2007-05-22
  • 打赏
  • 举报
回复
涉及段地址定位的问题,你需给出具体的地址值,作为段的地址
lcornelia 2007-05-22
  • 打赏
  • 举报
回复
那个dos6.22的源码我很想要,搜了一下也没找到,可不可以给我发一份,邮箱sei_michael@126.com,谢谢了.
cainiao001 2007-05-21
  • 打赏
  • 举报
回复
我还真下载了dos6.22的源码,可是打开就傻眼了,那么多文件,到底哪个是我需要的,望楼上的高人指点!

谢过关注的朋友们!!!!
mengshijie_1981 2007-05-20
  • 打赏
  • 举报
回复
必须为你的引导程序编写一个配套的加载器,请参考DOS的加载器源代码,搜索dos6.22源代码,解压后找到相关部分的源代码研究研究……
iwangdy 2007-05-16
  • 打赏
  • 举报
回复
你去找找 DOS程序员参考手册,看看EXE NE头文件的格式

表3.1一个EXE程序头的肝码结果
偏移量 典型值 含 义
00h 4Dh 连接程序的EXE文件标记
5Ah
02h E0h 映象长度
00h
04h 02h 以512字节计的文件页长度(2)
00h
06h 01h 重定位表项的数目(1)
00h
08h 20h 以节计的段长度(32)
00h
0Ah 00h 所需的最小段数(MINALLOC)
00h

44页
(续)
偏移量 典型值 含 义
0Ch FFh 所需的最大段数(65535)(MAXALLOC)
FFh
0Eh 04h. 堆栈段以段计的大小(偏移量)
00h
10h A0h SP寄存器中的偏移值
00h
12h 9Ah 字检查和
CFh
14h 00h IP寄存器偏移值
00h
16h 00h 代码段的大小(偏移量)
00h
18h 1Eh 第一个重定位项的偏移量
00h
· 1Ah 00h 覆盖数(驻留码=0)
00h
表3.1是EXE起始区内容解码(所有的表的入口都是2字节的字)。注意:打算运行
在Windows下的程序也是EXE文件,但使用的是完全不同的起始区调度表。这样的程序
已经超出了本书的范围。
EXE程序的起始区为EXEC模块提供了控制调入程序到正确的指定段所需的信息。
每个入口由一个2字节数据字组成。它以低位在前的方式存放。表3.1列出了每个入口
的含义。
(1)在偏移量00h,一对特定的字节(4Dh 5Ah一ASCII码为MZ,代表DO5的主要
设计者Mark Zbikowski)作为EXE文件的标志。当DOS EXEC功能看见以这两个字母开
头的文件后,功能自动将它做为EXE文件处理。这的确和文件的扩展名没有关系。只有
MZ标志用来决定文件类型,所有COM文件都没有包含这个标志。
(2)在偏移量02h,存储着文件的长度(模512)。这个值加上04和08h偏移量中的
值,用来确定程序的大小。
(3)在偏移量04h,存储着512字节页中文件的长度。如果文件小于512字节,这个值
可以为零;Microsoft的实用程序决不生成少干512字节的EXE文件,这个结果主要由其
它一些卖主产生的。
(4)偏移量06h存有重定位表中项目的数量(重定位表定位在偏移量18h)。
(5)偏移量08h存放的是在段中(每段16字节)EXE程序起始段的大小。
(6)偏移量0Ah存储着要运行这个程序所必须的最小段数(MINALLOC)。如果不能
满足这么多内存,该程序就不运行。除非被LINK命令行开关覆盖,链接程序将它设置为
零。
(7)偏移量0Ch存储的是该程序要求的最大段数。除非被LINK命令行开关覆盖,链

45页
接程序将它设置为FFFFh(1M)。如果可用内存少于这个数,该程序就申请它所能获得的
所有内存。
(8)偏移量0Eh中存储的是在段中,从程序开始的难栈偏移。
(9)偏移量10h中存储的是当程序启动时的SP寄存器值。
(10)偏移量12h存放的是由EXEC功能在运行时使用的程序检查和。(在大多数的
DOS版本中,这个检查和没有明显作用。)
(11)偏移量14h中存储的是当程序启动时的IP寄存器的初始值。
(12)偏移量16h中存储的是程序代码段的段偏移量。
(13)偏移量18h中存放的是重定位表第一个入口(在EXE文件中的)偏移量。
(14)偏移量1Ah中存放覆盖程序数,对于一个程序,这个值为零。
紧跟在起始区之后有一小段保留空间,是程序的重定位表。在重定位表中的项目是每
次读入一项送入工作区域。每个项目的段值都和程序的起始段值相加,它是由EXE调入
程序从存储在程序起始区偏移量04h,08h和02h中的值计算出来的。由计算出的段值结
果和指向程序字的项目偏移量值,计算出要写入的那个位置的段值。
重定位表后紧跟着另一小段保留空间。每个保留空间的大小可以不同)。然后就是程
序本身,接着是堆栈段。
JeanChenYu 2007-05-16
  • 打赏
  • 举报
回复
我看你是没看懂,要不不会一直问的.
说真的,我也曾经将我的EXE文件做为我的引导代码.
开机时,执行我的程序.
对于没有数据段,堆栈段的程序,纯代码开始的地方一般
是200H处,你可以将EXE文件读入内存,跳到偏移200H处.
如果有其他段存在,这些段的长度均记录在文件头中.
cainiao001 2007-05-15
  • 打赏
  • 举报
回复
感谢各位关注
我搜索了相关PSP的信息,PSP(程序段前缀)中主要是设置了几个Dos中断的地址,比如程序运行中用户按了Ctrl+Break怎么办,好像并没有涉及如何载入exe的相关信息

当然也有可能是我没有看懂,还望高人指点。
cainiao001 2007-05-09
  • 打赏
  • 举报
回复
我知道呀,关键如何定位EXE文件中的可执行部分,哪里开始哪里结束!

com文件很简单呀,本身就是纯可执行文件,只不过位移是100

所以只要将代码直接Copy到段地址任意,偏移100的地方就可以执行了.(比如:1000:0100)
JeanChenYu 2007-05-09
  • 打赏
  • 举报
回复
你可以将EXE文件中的纯代码在启动时拷到内存中,然后转移到那就行了,
没什么特别的要求
请问你是怎么载入COM文件的,可不可以详细说下?
iwangdy 2007-05-09
  • 打赏
  • 举报
回复
先确定载入exe的内存地址,然后从起始地址创建256字节的PSP信息,之后根据exe文件头的信息加载程序正文,改写重定位信息,设置寄存器初始值,把cs,ip置好后跳转即可
pig4210 2007-05-09
  • 打赏
  • 举报
回复
可以去看看PE文件结构知识,PE文件有入口地址,而入口地址的位置是固定的。先取得入口地址,再跳。
大熊猫侯佩 2007-05-08
  • 打赏
  • 举报
回复
在保护模式中载入?
cainiao001 2007-05-08
  • 打赏
  • 举报
回复
仅仅在实模式中,就行,刚开始我不想搞那么复杂了

使用BCC 3.0 编译出来的 好像都是 纯Dos 下的 Exe 文件,只有MZ头部的那种。

21,499

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧