zoukankan      html  css  js  c++  java
  • linux内核分析--计算机是如何工作的

    实验部分

    使用gcc -S -o main.s main.c -m32命令将源代码编译成汇编代码。

    源代码如下:

    int g(int x)
    { 
     return x + 9;
    }
    int f(int x)
    { 
     return g(x);
    }
    int main(void)
    {
      return f(18) + 11;
    }
    

    编译后的代码如下:

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

    堆栈变化过程

    1.main函数--pushl %ebp + movl %esp,%ebp
    1
    2.main函数--subl $4,%esp + movl $18,(%esp)
    2
    3.main函数--call f
    3
    4.f函数--pushl %ebp + movl %esp,%ebp
    4
    5.f函数--subl $4,%esp + movl 8(%ebp),%eax + movl %eax, (%esp)
    5
    6.f函数--call g
    6
    7.g函数--pushl %ebp + movl %esp, %ebp + movl 8(%ebp), %eax
    7
    8.g函数--addl $9,%eax + popl %ebp
    8
    9.g函数--ret 下一步将运行第15行的指令也就是f函数的leave指令
    9
    10.f函数--leave
    10
    11.f函数--ret 下一步将运行第23行的指令也就是main函数的addl指令
    11
    12.mian函数--addl $11, %eax + leave
    12
    13.main函数--ret 取决于在初始堆栈中的情况。

    实验楼截图

    源代码截图
    编译代码截图

    计算机如何工作的理解

    计算机首先从内存中运行第一条指令,根据其指令的内容及要求,从存储器中取出相应的数据并进行运算和操作,最后根据地址将结果返回到内存之中,从而完成一条指令的运行。若有第二条指令,则会进行相同的步骤,直至出现停止的指令,则停止工作。

    简单点说,就是不断地取指令和运行指令,最后将结果返回至已指定的存储器地址之中。

    需要注意的是计算机在执行程序时须先将要执行的相关程序和数据放入内存储器中,在执行程序时CPU根据当前程序指针寄存器的内容取出指令并执行指令。

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

  • 相关阅读:
    webpack基本使用笔记
    gulp学习记录
    页面优化
    linux下使用indent整理代码
    C++中的getline()
    Sum of Two Integers
    TwoSum
    IDEA个人常用快捷键总结
    mysql数据库遇到的各种问题
    Python中*args 和**kwargs的用法和区别
  • 原文地址:https://www.cnblogs.com/Spr1ngxx/p/5222168.html
Copyright © 2011-2022 走看看