1

我无法理解这段代码如何知道何时停止循环。我应该弄清楚将哪些值放入 %edi。但我不知道它循环了多少次。

0x40106e      movl   $0x2b,0xffffffdc(%ebp)
0x401075      movl   $0x31,0xffffffe4(%ebp)
0x40107c      movl   $0x74,0xffffffec(%ebp)
0x401083      movl   $0x19,0xffffffe8(%ebp)
0x40108a      movl   $0x7,0xffffffd8(%ebp)
0x401091      movl   $0x14,0xffffffe0(%ebp)
0x401098      mov    $0xdead,%edi
0x40109d      mov    $0x2,%ecx
0x4010a2      mov    %ecx,%esi
0x4010a4      mov    $0x3,%ecx
0x4010a9      mov    $0x2,%ebx
0x4010ae      sub    %esi,%ebx
0x4010b0      imul   $0xc,%ebx,%ebx
0x4010b3      mov    $0x3,%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    $0xbeef,%edi

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

4

1 回答 1

3

loop指令递减,然后ecx,如果它不为零,则跳转到指定位置。外循环之前的指令放入2ecx内循环之前的指令放入3ecx因此外循环将执行两次,内循环将执行三遍。

请注意,外循环中的唯一指令(除了ecxfor 内循环的初始化)是mov %ecx, %esimov %esi, %ecx-esi用于在内循环运行时保存外循环的计数器。

编辑关于你的新问题(你真的应该问一个新问题而不是编辑这个问题):

无关紧要,ebp因为除了获取函数开头保存的变量外,它从未被修改或访问过。它只是用作基指针,并且总是相同的。

于 2013-08-11T20:44:25.623 回答