从汇编看计算机的工作过程

本周学习了Linux内核分析第一课,老师通过讲解一个简单的c程序使我了解了计算机(特别是堆栈部分)工作过程。

下面通过一个简单的例子来分析一下:

下面是c程序:

int g(int x)
{
  return x + 6;
}

int f(int x)
{
  return g(x);
}

int main(void)
{
  return f(5) + 2;
}

使用下面命令反汇编c程序得到汇编程序

gcc –S –o main.s main.c -m32

首先从main函数开始分析,可以发现每个函数中前两步都是将原来的ebp值压栈,并将ebp与esp对齐以为一段新的函数准备堆栈空间。

然后main中将数字5存入了esp中,再调用函数f,call f时会将eip值(call的下一条指令地址)压入栈中。

跳到f函数后也是先将ebp压栈,并对其ebp esp。而后将ebp地址加8的内存空间中的值(ebp指向4 也就是将2中的值5)传给eax.以上其实就是完成了从main函数中将参数5传给

函数f,然后参数5也被存入栈中。继而调用函数g。

g的前3步也是完成了将ebp压栈 ,对齐,将参数传给eax等操作。而后则执行g函数将x+6.至此上面堆栈的左部分分析完毕。

下面执行pop %ebp弹出ebp然后再ret 则让ebp esp恢复成了call g之前的状态,同时eip则指向了第15行也就是leave,

leave起到的作用是将ebp ,esp之间的堆栈空间清除,而后再pop ebp ,ret则跟上面一样,这俩步完成后esp ebp又回到了调用f之前的状态。

程序返回到main中的第23行继续执行。

从上面简单的分析我们可以看出。当我们的计算机运行程序时,程序与数据存储在内存空间之中,计算机根据ip中值按序执行程序。而同时内存中开辟堆栈空间存储各种数据,通过几个常用寄存器的协同工作,数据在内存空间与寄存器中传递来实现数据的运算与存储。同时ip值存储在堆栈中的概念,则让程序可以非顺序的执行。

这种存储程序计算机的运行方式使我们的cpu和内存协同工作,内存存储数据和指令,cpu则进行解析、运算。这样将程序和运算有机的结合在了一起,让现代计算机得以高效的运行。

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

时间: 2024-10-24 21:17:31

从汇编看计算机的工作过程的相关文章

从一段代码的汇编看计算机的工作原理

朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 大家都知道,现在的计算机主要遵循的是所谓的“冯诺依曼框架”.那什么是冯诺依曼框架呢,其实就是计算机通过总线从内存中读取一条条的程序和数据,将它们存储在自己的寄存器中一条条地执行,如下图所示. 而今天,我们将通过汇编一个具体的C程序来探讨计算机工作的流程. 首先写下这么一段C程序: 1 //linux.c 2 int g(x)

理解计算机的工作方式——通过汇编一个简单的C程序并分析汇编代码

Author: 翁超平 Notice:原创作品转载请注明出处 See also:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  本文通过汇编一个简单的C程序,并分析汇编代码,来理解计算机是如何工作的.整个过程都在实验楼上完成,感兴趣的读者可以通过上面给出的课程链接自行动手学习.以下是实验过程和结果. 一.操作步骤 1.首先在通过vim程序建立main.c文件.代码如下: 图1 2.使用如下命令将main.c编

分析汇编代码理解计算机如何工作

周玉勇 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 把C代码反汇编成汇编代码,再来分析计算机如何工作 下面是C代码 C代码编译成汇编的代码 简化的汇编代码 1 g: 2 pushl %ebp 3 movl %esp, %ebp 4 movl 8(%ebp), %eax 5 addl $6, %eax 6 popl %ebp 7 ret 8 f: 9 pushl %ebp 10 mov

linux平台学x86汇编(一):现代计算机结构组成与工作过程

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 现代计算机计算过程通常是把用户书写并送入计算机内的高级语言程序翻译成机器能识别的语言程序,再通过机器自动运行该语言程序计算出结果并输出. 但在早期没有高级语言的时候,用户是直接编写机器语言,直接在机器执行.向编写这种只由0.1构成的二进制代码,对程序员的要求非常高,需要熟悉其所使用计算机的硬件机器和指令系统,这样编写程序难度很大,并且操作过程复杂易出错. 到了20世纪50年代

汇编代码调用系统调用的工作过程

钟晶晶 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 工作过程 以41号进程dup为例,说明在应用程序如何使用Linux的系统调用.dup()复制一个打开的文件描述符,并返回一个新描述符,二者都指向同一个打开的文件句柄.系统会保证新描述符一定是编号低最低的未使用文件描述符.使用库函数API调用dup()的程序: 使用C语言嵌入汇编代码来实现调用dup(): 第一条汇编语句将立即

【自制操作系统01】硬核讲解计算机的启动过程

目录 一.为什么是 BIOS 主导?    二.内存映射    三.实模式下的内存分布    四.怎么就从 BIOS 里的程序开始执行了    五.BIOS 里到底写了什么程序    六.0x7c00 是啥    七.启动区里的代码写了啥    八.操作系统内核写了啥        软硬件协同发展        历史遗留问题    九.参考资料    十.开源项目和课程规划        项目开源        课程规划 本讲只为讲明白下面一个问题: 我们按下开机键后究竟发生了什么? 好的,这似

计算机如何工作小解

计算机如何工作小解 “20135224陈实 + 自己博客园 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 汇编代码如下: 基本理解工作过程如下: 根据汇编语言:在g函数中,开头语句都是创建堆栈起始语pushl,movl分别对应下图(下右图eax值应该是算过main与F之后的esp值+5,这里只做函数顺序理解) 对应f与main开头语大同小异: 在进行到语句subl时候,ESP下移,将要保留的数值5放入

编译器的工作过程

简单的说,其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段(也就是常说的切token) 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件) 4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息.(生成.exe文件) 编译器在编译

DHCP基本工作过程

DHCP是什么,指的是Dynamic Host Configuration Protocol,他的前生叫bootp,就是boot Protocol.bootp是什么?很简单的道理,各位有没有听说过叫无盘工作站的.像早期的计算机网络中的主机,是有一台服务器在这工作着,服务器上有一个硬盘,这个硬盘空间可能稍微会比较大一点,然后讷,有很多客户机,像早期网吧都是这样子,这每一台客户机都有CPU内存键盘鼠标显示器还有主板等等就是没有硬盘,注意他没硬盘,没硬盘的话操作系统装哪儿去啊,没有操作系统我们不可能开