0

私はアセンブリを学習していますが、理解できない行が含まれているこの関数があります。

. globl
. text

factR:
 cmpl $0 ,4(% esp )
 jne cont
 movl $1 ,%eax
 ret

cont :
 movl 4(%esp),%eax
 decl %eax
 pushl %eax          // (1)
 call factR          // (2)
 addl $4,%esp        // (3)
 imull 4(%esp),%eax 
 ret

それに対応するCコードは次のとおりです。

int factR ( int n ) {
    if ( n != 0 )
        return n;
    else
        return n ∗ factR ( n − 1 );
}

数字でマークされた行についてはよくわかりません。

  1. pushl %eax%eax:の内容を 入れるという意味%espですか?

  2. したがって、を呼び出しますfactR()。その結果は、%espここに戻って次の指示に戻ったときに発生しますか?

  3. addl $4,%espこれについてはよくわかりませんが、格納されている番号に%esp4を追加しますか、それとも次の番号などを取得するためにポインタに4を追加しますか?

4

1 に答える 1

3

factR()関数はC呼び出し規約(cdecl )に従っているようです。これは、呼び出し元が関数呼び出しの引数をスタックにプッシュし、関数が戻ったときに呼び出し元がスタックをクリーンアップする(関数呼び出しを行うために行われたスタックへの変更を元に戻す)場所です。

最初のプッシュ(1)は、%eaxレジスタの内容を次の呼び出しの引数として配置することです。次に、関数の実際の呼び出しが行われます(2)。%esp次に、スタックは、ステップ1で引数がプッシュバックされなかった状態にスタックポインターをリセットすることによってクリーンアップされます(3) 。32ビット値を1つプッシュしたため、ポインターを4バイト調整する必要があります。

于 2011-12-29T09:07:23.800 に答える