我在理解此代码如何知道何时停止循环时遇到了麻烦。我应该弄清楚%edi中放了什么值。但是我不知道它循环了多少次。

0x40106e      movl   q4312078qx2b,0xffffffdc(%ebp)
0x401075      movl   q4312078qx31,0xffffffe4(%ebp)
0x40107c      movl   q4312078qx74,0xffffffec(%ebp)
0x401083      movl   q4312078qx19,0xffffffe8(%ebp)
0x40108a      movl   q4312078qx7,0xffffffd8(%ebp)
0x401091      movl   q4312078qx14,0xffffffe0(%ebp)
0x401098      mov    q4312078qxdead,%edi
0x40109d      mov    q4312078qx2,%ecx
0x4010a2      mov    %ecx,%esi
0x4010a4      mov    q4312078qx3,%ecx
0x4010a9      mov    q4312078qx2,%ebx
0x4010ae      sub    %esi,%ebx
0x4010b0      imul   q4312078qxc,%ebx,%ebx
0x4010b3      mov    q4312078qx3,%edx
0x4010b8      sub    %ecx,%edx
0x4010ba      lea    0xffffffd8(%ebp),%eax
0x4010bd      lea    (%ebx,%edx,4),%ebx
0x4010c0      add    %ebx,%eax
0x4010c2      mov    (%eax),%edi
0x4010c4      loop   0x4010a9
0x4010c6      mov    %esi,%ecx
0x4010c8      loop   0x4010a2
0x4010ca      mov    q4312078qxbeef,%edi


编辑:我现在了解循环逻辑。但是,在跟踪所有值时,我很难过。我被卡在这里lea 0xffffffd8(%ebp),%eax
我怎么知道%ebp是什么?

评论

我建议您写有关yr edit的新问题

“ lea 0xffffffd8(%ebp),%eax”-> eax = ebp + 0xffffffd8,或“ eax = ebp-0x28”。 ebp将在函数的前面设置。它通常看起来像“ mov%esp,%ebp / sub $ ,%esp”,因此ebp指向调用者的返回地址,而ebp下方是局部变量的空间。它的物理值只能由调试器在运行时确定。可以通过在反汇编中更早地确定它的相对值。

#1 楼

代码中有2个循环:


0x40109d mov $ 0x2,%ecx0x4010a2 mov%ecx,%esi
0x4010a4 mov $ 0x3,%ecx0x4010a9 mov $ 0x2,%ebx
...
第一个循环
...
0x4010c4循环0x4010a9
0x4010c6 mov%esi,%ecx
第二个循环
0x4010c8循环0x4010a2




当3在0x4010a4移至%ecx时,第一个循环进行了三遍
第二个循环在2x在0x40109d移至%ecx中时进行了两次在进一步在第一个循环内使用%ecx之前,保存在%esi处。

此外,这里是有关LOOP操作码的信息


0x4010ba lea 0xffffffd8(%ebp) ,%eax


,这意味着%eax通过计算%ebp + 0xffffffd8


0x4010bd lea(%ebx,%edx, 4),%ebx


这是%ebx =%ebx +%edx * 4


0x4010c0添加%ebx,%eax的地方


这里的%ebx是添加到%eax


0x4010c2 mov(%eax),%edi


最后%edi获取%eax指向的数据。 br />
一个小的asm参考。

评论


谢谢,这对我来说是一个好的开始!但是我现在很难弄清楚%edi中包含哪些值。您能解释一下这里发生的情况吗:lea 0xffffffd8(%ebp),%eax

– duder
13年8月11日在21:07