2022-2023-1 20222816《Linux内核原理与分析》第二周作业

一、反汇编C程序

1、创建.c文件,然后编辑.c文件

2.编写程序

编写完成后按ESC,然后输入“:+wq”退出。

3.编译完成后,查看编译结果

gcc+文件名.c,生成一个目标文件a.out

4.把.c文件编译成一个汇编代码(.s文件),可以使用如下命令:

5.汇编代码如下:

 6.通过输入g/\.s*/d可以删除所有以"."打头的字符串,获得“干净”的汇编代码。

 7.分析汇编代码

(1)汇编代码分别对应3个函数:main函数、f函数、g函数。

(2)汇编指令中新出现两个指令:

        lever指令:撤销函数堆栈。   enter指令:建立函数堆栈。

(3)代码分析:

       1. EIP寄存器是指向代码段中的一条条指令,即20222816.s中的汇编指令,从“main.c”开始,他会自动加一,调用call指令时它会修改EIP寄存器。EBP寄存器指向栈底,ESP寄存器指向栈顶。EAX寄存器用于暂存一些数值,函数的返回值默认使用EAX寄存器存储并返回给上一级调用函数。

      2.  程序从main函数开始执行(上述18行):

                                 

        18行“push%ebp”把EBP寄存器的值压栈,可以理解为0。

        19行代码:将EBP寄存器指向标号1的位置。

        20:把ESP寄存器-4,实际上ESP向下移动一个标号,指向2的位置。

        21:把数8放入ESP寄存器指向的标号2的位置

        22:call f执行

        10:EBP和ESP指向栈空间4的位置

 9.10和18.19语句完全一样,所以函数的头两条指令用于初始化函数自己的函数调用堆栈空间。

        11.ESP-4指向下一个位置栈空间的标号5

        12.把立即数8放到EAX寄存器中。

        13.把EAX寄存器中存储的立即数8放到ESP寄存器现在所指的位置5.

        14.call g

        4.将函数g的参数取出

        5.立即数3加到EAX寄存器里,就是8+3,EAX寄存器为11.

        6.7拆除g函数堆栈,并返回到调用函数g的位置。

        15.撤销函数堆栈

        16.ret把ESP指向3的位置的内容

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值