您的位置:首页 > 编程语言 > C语言/C++

C语言中main函数的研究,以及对代码断点调试的研究(王爽老师 汇编语言)

2016-10-24 10:21 253 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。

     我们知道作为一个语言本身是不会有诸如从main函数开始运行这样的条件(深层次的说 底层汇编代码不会指定从mian函数开始的这样的条件,程序开始的位置是初始 CS:IP指定的位置)

 

1、通过书本上给我们提供的信息,我们知道在tc2.0中,给我们提供了寄存器名来给寄存器存储数据,

      编写成如下:



            我们知道在C语言中main函数是必定要被执行的,故,main函数的代码一定是在代码段的,但是不是程序就一定从main函数开始执行呢?(规定了我们就要遵守?)

            通过在debug下加载上面代码生成的exe程序,我们发现程序开始处的指令并不是给我们代码中给寄存器赋值的指令。



  

2、那么我们的main函数的代码到底在哪里??

       在我们前期所学的汇编语言中,我们的函数都是通过标号来标明的,我们可以通过标号找到函数的偏移地址,

                           printf(“%x\n”,main);

         通过printf这个函数,我们得到main函数的入口地址是1FAH,那么程序是什么时候开始去执行我们的main函数呢?通过一步一步的观察,我看到汇编码是在偏移地址11AH处执行一个CALL指令,加载MAIN函数,



现在在程序里面添加一个函数F



在MAIN函数里面,又执行了一条CALL 020B指令去执行F函数



                           

继续探究

                  通过前面的探索,可以看到main函数的偏移地址是在1FAH处,那么是不是对于所有的程序来说,mian函数的入口地址都是1FAH呢?在上图中,可以看到f函数定义在是在mian函数之后的,这是因为我在C语言的源文件里面就是这么写的,



                  下面我就将f函数声明和定义都写在main函数之前(如上图),可以看到,这个时候main函数的偏移地址已经变成了203h,而f函数的入口地址却变成了1FAh,那么这是不是说明1FA
是我们所编写程序里面第一个函数的偏移地址呢?



         下面我继续在f函数之上又添加了一个b函数



 

             通过查看1FAH处的指令,我们发现1fa却是又成了函数b的偏移地址,这里又证实了我们上面的猜想。



 

关于断点调试的研究

       1、现在猜想是假设在debug里面使用g命令是在所跳的程序之后加入了一条int指令,那么我可以在G命令之后被cpu执行的指令拷贝到另一段内存地址里面去,以方便我们的观察,这里,我的方法是将代码断里面的所有代码拷贝到0:200开始的位置,为了不影响我们观测的结果,我首先将0:200开始的一段内存置为0,

 

2、程序1Ah之前的指令清0指令,当我们跳到1Ah处执行P命令的时候,我们可以先查看一下0:200h到0:23e处是不是被置零了,下图中我们可以发现,从到0:200处到确实被全部被置零了,而却被清零的内存空间也足够我们将把我们的测试程序的二进制代码保存起来。

 


3、接下来我用debug加载程序(该程序功能是将程序本身的代码全部拷贝到0:200处)可以看到,代码本身是有2AH个字节的。

 


4、然后我用g  25跳到程序返回的代码之前,即mov ax,4c00处,然后再用u命令查看被拷贝过去的代码,可以看到在0:225处加入了一条INT
3指令机器码是0XCCH,对应的源程序的位置就是cs:0025处,也就是我们要跳到执行代码的地方,

 

5、所以总得来说,说明g命令就是在要跳到执行处插入了一个0CCH(就是INT 3指令);使得程序在插入的位置发生了一个中断。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: