文档章节

[原创]通过简单的汇编代码了解计算机的工作原理

realm520
 realm520
发布于 2016/03/04 17:10
字数 377
阅读 29
收藏 0

发在别处的文章,搬过来了。

首先编写一个简单的c程序:

int g(int x) {  
    return x + 6;  
}  
  
int f(int x) {  
    return g(x);  
}  
  
int main() {  
    return f(81) + 1;  
}



在Linux下用gcc编译为汇编代码:

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



生成的汇编代码中有很多"."开头的行,都是链接信息,我们把这些行删除,以免影响阅读。最后剩下的汇编代码为:

g:  
    pushl   %ebp  
    movl    %esp, %ebp  
    movl    8(%ebp), %eax  
    addl    $6, %eax  
    popl    %ebp  
    ret  
f:  
    pushl   %ebp  
    movl    %esp, %ebp  
    subl    $4, %esp  
    movl    8(%ebp), %eax  
    movl    %eax, (%esp)  
    call    g  
    leave  
    ret  
main:  
    pushl   %ebp  
    movl    %esp, %ebp  
    subl    $4, %esp  
    movl    $81, (%esp)  
    call    f  
    addl    $1, %eax  
    leave  
    ret



我们来详细分析一下这段代码。首先解释一下几个寄存器的含义:
  • EBP - 存放栈的基地址
  • ESP - 存放栈的顶地址
  • EIP - 存放下一条指令的地址(这里我们为了描述简单用代码的行号表示)
  • EAX - 存放数值(后面会看到,它通常存放函数的返回值)
好,下面开始解释每条代码的含义

通过分析这个小程序的汇编代码,我们了解了程序执行的基本逻辑:
  • 也就是通过堆栈的操作来执行函数的跳转,以及返回。
  • 同时在每个函数执行期间,函数内部的变量都在栈上进行操作。
  • 而返回值一般通过EAX来返回。

© 著作权归作者所有

realm520
粉丝 9
博文 13
码字总数 25892
作品 0
南京
架构师
私信 提问
计算机实验室之树莓派:课程 0 简介

这个课程简介不包含实践内容,但它解释了一个操作系统的基本概念、汇编代码、和其它很重要的一些基本原理。如果你想直接进入实践环节,跳过本课程并不会有什么问题。 1、操作系统 操作系统就...

作者: Robert Mullins
01/11
0
0
计算机实验室 – 树莓派:课程 0 简介

这个课程简介不包含实践内容,但它解释了一个操作系统的基本概念、汇编代码、和其它很重要的一些基本原理。如果你想直接进入实践环节,跳过本课程并不会有什么问题。 1、操作系统 操作系统就...

作者: Robert Mullins
01/09
0
0
译 | 在 Go 语言中使用猴子补丁

最近写单元测试多亏了这个 monkey 包,昨天看到了官方的原理介绍,很受启发,翻译出来大伙一起看看。 很多人认为猴子补丁(A monkey patch is a way for a program to extend or modify sup...

程序师
2018/08/09
0
0
汇编一个简单的C程序

说到计算机,大家都知道现代计算机都是由冯诺依曼体系结构组成的,也就是储存程序计算机。让我先从它的工作模型说起。 冯诺依曼体系结构由运算器、控制器、存储器、输入设备和输出设备组成,...

不高不富不帅的陈政_
2016/02/28
210
0
换种方法学操作系统,轻松入门Linux内核

计算机已成为现代人日常工作、学习和生活中必不可少的工具。操作系统是计算机之魂,作为用户使用计算机的接口,它负责调度执行各个用户程序,使计算机完成特定的任务;作为计算机硬件资源的管...

异步社区
2018/10/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【1015】LNMP架构二

【1015】LNMP架构二 三、PHP安装 PHP安装和LAMP安装PHP方法有差别,需要开启php-fpm服务 1、下载PHP7至/usr/local/src/ 切换目录:cd /usr/local/src 2、解压缩 tar -jxvf php-7.3.0.tar.gz...

飞翔的竹蜻蜓
35分钟前
4
0
浅谈Visitor访问者模式

一、前言 什么叫访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+对其进行处理就叫作访问,那么...

青衣霓裳
53分钟前
6
0
JS内嵌多个页面,页面之间如何更快捷的查找相关联的页面

假设parent为P页面, P页面有两个子页面,分别为B页面和C页面; B页面和C页面分别内嵌一个iframe,分别为:D页面和E页面 现在通过B页面的内嵌页面D的方法refreshEpage(eUrl)来加载内嵌页面E的内容...

文文1
54分钟前
7
0
Hibernate 5 升级后 getProperties 错误

升级到 Hibernate 5 后,提示有错误: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Map; 完整的错误栈为: java.lang.NoSuchMethodError: org.hibernate......

honeymoose
56分钟前
6
0
mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
59分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部