版权声明:本文为博主原创文章,未经博主允许不得转载。

我们知道作为一个语言本身是不会有诸如从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指令);使得程序在插入的位置发生了一个中断。

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

  1. c语言中argc的作用,C语言中main函数的参数argc和argv

    参考资料: C++语言中的main函数,经常带有参数argc,argv,如下: int main(int argc, char** argv) int main(int argc, char* arg ...

  2. c语言中结构体类型只有,C语言中main()函数不要返回结构体类型(求助)

    大家先看一下这段程序: #include typedef unsigned char bool; typedef struct _person person; struct _person { boo ...

  3. C语言 | C语言中main函数:int main( int argc, char* argv[] ) 中arg和argv参数的解析及调试

    ================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...

  4. c语言中main函数是什么

    点击上方蓝字关注我,了解更多咨询 1.main函数是C程序的入口函数,即程序的执行从main函数开始,其他函数的调动也直接或间接地在main函数中调用. 2.main函数的返回值用于解释程序的退出状态 ...

  5. C语言中main函数参数使用

    在C99标准中定义main函数两种正确的写法 int main(void); int main(int argc, char* argv[]); 常见的不标准写法 void main() main() ...

  6. 关于C语言中printf函数“输出歧视”的问题

    目录 关于C语言中printf函数"输出歧视"的问题 问题描述 探索问题原因 另一种研究方法 问题结论 关于C语言中printf函数"输出歧视"的问题 问题描述 ...

  7. c语言中sprintf函数_在C / C ++中使用sprintf()函数

    c语言中sprintf函数 In this article, we'll take a look at using the sprintf() function in C / C++. 在本文中,我们 ...

  8. c语言中isdigit函数_在C / C ++中使用isdigit()

    c语言中isdigit函数 In this article, we'll take a look at using the isdigit() function in C/C++. This is a ...

  9. exit在c语言里的作用,C语言中exit函数的使用

    exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调 ...

最新文章

  1. 进度查询php,php exec如何查看进度
  2. 5 java中的集合类_java基础(5)-集合类1
  3. 微量元素与中医药 谋定·大健康医药-李喜贵:辩证研究病理变化
  4. (MariaDB/MySQL)之DML(2):数据更新、删除
  5. 【讨论】关于什么时候使用module,什么时候使用class
  6. 内存条能4+8混插吗?_笔记本内存条双通道提升有多大?实测FORESEE,你知道好处在哪吗...
  7. MySQL学习笔记_10_MySQL高级操作(下)
  8. python文件函数_Python closed()函数:关闭打开的文件
  9. 分享两个网址,一个是使用mssql自带的跟踪工具和分析工具
  10. eclipse上svn创建分支、合并、切换
  11. 项目采集自动刷新 php,PHP168 CMS自动采集-PHP168 CMS自动更新-齐博CMS站群管理系统...
  12. 计算机网络实验:常用网络命令的使用(ping、ipconfig、netstat、tracert、arp)
  13. php中的oop思想,php oop的特性是什么?php oop思想的三大特点介绍
  14. 本地文件无法复制到VMware虚拟机
  15. 基于MATLAB的光纤通信仿真
  16. Mht制作word模板
  17. 使用nsis制作的安装包安装后,无法卸载干净的问题
  18. hadoop文件读写示例
  19. ISO9001质量体系认证是什么?办理步骤
  20. java jsqlparse_SQL解析器 JSqlParser

热门文章

  1. 如何通过putty软件远程登录并且控制linux平台
  2. 331. Verify Preorder Serialization of a Binary Tree
  3. 关于 Math.pow 的一个坑
  4. Jquery Mobile 百度地图 Demo
  5. Google App Engine使用简介
  6. 寫一個函數計算當參數為 n(n很大) 時的值 1-2+3-4+5-6+7……+n
  7. Windows 7 VHD 启动
  8. Ubuntu14.04下搭建LAMP环境
  9. Blockchain技术之区块链的应用领域——智能合约
  10. POJ 2965.The Pilots Brothers‘ refrigerator