3

あるクラスで、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よりも正確ではありませんか?

私は何が欠けていますか?

4

2 に答える 2