• Linux内核分析第一周学习总结:计算机是如何工作的?


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

    标签(空格分隔): 20135321余佳源


    一、实验

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

    命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同

     int g(int x)
     {
       return x + 3;
     }
     int f(int x)
     {
       return g(x);
     }
     int main(void)
     {
       return f(8) + 1;
     }
    

    修改过后源代码:

    对应的经过编译的对应汇编代码:

    经过简化的汇编代码:

    g:
    	pushl	%ebp
    	movl	%esp, %ebp
    	movl	8(%ebp), %eax
    	addl	$53, %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    $2, (%esp)
    	call    f
    	addl    $1, %eax
    	leave
    	ret
    
    

    堆栈变化图:

    对应的寄存器指针内容变化状态图:

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

    对计算机的理解

        计算机能实现许多看起来很复杂的功能,计算和处理大量的数据,但是,它实现这些复杂功能是不断地重复大量既定的简单的操作。目前大多数拥有计算和存储功能的设备(智能手机、平板、计算机等)其核心构造均为冯诺依曼体系结构,它最核心的思想是存储程序计算机,要点是:数字计算机的数制采用二进制;计算机应该按照程序顺序执行。
    
        在过往的学习中我了解到,汇编语言是一种机器语言,通过对堆栈,对存储器,对寄存器,等等的操作,来实现一系列的指令。我们日常所使用的诸如c语言这种高级语言,落到具体操作的时候,在计算机的层面,还是依靠汇编语言来执行的。
    
        通过以上一个小例子,清楚地展示了计算机是如何在堆栈中进行数据流的变化的。我的理解是,当开始运行一段程序,都是在往堆栈压入数据,这个例子中main函数代码运行过程就是这样,这一段代码中还嵌套了g、f函数,当这两个函数运行完成后,执行ret指令,堆栈中的值就开始出栈,当main函数也执行到ret,leave之后,一切都归回原位。小程序是这样的过程,大程序也如此。
    
        学习汇编语言真正用的时候并不多,但它是我们分析处理问题的一种角度。能够看懂汇编语句,在分析程序真正执行的流程、单步调试程序的方面都是有帮助的。
  • 相关阅读:
    Spring IOC容器基于配置文件装配Bean(5) ------通过工厂方法配置bean
    Spring IOC容器基于配置文件装配Bean(4) ------bean生命周期
    Spring IOC容器基于配置文件装配Bean(3) ------装配集合属性
    Spring IOC容器基于配置文件装配Bean(2) ------通过setter或构造方法注入
    Spring IOC容器基于配置文件装配Bean(1) ------设置autowire自动装配
    Java实现序列化的作用和目的
    静态语言与动态语言
    C# WinForm 界面控件
    C# 中类与继承等概念
    C# 中的函数与方法
  • 原文地址:https://www.cnblogs.com/brotherlittlefish/p/5225813.html
Copyright © 2020-2023  润新知