zoukankan      html  css  js  c++  java
  • 实验一:初步认识程序在内存中运行

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

    如果我写的不好或者有误的地方请留言

    实验要求:

    • 题目自拟,内容围绕计算机是如何工作的进行; 

    • 博客中需要使用实验截图

    •  博客内容中需要仔细分析汇编代码的工作过程中堆栈的变化

    •  总结部分需要阐明自己对“计算机是如何工作的”理解

    实验报告:

    首先我们编译一个简单的c语言代码main.c

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

    gcc -S -o main.s main.c -m32 我们得到main.s如下

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

    接下来我们来认识一些汇编指令的含义:

    ebp 堆栈栈底
    esp 堆栈栈顶
    eax 保存函数返回的数据
    call f 等价于
    pushl %eip;
    movl f, %eip;
    leave 等价于
    movl %ebp,%esp;
    popl %ebp;
    ret 等价于 pop %eip

    接下来一句一句分析汇编代码:

    我们得到寄存器和栈中数据变化如下:

    其中main函数 f函数 g函数分别对应从上到下的3个颜色

    代码比较简单 不再码字叙述了

    值得注意的是程序结束时候的ret指令将会出栈%eip

    该eip是调用main函数的某个函数

    最后结合所学知识 简单的说一下计算机是如何工作的

    简单的说就是存储程序

    ========================if i have some wrong, please give me a message, thx.========================
  • 相关阅读:
    玩家移动
    人物上线(激活玩家之后)
    map 玩家上线
    无锁的环形队列
    随笔
    std::bind
    如何查找文件中的schema约束
    myeclipse便捷导包方式
    21 求1+2!+3!+...+20!的和
    20 求出这个数列的前 20 项之和
  • 原文地址:https://www.cnblogs.com/ailx10/p/5220068.html
Copyright © 2011-2022 走看看