三七与二十一 2024-06-11 23:08 采纳率: 0%
浏览 7
已结题

二进制炸弹的fp是什么

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/3398a93f44d44bf6b034ef5f4abc7387.png "

我在解二进制炸弹第四阶段的递归时,对主函数中的片段的理解如下:


  8bc4:    e3530002     cmp    r3, #2
  8bc8:    1a000005     bne    8be4 <phase_4+0x50>

........
 8be4:    eb000275     bl    95c0 <explode_bomb>

输入的第一个数必须是2,否则会爆炸

    8bcc:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec 
    8bd0:    e3530002     cmp    r3, #2
    8bd4:    da000002     ble    8be4 <phase_4+0x50> 第二个数要大于等于2
    8bd8:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec
    8bdc:    e3530007     cmp    r3, #7  第二个数要小于7
    8be0:    da000000     ble    8be8 <phase_4+0x54>
    8be4:    eb000275     bl    95c0 <explode_bomb>

第二个数必须在[2,7)之间,但是输入了所有组合后却没有能成功的,请问是我的这个思路错了吗?
是我对fp的理解错了吗,我认为fp-8是输入的第一个数,fp-20输入的是第二个数

附上完整的phase_4以及递归函数func4

00008b10 <func4>:
    8b10:    e92d4810     push    {r4, fp, lr}
    8b14:    e28db008     add    fp, sp, #8
    8b18:    e24dd00c     sub    sp, sp, #12
    8b1c:    e50b0010     str    r0, [fp, #-16]
    8b20:    e50b1014     str    r1, [fp, #-20]    ; 0xffffffec
    8b24:    e51b3010     ldr    r3, [fp, #-16]
    8b28:    e3530000     cmp    r3, #0
    8b2c:    ca000001     bgt    8b38 <func4+0x28>
    8b30:    e3a03000     mov    r3, #0
    8b34:    ea000013     b    8b88 <func4+0x78>        r3小于等于08b38:    e51b3010     ldr    r3, [fp, #-16]                r3大于0 将r3传入[fp-16]
    8b3c:    e3530001     cmp    r3, #1                        r3与1进行比较
    8b40:    1a000001     bne    8b4c <func4+0x3c>

    8b44:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec        等于1将r3传入[fp-20],return
    8b48:    ea00000e     b    8b88 <func4+0x78>        

    8b4c:    e51b3010     ldr    r3, [fp, #-16]
    8b50:    e2433001     sub    r3, r3, #1
    8b54:    e1a00003     mov    r0, r3
    8b58:    e51b1014     ldr    r1, [fp, #-20]    ; 0xffffffec
    8b5c:    ebffffeb     bl    8b10 <func4>
    8b60:    e1a02000     mov    r2, r0
    8b64:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec
    8b68:    e0824003     add    r4, r2, r3
    8b6c:    e51b3010     ldr    r3, [fp, #-16]
    8b70:    e2433002     sub    r3, r3, #2
    8b74:    e1a00003     mov    r0, r3
    8b78:    e51b1014     ldr    r1, [fp, #-20]    ; 0xffffffec
    8b7c:    ebffffe3     bl    8b10 <func4>
    8b80:    e1a03000     mov    r3, r0
    8b84:    e0843003     add    r3, r4, r3
    8b88:    e1a00003     mov    r0, r3
    8b8c:    e24bd008     sub    sp, fp, #8
    8b90:    e8bd8810     pop    {r4, fp, pc}

00008b94 <phase_4>:
    8b94:    e92d4800     push    {fp, lr}
    8b98:    e28db004     add    fp, sp, #4
    8b9c:    e24dd020     sub    sp, sp, #32
    8ba0:    e50b0020     str    r0, [fp, #-32]    ; 0xffffffe0
    8ba4:    e51b0020     ldr    r0, [fp, #-32]    ; 0xffffffe0
    8ba8:    e59f1074     ldr    r1, [pc, #116]    ; 8c24 <phase_4+0x90> “%d %d”
    8bac:    e24b2018     sub    r2, fp, #24
    8bb0:    e24b3014     sub    r3, fp, #20
    8bb4:    ebfffe92     bl    8604 <_init+0x50>   ; 8604:    e28fc600     add    ip, pc, #0, 12
    8bb8:    e1a03000     mov    r3, r0
    8bbc:    e50b3008     str    r3, [fp, #-8]
    8bc0:    e51b3008     ldr    r3, [fp, #-8]
    8bc4:    e3530002     cmp    r3, #2
    8bc8:    1a000005     bne    8be4 <phase_4+0x50>
    8bcc:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec 
    8bd0:    e3530002     cmp    r3, #2
    8bd4:    da000002     ble    8be4 <phase_4+0x50> 第二个数要大于等于2
    8bd8:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec
    8bdc:    e3530007     cmp    r3, #7 第二个数要小于7
    8be0:    da000000     ble    8be8 <phase_4+0x54>
    8be4:    eb000275     bl    95c0 <explode_bomb>
    8be8:    e3a03005     mov    r3, #5
    8bec:    e50b3010     str    r3, [fp, #-16]
    8bf0:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec 取第二个数
    8bf4:    e51b0010     ldr    r0, [fp, #-16]  ; r0=5
    8bf8:    e1a01003     mov    r1, r3        ;r1=r3
    8bfc:    ebffffc3     bl    8b10 <func4>            
    8c00:    e1a03000     mov    r3, r0        
    8c04:    e50b300c     str    r3, [fp, #-12] 
    8c08:    e51b3018     ldr    r3, [fp, #-24]    ; 0xffffffe8 
    8c0c:    e51b200c     ldr    r2, [fp, #-12]    ;r2 = [fp, #-12]    
    8c10:    e1520003     cmp    r2, r3
    8c14:    0a000000     beq    8c1c <phase_4+0x88>
    8c18:    eb000268     bl    95c0 <explode_bomb>
    8c1c:    e24bd004     sub    sp, fp, #4
    8c20:    e8bd8800     pop    {fp, pc}
    8c24:    000098a0     .word    0x000098a0

  • 写回答

17条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-11 23:10
    关注

    引自免费微信小程序:皆我百晓生

    你的理解基本是正确的,fp 是帧指针(frame pointer),它用于跟踪函数调用时的局部变量。在这个二进制炸弹的 phase_4 中,fp-8 存储的是第一个参数,fp-20 存储的是第二个参数。

    根据给定的汇编代码,phase_4 首先检查第二个参数是否在 [2, 7) 的范围内,然后调用 func4 函数。func4 函数是一个递归函数,它似乎计算两个数的某种组合(可能是斐波那契序列)。

    你的问题可能出在对 func4 函数的理解上。func4 接受两个参数,一个递减的计数器(r3),以及一个累加器(r1)。当计数器为 1 时,函数返回累加器的值。否则,它递归调用自身两次,每次递减计数器并更新累加器。

    为了找出正确的输入,我们需要更深入地分析 func4。考虑到递归的性质,可以尝试手动或编写代码来模拟 func4 的行为,以找到满足条件的输入。我将为你提供一个 Python 模拟代码:

    def func4(counter, accumulator):
        if counter <= 0:
            return accumulator
        elif counter == 1:
            return accumulator
        else:
            return func4(counter - 1, accumulator + counter) + func4(counter - 2, accumulator + (counter - 1))
    
    # 模拟 phase_4 的输入检查
    def check_phase_4(input1, input2):
        if input1 != 2 or not (2 <= input2 < 7):
            print("Boom! Bomb exploded.")
            return False
        result = func4(input2, 0)
        if result != 5:
            print("Boom! Bomb exploded.")
            return False
        return True
    
    # 测试不同的输入
    for i in range(2, 7):
        if check_phase_4(2, i):
            print(f"Solution found: Input 2 and {i}")
            break
    

    这段代码将模拟 phase_4 并检查输入是否正确。请注意,由于 func4 实现的复杂性,可能需要一些时间来运行。如果发现有误,可能需要调整递归函数的实现以更准确地匹配给定的汇编代码。

    请运行上述代码,看看是否能找到正确的输入值。如果代码有任何问题或未能找到解决方案,请告知,我会进一步协助。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月14日
  • 修改了问题 6月11日
  • 修改了问题 6月11日
  • 创建了问题 6月11日