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. Burp Suite 抓取http、https流量配置+CA证书安装

    HTTPS协议是为了数据传输安全的需要,在HTTP原有的基础上,加入了安全套接字层SSL协议,通过CA证书来验证服务器的身份,并对通信消息进行加密.基于HTTPS协议这些特性,我们在使用Burp Pr ...

  2. flex布局下el-table横向滚动条失效

    如下图,是一种常见的页面结构,我们可以有很多方法实现,inline-block,float,flex等等 但是,最近项目中遇到一个怪事,左边是侧边栏导航,右边是一个数据展示table,el-table ...

  3. jeDate 日期控件

    写在前面的话: 最近在做一个日期范围的功能,研究了一个12306网站的日期范围选择,他用的是jcalendar.js,没有直接在日历插件里面做判断开始时间小于结束时间 而是自己在代码里面做了判断如下: ...

  4. 从源码的角度分析List与Set的区别

    很多时候我们在讨论List与Set的异同点时都在说: 1.List.Set都实现了Collection接口 2.List是有序的,可以存储重复的元素,允许存入null 3.Set是无序的,不允许存储重 ...

  5. php 对象教程

    [PHP面向对象(OOP)编程入门教程]6.如何去使用对象中的成员 作者:qianyunlai.com  发布于:2012-05-19 15:02  分类:PHP基础  浏览(280) 上面看到PHP ...

  6. day22 Pythonpython random随机模块:略!!!本文os模块

    OS模块 用于提供系统级别的操作: os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相 ...

  7. shell脚本之获取CPU使用率

    今天一个同事要测试OJ项目,同时我这边也需要知道他在压测过程中, CPU的使用率怎么样,虽说可以用top实时查看,但是进程太多了,我不需要获取那么多信息,我仅仅只要知道当前压测过程中CPU实时的使用率 ...

  8. QT 字符串的使用技巧总结

    QT 的字符串的 使用的总结. 1.字符串截取函数的使用 QString str; QString csv = "forename,middlename,surname,phone" ...

  9. Linux 局域网同步时间

    选择一台能上外网的机器作为时间服务器(都不能上亦可以,任选一台即可,但是只能保证局域网内时间同步) 配置此时间服务器 安装 ntp 在 /etc/ntp.conf 中配置 restrict 127.0 ...

  10. SQL Server数据库(时间戳timestamp)类型 (转载)

    timestamp介绍 公开数据库中自动生成的唯一二进制数字的数据类型. timestamp 通常用作给表行加版本戳的机制. 存储大小为 8 个字节. 不可为空的 timestamp 列在语义上等价于 ...