1

我是组装新手,真的不知道发生了什么。

我正在尝试完成一项家庭作业,其中我们必须通过找出程序五个阶段的正确输入来拆除炸弹。

我试过在网上寻找我的问题的答案,但我真的不知道要搜索什么来找到我正在寻找的答案。

我相信我理解下面代码中从<+0>到的所有内容<+35>。在<+40>cmp 运算符被调用来比较$0x2, 和存储在%eax寄存器中的内容。在比较时,我相信%eax仍在存储对 scanf 的函数调用(如果我错了,请纠正我)。

通过使用 gdb,我知道 scanf 函数的调用如下: scanf("%d %d", &x, &y);

那么在这种情况下到底$0x2指的是什么(它只是值 2?)以及比较这两个项目时发生了什么?

我相信这是 GAS 语法。

   0x0804870a <+0>:     sub    $0x2c,%esp
   0x0804870d <+3>:     lea    0x1c(%esp),%eax
   0x08048711 <+7>:     mov    %eax,0xc(%esp)
   0x08048715 <+11>:    lea    0x18(%esp),%eax
   0x08048719 <+15>:    mov    %eax,0x8(%esp)
   0x0804871d <+19>:    movl   $0x8048baa,0x4(%esp)
   0x08048725 <+27>:    mov    0x804b040,%eax
   0x0804872a <+32>:    mov    %eax,(%esp)
   0x0804872d <+35>:    call   0x8048480 <__isoc99_fscanf@plt>
   0x08048732 <+40>:    cmp    $0x2,%eax
   0x08048735 <+43>:    je     0x8048743 <phase_1_of_5+57>
   0x08048737 <+45>:    movl   $0x1,(%esp)
   0x0804873e <+52>:    call   0x80486ef <explode>
   0x08048743 <+57>:    mov    0x18(%esp),%eax
   0x08048747 <+61>:    mov    %eax,%edx
   0x08048749 <+63>:    shl    $0x5,%edx
   0x0804874c <+66>:    add    %edx,%eax
   0x0804874e <+68>:    cmp    0x1c(%esp),%eax
   0x08048752 <+72>:    je     0x8048760 <phase_1_of_5+86>
   0x08048754 <+74>:    movl   $0x1,(%esp)
   0x0804875b <+81>:    call   0x80486ef <explode>
   0x08048760 <+86>:    add    $0x2c,%esp
   0x08048763 <+89>:    ret
4

1 回答 1

1

与 JE 和相关说明的常见混淆。我建议使用调试器来可视化代码在做什么。

cmp 在内部进行减法,但实际上它检查 eax == 2。如果 eax == 2 JE (JUMP IF EQUAL),它会跳转,因此 EIP 寄存器(执行的下一条指令)变为 0x08048743(“phase_1_of_5+57”的内存地址)。如果 eax != 2,它会跳过 JE 忽略它。

剧透在您练习自己并再次陷入困境之前不要阅读此内容:

所以我们看一下http://www.tutorialspoint.com/c_standard_library/c_function_fscanf.htm。fscanf 做什么。我们看到返回值 2 意味着它需要 2 个输入项。现在我们假设我们输入了两个术语,现在我们遵循 JE。

我们看到了(这就是为什么你需要一个调试器来可视化它)

mov    0x18(%esp),%eax
...
cmp    0x1c(%esp),%eax

0x18 == 6th value on the stack
0x1c == 7th value on the stack
safe to assume these are the two input terms.

0x08048743 <+57>:    mov    0x18(%esp),%eax
0x08048747 <+61>:    mov    %eax,%edx
0x08048749 <+63>:    shl    $0x5,%edx
0x0804874c <+66>:    add    %edx,%eax

这里我们可以假设化解炸弹的方法是在第一项的 5 处输入左移,添加到第一项。到第二学期。

所以 0 0 应该化解它。

于 2016-02-24T22:20:52.183 回答