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

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

计算机是如何工作的?

计算机的工作的基础冯诺依曼体系结构,即存储程序计算机。

这里涉及到两个重要的接口,一个是API,程序员与计算机的接口,另一个是ABI,程序与CPU的接口。

程序员通过编程语言下达指令,指令则通过汇编被翻译成计算机语言,使计算机能够明白你的意思,进而执行。

汇编语言中的指令有好多种,大多数指令可以直接访问内存。

下面就是一个将C代码编译成汇编代码的具体操作过程

这个程序的返回值为21

检验一下,可以运行(没有输出)

输入给出的语句编译成汇编代码,生成.s文件

长长的汇编代码出炉

据说前面带“.”的语句表示链接

☝☝☝☝☝

精简版汇编代码

可见这个程序分为三部分:主函数,子函数f,子函数的子函数g

在程序开始运行之前,系统中有一个空堆栈,指向栈底的ebp和指向栈顶的esp都指向0的位置,eip存储cpu要读取的指令的地址,每运行一步它就自动+1,eax是返回值。

需要注意的是,下面图片中的图片0,1,2,3...并不是真正的地址值,只是为了方便才这样写,按理说应该是以4为单位向下逐级递减的,比如2016,2012,2008...

程序从main开始运行:

       

执行到call f这一步时,eip指向了f,接下来将从f开始运行:

    

  

call g之后开始运行g中的指令:

    

ret就相当于popl %eip,eip跳转到了15,开始执行f中未进行的指令,leave可拆分成如下图中的两步(指令后面的 l 忘记写了。。。)

  

eip跳转到了23,执行main中未执行的指令(最后一个ret可能涉及到这个程序之外的内容,不予考虑)

  

程序运行完毕,返回值正确

堆栈的功能是暂时存放数据和地址,观察图片我发现,堆栈的形态先是不断的向下伸长,长到一定程度就往回收缩,最后的形态与它的原始形态相同。

总结

通过这次试验,我更加深入的理解了计算机是如何工作的。首先我们要把一段程序送给计算机(也有可能是计算机自带的程序),我们要明确的告诉计算机从哪里取需要的数值,如何操作,将操作后得数值放到哪里。然后,计算机会按照程序的顺序一步一步将指令取出,翻译成自己能懂的语言,再进行操作,运行完一条指令,再取下一条指令,这便是冯诺依曼原理。寄存器在执行指令过程中起到了很大的作用。操作中需要用到的数据都存储在堆栈里,通过两个地址寄存器在适当的时候调用。eip则控制程序的执行顺序,何时应该顺序执行,何时应该跳转。eax用于保存返回值。

虽然一步一步画图分析很麻烦,但是分析完还是很有成就感的,虽然看视频觉得自己已经很懂了,真正分析起来还是会出现问题,会无从下手,又要翻出视频来求助,完整的分析一遍后发现这才是真正记住了,果然记忆光靠看不行,还要靠实践。

假期的最后几天忽然有了学习任务,好在并不是很难,学到的内容大多都接触过,但是由于记忆力太差,和新学的没什么区别,以前学的时候就没怎么弄懂,现在终于弄懂了。

希望大家假期最后几天都玩得开心~

Linux内核分析作业 NO.1的更多相关文章

  1. linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程

    1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...

  2. Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序

            1.可执行文件的格式 在 Linux 平台下主要有以下三种可执行文件格式: 1.a.out(assembler and link editor output 汇编器和链接编辑器的输出) ...

  3. linux内核分析作业6:分析Linux内核创建一个新进程的过程

    task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  u ...

  4. linux内核分析作业5:分析system_call中断处理过程

    1.增加 Menu 内核命令行 调试系统调用. 步骤:删除menu git clone        (tab) make rootfs 这就是我们将 fork 函数写入 Menu 系统内核后的效果, ...

  5. linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作

    一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } in ...

  6. linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码

    计算机如何工作 三个法宝:存储程序计算机.函数调用堆栈.中断机制. 堆栈 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 Esp 堆栈指针  (stack pointer) ...

  7. linux内核分析作业3:跟踪分析Linux内核的启动过程

    内核源码目录 1. arch:录下x86重点关注 2. init:目录下main.c中的start_kernel是启动内核的起点 3. ipc:进程间通信的目录 实验 使用实验楼的虚拟机打开shell ...

  8. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  9. Linux内核分析作业 NO.8 完结撒花~~~

    进程的切换和系统的一般执行过程 于佳心  原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 ...

  10. Linux内核分析作业 NO.7

    可执行程序的装载 于佳心  原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实 ...

随机推荐

  1. FastDFS_v5.05+nginx+cache集群安装配置手册

    转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.FastDFS简单介绍 FastDFS是由淘宝的余庆先生所开发,是一个轻量级.高性能的开源分布式文件系统, ...

  2. 2-5 R语言基础 factor

    #因子:分类数据#有序和无序#整数向量+标签label#Male/Female#常用于lm(),glm() > x <- factor(c("female"," ...

  3. BZOJ5092:[Lydsy1711月赛]分割序列(贪心,高维前缀和)

    Description 对于一个长度为n的非负整数序列b_1,b_2,...,b_n,定义这个序列的能量为:f(b)=max{i=0,1,...,n}((b_1 xor b_2 xor...xor b ...

  4. JVM打印加载类的详情信息

    使用JVM参数即可:-XX:+TraceClassLoading

  5. 使用docker-compose运行Django

    1.新建空目录 2.进入该目录新建Dockerfile文件,并在该Dockerfile文件添加如下内容 FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir / ...

  6. WorldWind源码剖析系列:角度类Angle

    PluginSDK中的角度结构体Angle类图如下所示. 角度结构体主要定义了一个弧度表示角度值的字段:double Radians.还有几个表示角度最大值.最小值.非数值和零角度等字段.定义了一个D ...

  7. OpenCV——图像的矩(计算矩、轮廓面积、轮廓或曲线长度)

    图像矩描述了图像的全局特征 一阶矩与形状有关 二阶距显示曲线围绕直线平均值的扩展程度 三阶矩是关于平均值的对称性测量 由二阶和三阶矩可以导出7个不变矩,不变矩是图像的统计特性,满足平移.伸缩.旋转的不 ...

  8. Python2.7-sqlite3

    sqlite3模块,SQLite 是用 C 写的轻量级的数据库,sqlite3 模块提供了对数据库的接口,要使用必须首先创建一个 Connection 对象,代表连接至数据库,然后才能继续操作,操作数 ...

  9. python+requests实现接口测试 - cookies的使用 (转载)

    出自:https://www.cnblogs.com/nizhihong/p/6699492.html 在很多时候,发送请求后,服务端会对发送请求方进行身份识别,如果请求中缺少识别信息或存在错误的识别 ...

  10. 微信小程序开发 [03] 事件、数据绑定和传递

    1.事件绑定 在微信小程序中,事件的绑定依附于组件,当事件触发时,就会执行事件对应的处理函数. 我们回到前几章中的例子,将index页面调整为首页(app.json中调整pages数组元素的顺序),此 ...