dos下c语言程序运行,用简单C程序分析DOS下的EXE文件

DOS下的EXE文件格式比较简单,所以咱们先把Windows下的那个复杂的EXE文件放一边,挑个软柿子捏捏(以下EXE如不特殊说明均指DOS下的EXE文件格式)。

其实 上关于EXE格式的说明很多,大都是哗啦列出大批格式说明,看得人是头晕脑胀的。等自己搞懂了,总觉的其中个别说明不太精确导致自己误解浪费了不少时间。所以,咱们要自己动手去实践一下,边动手边理解就容易多了。至于本次分析为什么用C,这个嘛,咱们随便分析一下C语言与汇编的联系,尤其是子程序的调用,这跟什么什么标准有关。好,废话少说,切入正题!

1.软件准备

①既然跟DOS有关,得有个DOS系统吧。现在盛行虚拟机,安装简单并且系统崩溃的话跟自己电脑的硬件没关联,安全方便。至于怎么安装,请参阅本人拙文:

②另外还要安装上Turbo C。初学C的大概都用过这个东东吧。安装在DOS上吧。我用的是Turbo C++ 3。

③还得有个能查看文件16进制的软件。例如UltraEdit。

2.生成EXE文件

我们要从最简单的分析起,所以C程序尽量简单,只包含一个子程序调用。如下int sum(int x,int y)

{

return x+y;

}

main()

{

int x,y,s;

x=1;

y=2;

s=sum(x,y);

}

怎么样,够简单的吧。编译链接生成EXE文件。

3.小样,来吧,让我分析分析你

①用UltraEdit打开生成的EXE文件如下图(只截取了开头一部分)

分析:DS、ES均指向了PSP段地址,也即PSP段地址为27F2h。那么CS=2802是如何算出来的呢知道PSP长度为100h,如果换算成段地址的话则为10h,那么CS=PSP段地址+10h+CS在装入模块中的偏移=27F2h+10h+0=2802h。IP与文件中初始值相同。我们再来看看堆栈段,SS=PSP段地址+10h+堆栈段在装入模块中的偏移=27F2h+10h+00E5h=28E7,另外SP的值也为初始值相同。

4.汇编与C

以上我们分析了EXE头文件的格式,下面我们简单的看一下C语言是如何编译而形成机器码的。

我们可以看到生成的EXE文件相当庞大,足足有4KB。其实我们才写了几行代码,为什么会生成这么多的代码数据呢因为编译器在链接的时候加上了默认的库,这个就是C RunTime Library。我们可以在链接的时候不去装载这个库,具体如下

用DOS下的Debug反汇编一下,如下图

接着在调用子程序前,我们可以看到有又有参数压入堆栈,这就是为参数传递做准备。

此时IP被修改为0,转移到子程序中执行代码。在子程序中第一句PUSH BP第二句MOV BP,SP,经过这两条指令后

(注意在这里为什么还把SP一下的数据给画出来,这是因为在实际的内存中数据还保存着)

原来这两句的作用就是释放传递参数所用的内存,明白了吧。MOV [BP-06],AX

这句作用是将求和得到的值赋给变量s。

自此子程序的调用过程我们就分析完了。从我们的分析中可以看到堆栈发挥了重要的作用,为变量开辟空间,参数传递,保存寄存器值等等,都要用到它。另外C中关于参数的传递有很多标准,我们刚才分析的应该是CDECL标准。更多信息请搜索一下 络,立刻会有你的答案的。

觉得此人博客不错,请点击推荐一下

文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览114375 人正在系统学习中 相关资源:3D建模软件(绿色版)_3d建模软件下载-专业指导文档类资源-CSDN文库

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年4月14日
下一篇 2021年4月14日

相关推荐