实验一:初步认识程序在内存中运行

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函数的某个函数

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

简单的说就是存储程序

技术分享

 

以上是关于实验一:初步认识程序在内存中运行的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-初步认识-第十二章-多线好处与弊端

JAVA-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程-内存图解

JAVA-初步认识-第十二章-主线程运行示例

并发编程1_初步认识多线程

并发编程1_初步认识多线程

并发编程1_初步认识多线程