C语言的运行机制

目的:通过分析c语言转换成汇编代码后的执行过程对汇编语言和X86构架有一个初步认识

实验代码

复制代码
 1 #include <stdio.h>
 2 
 3 int g(int x)
 4 {
 5     return x + 3;
 6 }
 7 
 8 int f(int x)
 9 {
10     return g(x);
11 }
12 
13 int main(void)
14 {
15     return f(8) + 1;
16 }
复制代码

实验过程

编译

1.使用cd Desktop切换至桌面

2.使用touch 1-1.c在桌面建立1-1.c这个文件

3.在1-1.c这个文件中输入我们的代码,保存

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

结果

 

逐行分析

main:

  pushl %ebp 栈顶向上,开辟出一块新的内存,将栈底的内存地址放到栈顶(运算完成时函数能跳转回来)

  movl %esp,%ebp 将esp寄存器的值赋给给ebp,使栈底向上移一位

  subl $0x4,%esp 将栈顶向上移动一位

  movl 8,(%esp) 将参数8放进esp指向的内存

  call f 跳转到函数f

f:

  pushl %ebp 栈顶向上,开辟出一块新的内存,将栈底的内存地址放到栈顶(运算完成时函数能跳转回来)

  movl %esp,%ebp 将esp寄存器的值赋给给ebp,使栈底向上移一位

  subl $0x4,%esp 将栈顶向上移动一位

  movl 8(%ebp),(%eax)将8这个数字赋给eax寄存器(eax用于函数返回值使用)

  movl %eax,(%esp)将eax的值写入内存

  call g 跳转到函数g

g:

  pushl %ebp 栈顶向上,开辟出一块新的内存,将栈底的内存地址放到栈顶(运算完成时函数能跳转回来)

  movl %esp,%ebp 将esp寄存器的值赋给给ebp,使栈底向上移一位

  movl 8(%ebp),%eax 将8赋给eax

  addl $3,eax 执行8+3

  popl %ebp 退栈

  ret 返回函数f

f:

  leave 删除为函数参数建立的空间

  ret 返回main函数

main:

 addl $1,%eax eax+1

 leave 删除为函数参数建立的空间

 ret 返回

实验感悟

  在计算机中通过对内存堆栈的操作函数的执行,跳转和参数的传递。另外通过对学习汇编能让我们理解程序运行的机制,帮助我们写出精简的代码,提高效率

转载于:https://www.cnblogs.com/CoderLiLe/p/5246173.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1) 本套课程针对高校大学生系统学习C语言而录制,从0基础入门讲起,循序渐进,通俗易懂,同时适用于计算机系及非计算机系的同学。通过学习可以帮助大家掌握C语言本质,轻松面对C语言全国二级考试,并达到能独立完成中型C项目、C游戏的水平;2) 多数高校都开设了C语言课程,网上C语言课程也很多,但普遍存在两个问题: (1) 授课方式单一,大多是照着代码念一遍, 对刚刚接触编程的同学来说,感觉晦涩难懂 (2) 授课内容过度注重语法,没有项目实战支撑,造成课程枯燥无趣。本课程针对上述问题进行了改进 (1) 授课方式采用语法讲解+内存布局示意图+项目的方式,让课程生动有趣好理解 (2) 系统全面的讲解了C语言的核心技术点,还配套录制了《全国计算机二级C语言真题精讲》,让学员在掌握C语言编程的同时,还能轻松面对二级考试;3) 课程详细内容: 常量-变量、分支语句、循环语句、操作符和表达式、函数(库函数、自定义函数、递归调用 )、数组(一维数 组、二维数组、数组作为函数参数、指针数组)、指针(指针和指针类型、二级指针和多级指针、指针表达式解析、指针运算、数 组指针、函数指针、回调函数)、调试技巧、程序环境和预处理(翻译环境、运行环境、预定义符号、#define和#undef、宏和函 数、条件编译、文件包含)、 数据在内存中的存储、内存块分配、static、字符函数和字符串函数、自定义类型(结构体、枚举 、联合)、动态内存管理、文件操作(i/o常量、i/o函数、流)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值