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

实验一:反编译一个简单的c语言程序

1.首先创建一个空的main.c文件
在这里插入图片描述将代码写入文件中,修改其中的参数:
在这里插入图片描述输入gcc -S -o main.s main.c -m32命令将代码反汇编,生成汇编文件main.s
分析main.s文件的代码,首先是g函数部分在这里插入图片描述调用函数是最开头的两句代码pushl %ebp 和 movl %esp,ebp是用来保护现场,将当前ebp保存的地址压栈保存,然后将栈指针esp的地址值赋给ebp,从而可以用寄存器ebp来使用栈,函数执行结束后使用popl %ebp代码将保存的ebp地址取出,从而还原现场。

movl 8(%esp),%eax是将地址esp+8处开始的数据给寄存器eax,结合c语言代码,取栈顶4字节大小的内容即代码中调用一个int变量x的过程
addl $12,%eax是将eax寄存器的内容加12,实现了x+12

再看函数f部分:
在这里插入图片描述此处subl $4,%esp,令栈指针esp的值减4从而在栈分配一个4字节大小的空间,然后用movl 8(%ebp),%eax和movl %eax,(%esp)从栈中取出变量x的值并将其存储在新分配的空间中,然后再使用call g来调用g函数,从而实现将参数x传递给函数g

最后看main函数:
在这里插入图片描述由于main函数中调用了f函数,同样使用subl $4,%ebp创建存储空间用来传递参数,movl $22,(%esp)便是将22作为要传递的参数储存在新开辟的空间中,然后调用f,由于函数f中将返回结果储存到了寄存器eax中,调用函数f后使用addl $22,(%eax)将返回结果加2从而实现f(22)+2的计算。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值