Смущен местами памяти этого кода сборки Y86 - PullRequest
3 голосов
/ 19 июня 2009

У нас был кусок кода на 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 ?

Чего мне не хватает?

Ответы [ 2 ]

3 голосов
/ 19 июня 2009

Я не думаю, что pos добавляет к позиции. Это директива для размещения кода там.

Таким образом, «массив» начинается с позиции 13, а «сумма» начинается с 430. Это делает основной старт с 438, а для массива остается только 417.

Всегда полезно оставить небольшую комнату, чтобы внести изменения позже. Если позже вы захотите увеличить массив или добавить другую инструкцию, вам придется настроить директивы pos по всему коду. Это также спасает сумму от удушения, если при доступе к массиву произошла ошибка. Заполнение до 430 является более оборонительным.

1 голос
/ 19 июня 2009

Позвольте мне начать с того, что я не эксперт в Y86. Однако я написал много кода на ассемблере.

Вы, вероятно, правы, что .pos 413 будет точным (и правильным). Я полагаю, что ученик или учитель просто оставили «кучу места», чтобы освободить место для инструкций irmovl ... jump, чтобы избежать точного расчета необходимого места, как вы сделали.

Ваш образ мышления верен, и он показывает понимание материала, которым ваш инструктор должен быть доволен.

...