У нас был кусок кода на C в одном классе, где нам нужно было преобразовать его в Y86, и он был написан на доске каким-то парнем с поправкой учителя, конечно.
Однако я путаю области памяти и директивы .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 занимает 5 байтов, начиная с 8, теперь мы находимся в позиции 13.
Теперь принято экономить пространство стека для хранения 100 целых чисел для массива , и для этого мы используем .pos 430 для хранения не менее 400 байтов (4 байта * 100 целых чисел) и еще 17 ( следующая позиция минус текущая, 430-13 = 17).
Сейчас мы находимся в позиции 430, и нам нужно сохранить еще 4 байта для хранения суммы и еще 4 для хранения i , что ставит в позицию 438.
В позиции 438 начинается главный код нашей программы.
Мне кажется, я все понял правильно, мой единственный вопрос прост:
Почему мы использовали .pos 430 для хранения места для 100 целых чисел? Нам нужно только ровно 400 байтов для их хранения. Разве .pos 413 (поскольку предыдущая позиция была 13 и нам нужно 400 байтов для 100 целых чисел, то есть 413), было бы достаточно и более правильно, чем .pos 430 ?
Чего мне не хватает?