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

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

1、使用vim test1.c命令打开vim编辑器,以test1.c为名创建文件

2、编写一个简单的程序后,使用:wq保存并退出编译。

 3、执行反汇编命令gcc –S –o mian.s mian.c得到test1.s文件,删除所有.开头的行得到纯汇编代码即:

 
  1. g:

  2. pushq %rbp

  3. movq %rsp, %rbp

  4. movl %edi, -4(%rbp)

  5. movl -4(%rbp), %eax

  6. addl $20, %eax

  7. popq %rbp

  8. ret

  9. f:

  10. pushq %rbp

  11. movq %rsp, %rbp

  12. subq $8, %rsp

  13. movl %edi, -4(%rbp)

  14. movl -4(%rbp), %eax

  15. movl %eax, %edi

  16. call g

  17. leave

  18. ret

  19. main:

  20. pushq %rbp

  21. movq %rsp, %rbp

  22. movl $50, %edi

  23. call f

  24. subl $50, %eax

  25. popq %rbp

  26. ret

4、通过和ChatGPT深入了解代码及相关知识

问题:请详细解释上述汇编代码。

答:

这段汇编代码看起来是一个简单的x86-64汇编语言程序,它定义了三个函数:gf 和 main。以下是对每个函数的详细解释:

函数 g

 
  1. g:

  2. pushq %rbp ; 保存调用者的栈帧

  3. movq %rsp, %rbp ; 设置当前栈帧

  4. movl %edi, -4(%rbp) ; 将第一个参数 %edi 存储在栈帧中的偏移 -4(%rbp) 处

  5. movl -4(%rbp), %eax ; 从栈帧中加载值到寄存器 %eax

  6. addl $20, %eax ; 将 20 添加到 %eax

  7. popq %rbp ; 恢复调用者的栈帧

  8. ret ; 返回,将结果存储在 %eax 中

函数 g 接受一个整数参数,并将参数值加上 20,然后将结果存储在 %eax 寄存器中,并通过 ret 指令返回。

函数 f

 
  1. f:

  2. pushq %rbp ; 保存调用者的栈帧

  3. movq %rsp, %rbp ; 设置当前栈帧

  4. subq $8, %rsp ; 在栈上分配 8 个字节的空间

  5. movl %edi, -4(%rbp) ; 将第一个参数 %edi 存储在栈帧中的偏移 -4(%rbp) 处

  6. movl -4(%rbp), %eax ; 从栈帧中加载值到寄存器 %eax

  7. movl %eax, %edi ; 将 %eax 中的值赋给 %edi 寄存器

  8. call g ; 调用函数 g,g 的返回值存储在 %eax 中

  9. leave ; 恢复调用者的栈帧并释放栈空间

  10. ret ; 返回,将结果存储在 %eax 中

函数 f 接受一个整数参数,将该参数传递给函数 g,并将 g 的返回值作为自己的返回值。在执行之前,它在栈上分配了8个字节的空间。

函数 main

 
  1. main:

  2. pushq %rbp ; 保存调用者的栈帧

  3. movq %rsp, %rbp ; 设置当前栈帧

  4. movl $50, %edi ; 将值 50 存储在 %edi 寄存器中

  5. call f ; 调用函数 f,f 的返回值存储在 %eax 中

  6. subl $50, %eax ; 将 %eax 中的返回值减去 50

  7. popq %rbp ; 恢复调用者的栈帧

  8. ret ; 返回,将结果存储在 %eax 中

函数 main 首先将整数值 50 存储在 %edi 寄存器中,然后调用函数 f,将 f 的返回值存储在 %eax 中。接下来,它从 %eax 中减去 50,最后返回结果。

整个程序的目的似乎是计算 g(f(50)) - 50 的值,并将结果存储在 %eax 中。

然后是与ChatGPT的相关对话:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值