4
void main(){
    int c;
    c = function(1, 2);
}

int function(int a, int b){
      char buf[10];
      a = a+b;
      return a;
}

アセンブリコード:

          main:
08048394:   push %ebp
08048395:   mov %esp,%ebp
08048397:   and $0xfffffff0,%esp
**0804839a:   sub $0x20,%esp   <-----------------------???????**
0804839d:   movl $0x2,0x4(%esp)
080483a5:   movl $0x1,(%esp)
080483ac:   call 0x80483b7 <function>
080483b1:   mov %eax,0x1c(%esp)
080483b5:   leave 
080483b6:   ret 
          function:
080483b7:   push %ebp
080483b8:   mov %esp,%ebp
080483ba:   sub $0x10,%esp
080483bd:   mov 0xc(%ebp),%eax
080483c0:   add %eax,0x8(%ebp)
080483c3:   mov 0x8(%ebp),%eax
080483c6:   leave 
080483c7:   ret 

私は16バイトで整列されていることを知っています
が、main()でint c(=4 byte) + 1(4byte) + 2(4byte) in function(1 ,2)ステートメントを呼び出します。

したがって、これの合計は12バイトです。しかし、メモリを調整することで、16バイトを検討します。

(sub 0x10, %esp)

なぜサブ0x20, %esp

4

1 に答える 1

4

この関数を考えてみましょう:

void main(){
    int c, d, e, f;
    c = function(1, 2, 3, 4);
    d =1;
    e = 2;
    f = 3;
}

それでも、これは 0x20 スペースを割り当てます。

ただし、ローカル変数または関数パラメーターを 1 つでも追加すると、すぐに 0x30 スペースが割り当てられます。

main 関数に何もなく、ステートメントが 1 つしかない場合を考えてみましょう。

int c = 1;

次に、この場合、0x10 スペースが割り当てられます。

ここにパターンが見えますか?システムは、最初にローカル変数にスペースを割り当てます。次に、関数パラメーター用のスペースを割り当てます。割り当てられるスペースは 0x10 に揃えられます。

これが、0x20 が表示される理由です。0x10 はローカル変数用で、別の 0x10 は関数パラメーター用です。

于 2013-10-27T03:29:32.460 に答える