1

誰かがアセンブリ言語で呼び出し先と呼び出し元を理解するのに役立つ実際の例を教えてもらえますか? 私はほとんどの情報源を調べてきましたが、それでも呼び出し先と呼び出し元を区別する方法がわかりません。前もって感謝します。(私はこの説明を追加しています - ありがとうございました! 私はここで新しいコードで申し訳ありませんが、適切に表示するコードを挿入する方法がわかりません) 私はこのコードを理解しようとしています - アセンブリの基本を学んでいます. 各コマンドにコメントを追加しようとしています(私のような他の誰かもそれを必要とするでしょう:

sub_401040      proc near               
.text:00401040
.text:00401040
.text:00401040 000                 push    ebp    ; Push the content of ebp register onto the stack
.text:00401041 004                 mov     ebp, esp    ;Allocating 8 bytes of storage ; move the esp register content into ebp register
.text:00401043 004                 push    ecx
.text:00401044 008                 mov     eax, [ebp+8]
.text:00401047 008                 push    eax    ; Push eax contents onto the stack
.text:00401048 00C                 call    ds:lstrlenA
.text:0040104E 008                 add     eax, [ebp+0Ch]
.text:00401051 008                 mov     edx, eax
.text:00401053 008                 mov     ecx, 1    ;Set buffer address
.text:00401058 008                 call    sub_401000
.text:0040105D 008                 mov     [ebp-4], eax
.text:00401060 008                 mov     ecx, [ebp-4]
.text:00401063 008                 shl     ecx, 2
.text:00401066 008                 mov     [ebp-4], ecx
.text:00401069 008                 mov     edx, [ebp-4]
.text:0040106C 008                 push    edx
.text:0040106D 00C                 push    offset aResultD ; "Result: %d\n"
.text:00401072 010                 call    ds:printf
.text:00401078 010                 add     esp, 8    ; clean up the stack by adding the size of the argument to esp register
.text:0040107B 008                 mov     eax, 539h
.text:00401080 008                 mov     esp, ebp
.text:00401082 004                 pop     ebp    ;Restore old frame pointer
.text:00401083 000                 retn        ; Return near
.text:00401083     sub_401040      endp

私は、呼び出し規約を定義するために、誰が呼び出し元で誰が呼び出し先であるかを把握する必要があることを読みました:)私はロジックを理解するのに多くの時間を費やしました: is call ds:lstrlenA は呼び出し先ですか? sub_401040 は発信者ですか? また、1 つのプログラムに複数の呼び出し規則を含めることはできますか? cdecl と stdcall が好きですか? 私はプログラマーではありませんし、コードを書いているわけでもありません。これがウイルスの分析にどのように役立つかを理解したいだけです。

4

3 に答える 3

0

呼び出し元は、関連するcall(またはrcall / blx / jalr / etc。関数呼び出し命令)を持つものであり、呼び出し先は呼び出されている関数です。

func:
    do_stuff

func2:
    call func

この例では、を呼び出すときfunc2func呼び出し元および呼び出し先func2と呼ばれます。func

命令が含まれていない限り、どの関数も呼び出し元または呼び出し先(または異なるコンテキストの両方)のいずれかになりますcall。後者の場合、それは「リーフ関数」と呼ばれ、いくつかの最適化が適用される場合があります。

于 2013-02-19T07:42:12.937 に答える
0

関数/サブルーチン A が他の関数/サブルーチン B を呼び出す場合、A が呼び出し元で B が呼び出し先です。B が C を呼び出すと、B は C の呼び出し元になり、C は B の呼び出し先になります。したがって、見方によっては、B は呼び出し元と呼び出し先の両方になります。

于 2013-02-19T07:43:16.507 に答える
0

アセンブリ言語では、関数呼び出しは単純なジャンプ (別名 goto) と大差ありません。唯一の違いは、関数パラメーターはジャンプを行う前によく知られている場所に保存されるため、関数はそれらを読み取って使用できることです。パラメータの 1 つは、通常、関数が作業を完了した後にジャンプするアドレス、いわゆる「戻りアドレス」です。このアドレスにジャンプする前に、関数は戻り値を既知の場所に格納する場合があります。

したがって、呼び出し元は、パラメーターを保存するコードの一部であり、既知の場所であり、関数の先頭へのジャンプを呼び出し、関数がジャンプして戻った後、既知の場所から戻り値を読み取ります。

呼び出し先は関数自体、つまりコードの一部であり、既知の場所からパラメーターを読み取り、それらに基づいて何らかの作業を実行し、戻り値を既知の場所に格納し、提供された戻りアドレスを使用して呼び出し元に戻ります。

于 2013-02-19T07:46:24.290 に答える