linux程序背后执行,C语言背后的运行机制

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

实验代码

#include

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编译成汇编代码。

结果

5a8291f3bd108d585b8195ed1f1620ac.png

47619decb0e68c55076bf475d641ef96.png

acd4cd24497cba9050a5b18189a54acd.png

2ae58172be7d5f6de9b9e5ef17016b37.png

ce428ee2da913f4d2a298b4fd10c3086.png

逐行分析

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 返回

实验感悟

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

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值