6

C ++、ATTアセンブリ

私は次のアセンブリコードを持っています:

push %ebp
mov  %esp, %ebp
sub $0x28, %esp
(...)

私の教科書は、(スタックの形成の一部として)%espから0x28を引くことにより、12バイトが変数に割り当てられると主張しています。スタックから10進数の40を引くと、12バイトが割り当てられるのはなぜですか?

4

2 に答える 2

5

これにより、スタックに40バイトが割り当てられます。ただし、ローカル変数以外の用途もあるので、残りは将来の関数呼び出しのアラインメントと引数に使用されると思います。

関数の引数もスタックで渡されるため、この関数が別の関数に渡したいもののためのスペースが必要です。を使用して呼び出しを実行するときにこのスペースを割り当てることは可能ですpushが、関数の最初に1回スペースを割り当て、mov後でデータを配置するために使用するのが一般的です。関数がローカル変数に12バイトを使用している場合、後で使用する関数の引数に最大28バイトが残ります。

また、位置合わせのために少し余分に割り当てられる可能性があります。Jerryが言及した変数の整列に加えて、多くのシステムはスタックポインターが特定の値に整列されることを期待しているため、関数呼び出しを行う場合はこれを保持する必要があります。32ビットシステムでは、これは多くの場合8バイトですが、この場合は16バイトになることもあります。

于 2013-02-13T05:34:06.710 に答える
3

あなたはあなたの本を読み間違えたのではないかと思いますが、読み間違えた場合は、本がこれについて間違っているように私には大いに見えます。

スタックポインタから40を引くと、40バイトが割り当てられます。これは必ずしも正確に正しいとは限りません1が、通常、それからの偏差はかなり小さくなります。


  1. たとえば、32ビットコードで8バイトのオブジェクトを割り当てる場合、8バイトのオブジェクトが8バイトのアラインメントを持つように、追加のスペース(合計12バイト)を割り当てることができます。同様に、32ビットコードでは、通常、スタックポインターを(少なくとも)32ビット単位でしか調整できないため、charローカル変数が1つある関数は、通常、スタックポインターから少なくとも4を減算して、そのためのスペースを確保します。
于 2013-02-13T05:29:24.980 に答える