实验一:初步认识程序在内存中运行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验一:初步认识程序在内存中运行相关的知识,希望对你有一定的参考价值。
顾涛原创作品转载请注明出处《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函数的某个函数
最后结合所学知识 简单的说一下计算机是如何工作的
简单的说就是存储程序
以上是关于实验一:初步认识程序在内存中运行的主要内容,如果未能解决你的问题,请参考以下文章