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し、ゼロでない場合は、指定された場所にジャンプします。外側のループの前の命令が に、内側のループの直前の命令が に入れるので2、外側のループが 2 回実行され、内側のループが 3 回実行されます。ecx3ecx

ecx外側のループ (内側のループの for の初期化を除く) の唯一の命令は、内側のループの実行中に外側のループのカウンターを保存するために使用されていることmov %ecx, %esiに注意してください。mov %esi, %ecxesi

新しい質問に関して編集します(これを編集するのではなく、新しい質問をする必要があります):

ebp関数の最初に保存された変数を取得する場合を除いて、変更またはアクセスされることはないため、何が何であるかは問題ではありません。基本ポインタとして使用されているだけで、常に同じになります。

于 2013-08-11T20:44:25.623 に答える