我正在教自己如何理解汇编代码,但需要一些帮助以确保我是否完全了解正在发生的事情。这是代码和我的评论。
编辑:什么参数将使这个功能"跳跃"一路走来?
我们在开始时有常规序言(此处未显示)。然后,我们在$ 0x804ae8d中存储%d%d,因为我在GDB中查看了这个值,那就是那里。
804989e: ba 8d ae 04 08 mov $0x804ae8d,%edx
80498a3: 8b 45 08 mov 0x8(%ebp),%eax
80498a6: 8d 4d f0 lea -0x10(%ebp),%ecx
80498a9: 89 4c 24 0c mov %ecx,0xc(%esp)
80498ad: 8d 4d f4 lea -0xc(%ebp),%ecx
80498b0: 89 4c 24 08 mov %ecx,0x8(%esp)
80498b4: 89 54 24 04 mov %edx,0x4(%esp)
80498b8: 89 04 24 mov %eax,(%esp)
我相信在这一点(下面)它正在设置两个基本上被用于该功能的参数。这是扫描那些,并比较第一个参数,看它是否大于1.如果它大于1,那么它会跳到下一个部分。
80498bb: e8 b0 f3 ff ff call 8048c70 <sscanf@plt>
80498c0: 83 f8 01 cmp $0x1,%eax
80498c3: 7f 05 jg 80498ca <level_2+0x32>
这里,它将两个参数加在一起并将它们加载到寄存器%eax中。然后在eax中比较这个新值,看它现在是否等于7100。
80498ca: 8b 55 f4 mov -0xc(%ebp),%edx
80498cd: 8b 45 f0 mov -0x10(%ebp),%eax
80498d0: 01 d0 add %edx,%eax
80498d2: 3d bc 1b 00 00 cmp $0x1bbc,%eax
80498d7: 74 07 je 80498e0 <level_2+0x48>
然而,我不太确定这里发生了什么。我可以看到它可能是第二个参数并将其加载到eax寄存器中。但是,我不确定和测试je的相关性。
80498e0: 8b 45 f4 mov -0xc(%ebp),%eax
80498e3: 8d 14 00 lea (%eax,%eax,1),%edx
80498e6: 8b 45 f4 mov -0xc(%ebp),%eax
80498e9: 21 d0 and %edx,%eax
80498eb: 85 c0 test %eax,%eax
80498ed: 74 07 je 80498f6 <level_2+0x5e>
而且,在这里,我不确切地知道正在做什么。虽然我怀疑在两个参数之间可能存在一些比较。
80498f6: 8b 55 f4 mov -0xc(%ebp),%edx
80498f9: 8b 45 f0 mov -0x10(%ebp),%eax
80498fc: 31 d0 xor %edx,%eax
80498fe: 85 c0 test %eax,%eax
8049900: 7e 05 jle 8049907 <level_2+0x6f>