高小糕୧⍤⃝️ 2023-12-11 15:50 采纳率: 0%
浏览 7
已结题

bomblab实验phase4怎么完成

尤其是下面的func4功能是什么,最后输入哪两个值可以成功?

img

Dump of assembler code for function phase_4:
   0x0000000000401040 <+0>:    sub    $0x18,%rsp
   0x0000000000401044 <+4>:    lea    0xc(%rsp),%rcx
   0x0000000000401049 <+9>:    lea    0x8(%rsp),%rdx
   0x000000000040104e <+14>:    mov    $0x402821,%esi
   0x0000000000401053 <+19>:    mov    $0x0,%eax
   0x0000000000401058 <+24>:    callq  0x400c30 <__isoc99_sscanf@plt>
   0x000000000040105d <+29>:    cmp    $0x2,%eax
   0x0000000000401060 <+32>:    jne    0x40106e <phase_4+46>
   0x0000000000401062 <+34>:    mov    0xc(%rsp),%eax
   0x0000000000401066 <+38>:    sub    $0x2,%eax
   0x0000000000401069 <+41>:    cmp    $0x2,%eax
   0x000000000040106c <+44>:    jbe    0x401073 <phase_4+51>
   0x000000000040106e <+46>:    callq  0x4015b9 <explode_bomb>
   0x0000000000401073 <+51>:    mov    0xc(%rsp),%esi
   0x0000000000401077 <+55>:    mov    $0x6,%edi
   0x000000000040107c <+60>:    callq  0x401008 <func4>
   0x0000000000401081 <+65>:    cmp    0x8(%rsp),%eax
   0x0000000000401085 <+69>:    je     0x40108c <phase_4+76>
   0x0000000000401087 <+71>:    callq  0x4015b9 <explode_bomb>
   0x000000000040108c <+76>:    add    $0x18,%rsp
   0x0000000000401090 <+80>:    retq   


Dump of assembler code for function func4:
   0x0000000000401008 <+0>:    push   %r12
   0x000000000040100a <+2>:    push   %rbp
   0x000000000040100b <+3>:    push   %rbx
   0x000000000040100c <+4>:    mov    %edi,%ebx
   0x000000000040100e <+6>:    test   %edi,%edi
   0x0000000000401010 <+8>:    jle    0x401036 <func4+46>
   0x0000000000401012 <+10>:    mov    %esi,%ebp
   0x0000000000401014 <+12>:    mov    %esi,%eax
   0x0000000000401016 <+14>:    cmp    $0x1,%edi
   0x0000000000401019 <+17>:    je     0x40103b <func4+51>
   0x000000000040101b <+19>:    lea    -0x1(%rdi),%edi
   0x000000000040101e <+22>:    callq  0x401008 <func4>
   0x0000000000401023 <+27>:    lea    (%rax,%rbp,1),%r12d
   0x0000000000401027 <+31>:    lea    -0x2(%rbx),%edi
   0x000000000040102a <+34>:    mov    %ebp,%esi
   0x000000000040102c <+36>:    callq  0x401008 <func4>
   0x0000000000401031 <+41>:    add    %r12d,%eax
   0x0000000000401034 <+44>:    jmp    0x40103b <func4+51>
   0x0000000000401036 <+46>:    mov    $0x0,%eax
   0x000000000040103b <+51>:    pop    %rbx
   0x000000000040103c <+52>:    pop    %rbp
   0x000000000040103d <+53>:    pop    %r12
   0x000000000040103f <+55>:    retq   

img

  • 写回答

16条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-12-11 15:58
    关注
    获得0.60元问题酬金

    引自强大而免费的微信小程序:皆我百晓生

    首先我们对代码进行逐行注释:

    funtion func4:    # func4函数开始
    
    push %r12         # 保存寄存器r12的值
    push %rbp         # 保存寄存器rbp的值
    push %rbx         # 保存寄存器rbx的值
    
    mov %edi,%ebx     # 将edi的值存入ebx中
    test %edi,%edi    # 判断edi的值是否为零
    jle 0x401036 <func4+46>    # 如果edi的值小于等于零,则跳转到地址0x401036(或者可以理解为相对当前指令的第46字节处)
    
    mov %esi,%ebp     # 将esi的值存入ebp中
    mov %esi,%eax     # 将esi的值存入eax中
    cmp $0x1,%edi     # 将立即数0x1和edi的值进行比较
    je 0x40103b <func4+51>    # 如果相等,则跳转到地址0x40103b(或者可以理解为相对当前指令的第51字节处)
    
    lea -0x1(%rdi),%edi   # 将-0x1加上rdi的值的结果存入edi中
    callq 0x401008<func4>   # 调用func4函数(递归调用)
    lea (%rax,%rbp,1),%r12d   # 计算rax+rbp的值,并将结果存入r12d中
    lea -0x2(%rbx),%edi   # 将-0x2加上rbx的值的结果存入edi中
    mov %ebp,%esi   # 将ebp的值存入esi中
    callq 0x401008 <func4>   # 调用func4函数(递归调用)
    add %r12d,%eax   # 将r12d的值与eax的值相加,并将结果存入eax中
    jmp 0x40103b <func4+51>   # 无条件跳转到地址0x40103b(或者可以理解为相对当前指令的第51字节处)
    
    mov $0x0,%eax    # 将立即数0x0存入eax中
    pop %rbx         # 恢复寄存器rbx的值
    pop %rbp         # 恢复寄存器rbp的值
    

    关于函数的功能,根据代码的逻辑,可以看出这是一个递归函数。它递归地调用自身两次,并进行一些运算。具体来说:

    • 如果edi的值小于等于零,则函数直接返回。
    • 如果edi的值等于1,则函数返回esi的值。
    • 如果edi的值大于1,则函数进行递归调用,并将结果与一些计算结果相加后返回。

    最后,要想成功地完成phase4实验,需要输入的两个值是edi=7esi=0

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月19日
  • 修改了问题 12月11日
  • 修改了问题 12月11日
  • 赞助了问题酬金15元 12月11日
  • 展开全部