我知道此问题有多种版本,但是在提供给我的代码中找不到能帮助我理解功能4的汇编代码的版本。这不是为了做作业,因为现在是夏天,课程已经结束,而是让我了解自己做错了什么的方法(而且我的教授不是最有用的)。
根据我收集到的信息,我知道将使炸弹爆炸的输入将是两个类型为'%d'的值。我还注意到,其中一个值必须等于或小于4。这是因为之前调用过的比较语句很少。从用户扫描的值减去了2的值,然后将其与2的值进行比较。如果它不小于或等于2,则不会跳过动臂线并且不会超过动臂线。 。因此,这意味着0xc(%rsp)中的值必须为4或以下。
我认为函数4应该执行某种类型的递归,但是我对正在发生的事情感到非常困惑。我非常确定该函数的输出应该与0x8(%rsp)中的其他输入值相同,因为该值与寄存器%eax中存储的值(func4的输出)进行了比较。
因此,我对函数4中到底发生了什么以及该问题的解决方案感到困惑。
Dump of assembler code for function phase_4:
0x000000000040102e <+0>: sub $0x18,%rsp
0x0000000000401032 <+4>: lea 0xc(%rsp),%rcx
0x0000000000401037 <+9>: lea 0x8(%rsp),%rdx
0x000000000040103c <+14>: mov $0x402819,%esi
0x0000000000401041 <+19>: mov $0x0,%eax
0x0000000000401046 <+24>: callq 0x400c10 <__isoc99_sscanf@plt>
0x000000000040104b <+29>: cmp $0x2,%eax
0x000000000040104e <+32>: jne 0x40105c <phase_4+46>
0x0000000000401050 <+34>: mov 0xc(%rsp),%eax
0x0000000000401054 <+38>: sub $0x2,%eax
0x0000000000401057 <+41>: cmp $0x2,%eax
0x000000000040105a <+44>: jbe 0x401061 <phase_4+51>
0x000000000040105c <+46>: callq 0x401544 <boom>
0x0000000000401061 <+51>: mov 0xc(%rsp),%esi
0x0000000000401065 <+55>: mov $0x5,%edi
0x000000000040106a <+60>: callq 0x400ff6 <func4>
0x000000000040106f <+65>: cmp 0x8(%rsp),%eax
0x0000000000401073 <+69>: je 0x40107a <phase_4+76>
0x0000000000401075 <+71>: callq 0x401544 <boom>
0x000000000040107a <+76>: add $0x18,%rsp
0x000000000040107e <+80>: retq
Dump of assembler code for function func4:
0x0000000000400ff6 <+0>: push %r12
0x0000000000400ff8 <+2>: push %rbp
0x0000000000400ff9 <+3>: push %rbx
0x0000000000400ffa <+4>: mov %edi,%ebx
0x0000000000400ffc <+6>: test %edi,%edi
0x0000000000400ffe <+8>: jle 0x401024 <func4+46>
0x0000000000401000 <+10>: mov %esi,%ebp
0x0000000000401002 <+12>: mov %esi,%eax
0x0000000000401004 <+14>: cmp $0x1,%edi
0x0000000000401007 <+17>: je 0x401029 <func4+51>
0x0000000000401009 <+19>: lea -0x1(%rdi),%edi
0x000000000040100c <+22>: callq 0x400ff6 <func4>
0x0000000000401011 <+27>: lea (%rax,%rbp,1),%r12d
0x0000000000401015 <+31>: lea -0x2(%rbx),%edi
0x0000000000401018 <+34>: mov %ebp,%esi
0x000000000040101a <+36>: callq 0x400ff6 <func4>
0x000000000040101f <+41>: add %r12d,%eax
0x0000000000401022 <+44>: jmp 0x401029 <func4+51>
0x0000000000401024 <+46>: mov $0x0,%eax
0x0000000000401029 <+51>: pop %rbx
0x000000000040102a <+52>: pop %rbp
0x000000000040102b <+53>: pop %r12
0x000000000040102d <+55>: retq
预先感谢您的帮助!我轻轻松松地完成了前三个阶段,所以我想知道我在哪里出错了!
编辑:
更多地查看了代码之后,我相信这可能是对类似于斐波那契序列的某种表达。函数4返回两次,一次返回值减一,第二次返回值减二。 (x-1)+(x-2)类型的情况(因为添加了这些值然后返回。)
我仍然对应该如何编造可以使炸弹消散的价值感到困惑。