あるクラスで、Y86 に変換する必要がある C のコードがありました。これは、もちろん教師の修正を受けて、ある人によってボードに書かれました。
ただし、コードの最初の部分にあるメモリの場所と .pos ディレクティブを混乱させています。
int array[100], sum, i;
int main() {
sum = 0;
for(i = 0; i < 100; i++) {
array[i] = i;
sum += array[i];
}
}
.pos 0
irmovl Stack, %esp
rrmovl %esp, %ebp
jmp main
array:
.pos 430
sum: .long 0
i: .long 0
main:
// (rest of the code that doesn't really matter here)
このコードから私が理解していることは次のとおりです。
これは位置 0 ( .pos 0 ) で始まり、irmovl命令は 6 バイトかかるため、次のrrmovl命令は位置 6 で始まり、その命令は 2 バイトかかり、現在は位置 8 にいます。 .
jmp命令は 8 から始まる 5 バイトを使用し、現在位置は 13 です。
これで、配列の 100 個の整数を保持するためにスタック スペースを節約し、.pos 430 を使用して少なくとも 400 バイト (4 バイト * 100 整数) とさらに 17 個 (次の位置から現在の位置を引いた値 430) を保持するのは簡単です。 -13=17)。
現在位置は 430 で、sumを保持するためにさらに 4 バイト、 iを保持するためにさらに 4バイトを保存する必要があります。これは位置 438 に置かれます。
位置 438 で、プログラムのメイン コードが開始されます。
私の唯一の質問は単純です: 100 個の整数のスペースを保持するために.pos 430
を使用したのはなぜですか? それらすべてを保持するには、ちょうど 400 バイトしか必要ありません。.pos 413 (以前の位置は 13 であり、100 個の整数に 400 バイトが必要であるため、413) で十分であり、 .pos 430よりも正確ではありませんか?
私は何が欠けていますか?