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

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

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

实验要求:

 

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

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

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

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

 

实验报告:

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

1
2
3
4
5
6
7
8
9
10
11
12
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如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

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

1
2
3
4
5
6
7
8
9
10
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函数的某个函数

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

简单的说就是存储程序

 

posted @   ailx10  阅读(660)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
阅读排行:
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 本地部署 DeepSeek:小白也能轻松搞定!
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)
点击右上角即可分享
微信分享提示