c语言背后的运行机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 返回

实验感悟

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

以上是关于c语言背后的运行机制的主要内容,如果未能解决你的问题,请参考以下文章

解析c语言背后的汇编代码

关于对OC运行时机制的理解

C语言代码片段

Java异常处理机制

PHP底层的运行机制与原理

ios开发新手浅谈强大的runtime机制