免费织梦模板,wordpress主题,web前端设计,建站教程,Photoshop教程,免费网站模板资源下载_微思考

反汇编一个简单的C程序_分析汇编代码_理解计算机工作原理

通过反汇编一个简单的C程序,分析汇编代码,理解计算机是如何工作的


 朱明涛  原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

题目要求:

火狐截图_2015-03-07T13-40-57.612Z.png

实验

登录实验楼Linux64位实验环境,在Code文件目录下新建C语言.c文件(在Code目录下创建是为了方便代码下载到本地)

火狐截图_2015-03-07T13-36-47.456Z.png

main.c内容如图

火狐截图_2015-03-07T13-29-37.980Z.png

为了防止雷同,我们这里把样例中的部分代码进行了改动。

通过编译命令gcc -S -o main.s main .c -m32 我们得到文件main.s,它包含一个汇编语言程序,汇编语言程序中的每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令。这里需要注意的是命令中S要大写,使用-m32是因为实验楼提供的是64位的实验环境,而我们模拟的是X86结构,需要使用-m32转换成32位的

main.s内容如图

01.png

02.png

0.png

其中带有.号的代码语句指的是链接文件,与我们要讨论的内容关系不大,这里我们把带有.的语句删去,得到下面如图所示文件

04.png

分析:

程序从main函数开始执行,初始的堆栈为空,espebp指向同一个地址。eip存放pushl %ebp(18)

执行18pushl %ebp 保存老的ebp地址,把老的ebp地址压入堆栈,记为ebp0eip存放movl %esp,%ebp(19)

执行19movl %esp,%ebp esp的值放入ebp,此时espebp指向同一地址。eip存放subl $4,%esp(20)

执行20subl $4, %esp  esp的值减去4eip存放movl $6,(%esp) (21)

执行21movl $6,(%esp) 将立即数6放入esp所指向的地址中.eip存放call f(22)

执行22call feip023)压入栈中,然后跳转到函数f:处执行。eip存放pushl %ebp(9)

执行9pushl %ebp ebp1压入栈中。Eip存放movl %esp,%ebp(10)

执行10movl %esp,%ebp esp的地址赋给ebpEip存放subl $4,%esp(11)

执行11subl $4,%esp esp的值减去4Eip存放movl 8(%ebp),%eax(12)

执行12movl 8(%ebp),%eax ebp + 8所存放的值,放入eax寄存器中,ebp+8存放的值为6,所以此时eax寄存器存放的值为6.eip存放movl %eax,(%esp) (13)

执行13movl %eax,(%esp) eax寄存器存放的值,放入esp所指向的地址中。Eip存放call g(14)

执行14call g eip(15)压入堆栈,跳转到函数g:处执行。Eip存放pushl %ebp(2)

执行2pushl %ebp ebp2压入堆栈。Eip存放movl  %esp,%ebp(3)

执行3movl  %esp,%ebp esp的地址放入ebp中。Eip存放movl 8(%ebp),%eax (4)

执行4movl 8(%ebp),%eax ebp + 8所指向的内容放入eax寄存器中,ebp + 8存放的内容为6,所以eax寄存器存放的内容为6Eip存放addl $5,%eax (5)

执行5addl $5,%eax eax寄存器的内容与5相加,将结果放入eax寄存器中, 此时eax寄存器内的值为11Eip存放popl %ebp(6)

执行6popl %ebp 将栈顶元素弹出,ebp指向ebp1Eip存放ret(7)

执行7ret  Eip存放leave(15)

执行15leave  相当于movl %ebp, %esp  popl %ebp ebp寄存器的值放入esp寄存器中,弹出栈顶元素,存放到ebp中。Eip存放ret(16)

执行16ret   eip存放addl $2,%eax (23)

执行23addl $2,%eax eax寄存器的值加上2,将结果放入eax寄存器中。Eip存放leave(24)

执行24leave相当于movl %ebp, %esp  popl %ebp此时堆栈回到初始状态。Eip存放ret(25)

执行25ret 程序退出。Eip存放原先最早的值。

 

计算机是如何工作的:

通过反汇编这个C程序,可以看出计算机的执行过程,就是CPU读取一条一条的指令来进行执行,指令寄存器EIP指向下一条需要执行的指令。

程序执行过程中一些数据的保存,大都是通过堆栈进行的。堆栈寄存器EBPESP共同确定了一个堆栈的栈底和栈顶。

如有不当,欢迎指正交流

 朱明涛  原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000


百家号 互联网微风说

百家号 互联网微风说

微信公众号 weisico-com

微信公众号weisico-com

转载请注明:微思考学习网-关注技术,分享知识 >> 反汇编一个简单的C程序_分析汇编代码_理解计算机工作原理

赞 (1) 收藏
分享到