Linux内核分析1

实验目的是通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的,深入了解存储程序计算机工作原理

C程序源代码如下

int g(int x)
{
    return x + 2;
}

int f(int x)
{
    return g(x);
}

int main(void)
{
    return f(3) +1;
}
在自己的CentOS虚拟机经过反汇编,去除其他信息后的汇编代码如下

使用命令行

gcc main.c -S -o main.s -m32

删除其他内容之得到后的汇编指令如下



逐条分析汇编指令

g:

          pushl     %ebp                当前函数调用基址压栈

          movl      %esp,%ebp          esp指向esp

这两步目的是初始化本函数的调用堆栈

          movl      8(%ebp),%eax       ebp上8位指向的地址赋给eax寄存器

获取参数

          addl      $2,%eax            eax寄存器+2

执行指令

          popl      %ebp                ebp出栈

          ret                            

功能是通过清理本函数的调用堆栈返回函数调用之前代码继续执行

f:

          pushl     %ebp                当前函数调用基址压栈

          movl      %esp,%ebp          esp指向ebp

初始化

          subl      $4,%esp            esp减4

          movl      8(%ebp),%eax      ebp+8指向的值赋给eax

          movl      %eax,(%esp)        eax赋给esp指向的值

          call      g                   调用g

          leave

清理g的调用堆栈

          ret                            返回函数调用之前代码继续执行

main:

          pushl     %ebp                当前函数调用基址压栈

          movl      %esp,%ebp          esp指向ebp

          subl      $4,%esp            esp减4

          movl      $3,(%esp)          esp指向的内存地址存储的数值+3

执行函数

          call      f                   执行f函数

          addl      $1,%eax            eax寄存器指向的地址+1

          leave

清理调用堆栈

          ret  函数返回



总结

存储程序计算机一步步从寄存器读取并执行指令,通过操作寄存器和内存实现指令结果的输出。

函数调用堆栈展示了计算机调用函数的过程。

王靖志原创作品转载请注明出处 

Powered by

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值