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

本文介绍了通过实验反汇编一个简单的C程序的过程。实验包括创建C源文件、编译生成可执行文件、查看程序返回值及简化并分析汇编代码。通过分析,读者可以了解C语言程序如何被转换成汇编指令。

实验一:反汇编一个简单的C程序

1.首先创建c文件 ,并编辑

2.编辑main.c文件

 3.编译main.c代码文件

4.生成目标文件a.out并查看程序的返回值

 

5.使用echo命令查看返回值,程序的返回值为38。

 6.打开main.s,main.s汇编文件还有一些“.cfi_”打头的字符串等等。简化一下代码,在VIM中,使用“g/\.s*/d”命令可以获得简化的汇编代码。

7.简化后的汇编代码

 

 

 6.汇编代码分析

g:
    pushl    %ebp      //将ebp的值压入栈内
    movl    %esp, %ebp    //将ebp寄存器同样指向esp寄存器指向的那块栈地址
    movl    8(%ebp), %eax    //将15压入eax栈中
    addl    $13, %eax    //执行15+13
    popl    %ebp
    ret


f:
    pushl    %ebp        //分配新的栈空间
    movl    %esp, %ebp
    subl    $4, %esp
    movl    8(%ebp), %eax      //将8(%ebp寄存器的内容压入eax栈中
    movl    %eax, (%esp)     //将eax寄存器中的内容存入(%esp)寄存器中
    call    g     //调用g函数
    leave
    ret


main:            //开始执行
    pushl    %ebp      //esp沿着地址递减的方向指向下一个存储单元,将ebp现在指向的存储    //单元的地址压入栈中
    movl    %esp, %ebp     //将ebp寄存器同样指向esp寄存器指向的那块栈地址
    subl    $4, %esp     //将esp寄存器的内容减4,向下一个帧移动
    movl    $15, (%esp)     //立即数15入栈
    call    f      //调用f函数
    addl    $1, %eax   //返回值+1
    leave
    ret

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值