3

ローカル変数を宣言すると、FILO であるスタックに格納されることが知られています。しかし、これらの変数がどのようにスタックにプッシュされるかを示す図を描くように求められました。さて、サンプルコードが与えられたので、私は少し混乱しました:

int giveMe_Red(int *xPos, int *yPos)
{
   int count = 0;
   int *nextpos, ifTreped;
   int loc[8] = {0};
   .
   .
   .
   .
   return count;
}

配列やポインターなど、すべての変数がどのようにメモリに格納されるかを理解するのを手伝ってくれませんか。レベル 0 で「カウント」してから、スタックのレベル 1 で「* nextpos」などと言ってください。再帰がある場合、それらはどのように保存されますか?

4

2 に答える 2

3

詳細はプロセッサによって異なりますが、たとえば x86 では、通常、すべての変数のスタック領域は、1 回の減算で一度に割り当てられますesp。標準プロローグは

push ebp                ; Save old base pointer
mov  ebp, esp           ; Mark current base pointer
sub  esp, stack_space   ; Allocate stack space

エピローグは

mov esp, ebp            ; Free stack space
pop ebp                 ; Reload old base pointer
ret                     ; Return to caller

あなたの場合、必要なスペースは(32ビットで、それらがすべてローカルであると仮定して)

  • 4 バイトcount
  • 4 のためのnextPos
  • 4 のためのifTreped
  • locアレイの場合は 4*8

合計 44 バイト (+ 保存に必要なスペースの 4 ebp)。

の後に、 のsub esp, 44すべての要素をゼロにするコードがありますloc

編集

gcc で確認したところ、割り当てられたスペースは 48 バイト (44 バイトではありません) のようです。理由はわかりませんが、おそらくスタック アライメントの理由によるものです。

于 2013-09-30T06:42:33.407 に答える