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

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

1.通过如下图所示命令创建mian.c文件
在这里插入图片描述
2通过在mian.c文件中输入如下程序
在这里插入图片描述
3.执行反汇编命令gcc –S –o mian.s mian.c 得到mian.s文件
在这里插入图片描述
在这里插入图片描述
4.通过命令g/\.s*/d得到一下代码
在这里插入图片描述
5.通过对反汇编代码分析可知
g 函数:
pushq %rbp:将当前函数的栈帧基址指针(%rbp)的值推入堆栈,保存了之前的栈帧的基址。
movq %rsp, %rbp:将当前栈顶指针(%rsp)的值复制到栈帧基址指针(%rbp),建立了一个新的栈帧。
movl %edi, -4(%rbp):将传入的参数 %edi 的值保存到当前栈帧的相对地址为 -4(%rbp) 的位置上,这是局部变量的存储位置。
movl -4(%rbp), %eax:将局部变量的值加载到 %eax 寄存器中。
addl $1, %eax:将 %eax 中的值加1,然后保存回 %eax。
popq %rbp:将之前保存的栈帧基址指针恢复,恢复之前的栈帧。
ret:从函数返回,弹出调用栈并跳回到调用者。

f 函数:
pushq %rbp:保存调用者的栈帧基址指针。
movq %rsp, %rbp:建立新的栈帧。
subq $8, %rsp:分配8个字节的空间,用于局部变量或临时数据的存储。
movl %edi, -4(%rbp):将传入的参数 %edi 的值保存到当前栈帧的局部变量中。
movl -4(%rbp), %eax:将局部变量的值加载到 %eax 寄存器中。
movl %eax, %edi:将 %eax 中的值复制给 %edi 寄存器,这是用于调用 g 函数的参数。
call g:调用 g 函数。
leave:释放当前函数的栈帧,等效于 movq %rbp, %rsp 以及 popq %rbp。
ret:从函数返回。

main 函数:
pushq %rbp:保存调用者的栈帧基址指针。
movq %rsp, %rbp:建立新的栈帧。
movl $101, %edi:将立即数 101 作为参数加载到 %edi 寄存器中。
call f:调用 f 函数。
addl $2, %eax:将 %eax 中的值加2,这是函数 f 的返回值。
popq %rbp:恢复调用者的栈帧基址指针。
ret:从 main 函数返回。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值