Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / C语言背后的运行机制

目的:通过分析C语言转换成汇编代码后的执行过程对汇编语言和X86构架有一个初步认识实验代码#include <stdio.h>int g(int x)
{
    return x + 3;
}int f(int x)
{
    return g(x);
}int main(void)
{
    return f(8) + 1;
}实验过程编译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 跳转到函数ff: pushl %ebp 栈顶向上,开辟出一块新的内存,将栈底的内存地址放到栈顶(运算完成时函数能跳转回来) movl %esp,%ebp 将esp寄存器的值赋给给ebp,使栈底向上移一位 subl $0x4,%esp 将栈顶向上移动一位 movl 8(%ebp),(%eax)将8这个数字赋给eax寄存器(eax用于函数返回值使用) movl %eax,(%esp)将eax的值写入内存 call g 跳转到函数gg: pushl %ebp 栈顶向上,开辟出一块新的内存,将栈底的内存地址放到栈顶(运算完成时函数能跳转回来) movl %esp,%ebp 将esp寄存器的值赋给给ebp,使栈底向上移一位 movl 8(%ebp),%eax 将8赋给eax addl $3,eax 执行8+3 popl %ebp 退栈 ret 返回函数ff: leave 删除为函数参数建立的空间 ret 返回main函数main: addl $1,%eax eax+1 leave 删除为函数参数建立的空间 ret 返回实验感悟 在计算机中通过对内存堆栈的操作函数的执行,跳转和参数的传递。另外通过对学习汇编能让我们理解程序运行的机制,帮助我们写出精简的代码,提高效率。本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-03/128961.htm