C语言代码:

int g(int x)

{

return x + 5;

}

int f(int x)

{

return g(x);

}

int main(void)

{

return f(5) + 1;

}

反汇编代码:

g:

pushl  %ebp                   将ebp的值压栈,同时esp向下移动4个字节

movl   %esp, %ebp         ebp也指向esp指的位置

movl   8(%ebp), %eax    将ebp变址寻址8即向上移动8个字节,栈中的内容为 8,将8赋值给eax

addl   $5, %eax               eax = 8+3 = 11

popl   %ebp                     ebp指向栈中值指向的位置,同时esp向上移动4个字节

ret                                  esp向上移动4个字节,同时eip指向栈中值的位置

f:

pushl  %ebp                      将ebp的值压栈,同时esp向下移动4个字节

movl   %esp, %ebp           ebp也指向esp指的位置

subl   $4, %esp                 esp向下移动4个字节

movl   8(%ebp), %eax      将ebp变址寻址8即向上移动8个字节,栈中的内容为 8,将8赋值给eax

movl   %eax, (%esp)        将8放入esp指向的位置

call   g                             将eip的值(call指令的下一条)压入esp指向的位置,同时esp向下移动4个字节,eip指向g

leave                               ebp指向esp指向的位置,ebp指向栈中值的位置,esp向上移动4个字节

ret                                   esp向上移动4个字节,同时eip指向栈中值的位置

main:

pushl  %ebp                     将ebp的值(0)压栈,同时esp向下移动4个字节

movl   %esp, %ebp           ebp也指向esp指的位置

subl   $4, %esp                esp向下移动4个字节

movl   $5, (%esp)            将5放入esp指向的位置

call   f                             将eip的值压入esp指向的位置,同时esp向下移动4个字节,eip指向f

addl   $1, %eax               eax = 11 + 1 = 12

leave                              ebp指向esp指向的位置,ebp指向栈中值的位置,esp向上移动4个字节

ret                                  main函数之前的eip的值(由操作系统定)

总结:计算的工作中将寄存器的地址和寄存器中的值压入堆栈中,通过寄存器指针变化和操作对数值进行操作计算,从而得到结果。

作者: 王雪铖

原创作品转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

Linux内核及分析 第一周 计算机是如何工作的?的更多相关文章

  1. Linux内核分析第一周——计算机是如何工作的

    冯诺依曼体系结构 核心思想 1.冯诺依曼是:数字计算机的数制采用二进制:计算机应该按照程序顺序执行. 2.采用二进制作为计算机数值计算的基础,以0.1代表数值.不采用人类常用的十进制计数方法,二进制使 ...

  2. linux内核分析 第一周 计算机是如何工作的 20125221银雪纯

    我使用的c语言代码是: int g(int x) { return x + 1; } int f(int x) { return g(x); } int main(void) { return f(6 ...

  3. Linux内核及分析 第二周 操作系统是如何工作的?

    计算机是如何工作的? 存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: 函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那么重要,但有了高级语言及函 ...

  4. Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理

    Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理 计算机工作原理 汇编指令 C语言代码汇编分析 by苏正生 原创作品转载请注明出处 <Linux内核分析>MOOC课程htt ...

  5. 《Linux内核分析》第一周 计算机是如何工作的?

    刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK ONE(2. ...

  6. 《Linux内核分析》第一周——计算机是如何工作的?

    杨舒雯 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 课程内容 1.诺曼依体系 ...

  7. 《linux内核设计分析》 第一周作业

    linux 基础入门 课程总结 一.linux系统简介 linux操作系统 整个计算机可以分为 硬件 内核 系统调用 应用程序 操作系统就属于内核和系统调用这两部分 操作系统历史发展 批处理操作系统 ...

  8. Linux内核分析——第一周学习笔记20135308

    第一周 计算机是如何工作的 第一节 存储程序计算机工作模型 1.冯·诺依曼结构模型:冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构.程序指令存储地址和数据存储 ...

  9. LINUX内核分析第一周学习总结——计算机是如何工作的

    LINUX内核分析第一周学习总结——计算机是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...

随机推荐

  1. 反射的作用—>实现框架的功能

    框架与框架要解决的核心问题 我们做房子卖给用户住,用于用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中.框架与工具类有区别,工具类被用户的类调用,而框架则是 ...

  2. PHP APP端支付宝支付

    应业务需求,做了支付宝支付和微信支付,今天分享一下手机端app支付宝支付对接流程,实际开发过程是前后端分离,前端调用后端API接口,实现功能返回数据,我所用的跨挤啊为TP5,大致可以分为四步: 1.在 ...

  3. 17秋 软件工程 团队第五次作业 Alpha Scrum10

    17秋 软件工程 团队第五次作业 Alpha Scrum10 今日完成的任务 世强:Android客户端成员列表完善.APP前端子部门和活动中心界面与数据交互: 港晨:Web前端主页的接口对接: 树民 ...

  4. Java设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  5. C#常见委托のdelegate定义,Func,Action,Predicate总结

    委托,顾名思义,就是让其他代理,本质就是为具有共性方法组定义一个方法模板:(交流可以加qq群:435226676) 委托常见的方式有一般委托显示定义,Func<T,TResult> (T, ...

  6. C#泛型约束where T : class 解释

    这是参数类型约束,指定T必须是Class类型. .NET支持的类型参数约束有以下五种:where T : struct                               | T必须是一个结构 ...

  7. CSS3中和动画有关的属性transform、transition 和 animation

    CSS3中和动画有关的属性有三个  transform. transition 和 animation.下面来一一说明:        transform     从字面来看transform的释义为 ...

  8. for-in和for-of,forEach和Map

    for-in和for-of 1. for-in循环实际是为循环”enumerable“对象而设计的,是用来循环带有字符串key的对象的. 使用for in会遍历数组所有的可枚举属性,包括原型.所以fo ...

  9. 高性能mysql之慎用BLOB与TEXT

    文章转自 https://blog.csdn.net/john1337/article/details/70919212 BLOB与TEXT是为了存储极大的字符串而设计的数据类型,采用二进制与字符串方 ...

  10. 剑指offer从上往下打印二叉树 、leetcode102. Binary Tree Level Order Traversal(即剑指把二叉树打印成多行、层序打印)、107. Binary Tree Level Order Traversal II 、103. Binary Tree Zigzag Level Order Traversal(剑指之字型打印)

    从上往下打印二叉树这个是不分行的,用一个队列就可以实现 class Solution { public: vector<int> PrintFromTopToBottom(TreeNode ...