1

多くの例では、C 関数 (並べ替えアルゴリズムのシェルの並べ替えなど) をコンパイルすると、スタックアドレス (呼び出されると思いますか?) ebp-4 / -4(%ebp) / [ebp]-4 など、私が理解しているように、通常は最初のローカル変数に使用されますが、私の場合は使用されません。

そのため、ローカル変数やその他のことには使用されないため、誰かがそれが何に使用されるかを知っているかどうか疑問に思っていました。

さらに、スタック ポインターから 20 が減算され、ロケール変数にスタック スペースが割り当てられますが、値は -24(%ebp) に保存されます。

c関数は次のようになります。

void shellsort(int a[], unsigned int n) {
    unsigned int gap, i, j;
for (gap = n / 2; gap > 0; gap = gap == 2 ? 1 : 5 * gap / 11) {
        for (i = gap; i < n; i++) {
            int tmp = a[i];
            for (j = i; j >= gap && tmp < a[j - gap]; j -= gap)
                a[j] = a[j - gap];
            a[j] = tmp;
        }
    }
}

そして、これはgcc -S32 ビット Ubuntuを使用した私のスタックです

 12(%ebp)  = n
 8(%ebp)   = a[]
 -8(%ebp)  = tmp
 -12(%ebp) = j
 -16(%ebp) = i
 -20(%ebp) = gap
 -24(%ebp) = (gap * 4) + gap

前もって感謝します :)

4

2 に答える 2

1

x86 ではebp、通常、フレーム ポインターとして使用されesp、スタック ポインターです。フレーム ポインタの周りには、呼び出し元のフレーム ポインタとリターン アドレスが保存されます。それはギャップを説明することができます。私のアセンブリでは実際に-4(%ebp)が使用されているため、別の ABI を見ている可能性がありますが、スタック管理には常にギャップがあるはずです。

-20スタック ポインターからの減算と引き続きアクセスについて-24(%ebp): アセンブリにはおそらくpushafter がmovl %esp, %ebpあり、追加の 4 バイトを占めます。

于 2013-06-17T12:05:43.143 に答える