2017-11-14 5 views
0

後、私は次のコードで探しています:アセンブリ:継続的な呼び出し

cmp edx edx 
jle loc_40234 
call some_func 
add eax, eax 

私は理解しようとしている何を(することはできません、それはLOCではありませんので、私も四行目に達することができる方法ですジャンプした)、それはすぐに関数呼び出しに続く。つまり、そのコールはジャンプのようなものですか?

編集:私は基本的な考えを理解しています。私は指定する必要があります:このコードはsome_funcの一部です(ループです)。

+0

'some_func'の中のコードが' call some_func'を実行すると、それは "再帰"と呼ばれる論理パターンを形成します。 CPUはfunc /手続きのコンセプトに気づいていないので気をつけません。命令通りに命令をジャンプします。再帰が深すぎると、スタックは格納されたリターンアドレスからオーバーフローします(各 'コール)。 – Ped7g

+0

もう一度、ありがとう! –

答えて

5

cmp edx,edxは、edxとそれ自身を比較するので、常に「等しい」であり、常にjleとなります。

callは、(それが今までに実行された場合、いくつかの他のコードがcallの命令で、または既に「それ以上」の条件として評価するために、設定されたフラグとjle命令に直接ジャンプしなければならない)、このコードパスから到達していないことになります。

callは、技術的にはjmpのようなものです。次の命令(add)のスタックアドレスにプッシュしますので、some_funcのコードがこのアドレスを何とかスタックからジャンプして使用します(最も一般的な機能はret命令で終了します)。それに戻りアドレスであり、スタックの内容が破損せずスタックポインタが正しい場合)、addに到達します。

もちろん、addに戻るとsome_funcコードをチェックせずに言うことはできません。

関連する問題