从汇编语言角度看C语言代码,理解计算机如何工作
来源:互联网 发布:js打开无导航栏新窗口 编辑:程序博客网 时间:2024/06/02 07:14
作者:董涛
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-10000290
本文通过将一段C语言代码转换为汇编语言代码,利用更接近机器码的汇编码讲述C语言程序如何在计算机内部运行的,从而更深刻的理解冯诺依曼的存储程序式计算机的架构思想。
我们的工作平台是实验楼网站(www.shiyanlou.com)提供的虚拟Linux操作系统。
首先,我们创建一段C语言代码,如下图所示:
然后,我们在Linux的shell页码将这段C格式的main.c文件保存为汇编格式的main.s文件,并用32位的汇编命令打开,如下图所示:
打开汇编格式的代码,如下图所示:
好了,以上的第一幅图和第三幅图分别对应程序的C语言代码和汇编语言代码,现在我们以汇编语言为认知工具,看看程序是如何在计算机内部运行的:
首先,计算机的IP指针指向main段,通过pushl %ebp; movl %esp, %ebp; 这两行命令,将扩展基址指针寄存器ebp内的值作为栈帧的栈底地址压入栈,同时将栈顶的地址%esp赋值为%ebp,。第二步,通过subl $4, %esp;将栈顶值向下扩展4个字节,这里需要注意的是栈的编址是自上而下,从大到小的,也就说先进栈的占据大的地址,后面进栈的占据相对小的地址,第二步完成后,栈可以容纳4个字节32个字符的数据了。第三步,通过命令movl $10, (%esp)将数据10写入栈顶esp。第四步,通过call f;将程序跳转至f段,同时eip指针指向程序的下一行(即第23行),以备f程序段完成后,回归主程序。
接下来,看看f段程序,关于pushl,movl subl call等语句的含义,可以参考对main段的阐述,在f段中通过call命令调用了g程序,同理对于g程序的工作过程指令可以参考对main段的阐述,这里需要注意的是,popl命令和leave命令,popl命令是释放堆栈地址的,leave命令等同于如下两行代码的作用:movl %ebp, %esp; popl %ebp.
好了,执行完f段和g段后,程序通过epi指针回到main程序的第23行,通过addl $2, %eax命令,将2加入到%eax中,并保存在eax中,这就是我们所要的最终结果。
由以上过程可以看出,程序在计算机中的运行是通过栈的方式不断的调用函数最会回归至主函数,得出我们所要的结果的。
- 从汇编语言角度看C语言代码,理解计算机如何工作
- 从汇编语言角度理解C语言栈帧
- 从编译器的角度看C代码
- C语言反汇编代码分析,理解计算机工作原理
- 用汇编语言角度来理解C语言的一些问题
- 从内存的角度理解C语言
- 从汇编角度看计算机
- 从汇编角度看C语言类型转换
- 从架构的角度看如何写好代码
- 从25行汇编代码看计算机工作步骤
- 从C简单程序的汇编代码入手,以理解计算机工作原理。
- 从一段x86汇编程序看计算机是如何工作
- 从C语言程序员角度理解Java中的 interface
- 分析一个简单C程序的汇编代码,理解计算机是如何工作的
- 反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过汇编一个简单的C程序,分析汇编代码,理解计算机如何工作
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 嵌入式linux学习笔记一--打补丁
- *LeetCode-Binary Search Tree Iterator
- 使用Vim配置一个高效的PHP开发环境
- Find next node in bst
- 项目管理的主要控制因素(转)
- 从汇编语言角度看C语言代码,理解计算机如何工作
- *LeetCode- Sum Root to Leaf Numbers
- kvm虚拟化技术实战记录(1)——配置kvm
- [Leetcode] Jump Game
- Spring之AOP模块
- 【输入外挂】
- Math.round(11.5)等於多少? Math.round()
- 【Java】利用Collections类下的shuffle洗牌方法改进在一定的范围内产生不重复的随机数
- 09-面试题总结2015年3月8日