@SergeySerge11

Зачем нужно выравнивание больше чем двойное машинное слово? Директива p2align 4 и более?

Забыл где прочел. по асемблеру arm или(и) risc. Цитата, примерно так
"Мы создает таблицу векторов прерываний, всего их 86, каждый по 4 байта" 86*4=356, ближайшая степень 2 512, 9. значит применяем директиву выравнивания p2align 9 А зачем что-то там вообще выравнивать? Вроде как все и так выровнено)
Вот ни разу не понимаю. Вроде понимаю зачем нужно выравнивание на высоком уровне(с++/с#) при работе с структурами.( при 1-8 байт данных). Но к примеру почему по 512. А я больше видел.
Типа машинной слово 4 байта. Ну или если нужно 8. Но зачем больше? Значит если любые данные выравнивать по 4 байта. То следующая команда, переменная будет всегда выравнена по 4. А зачем по 512?
Почему нужно 512-356 байт нулями заполнять, почему нельзя продолжить дальше. Ведь следующая после 86*4 байт инструкция(или переменная) будет выровнена, и иметь валидный адрес так же как и при align 3,4 и более/
Не много подумал посчитал, может в этом дело. Короче, если начальный адрес данных выровнен по n битов, то эти следующие n бит могут быть индексами элементов внутри. А значит для получения элемента допустим table[index_nBit] можно применять операцию ИЛИ вместо сложения. Что быстрее. В этом ли дело
.data
.p2align 9 
  table_interputs:
   .word 1
   .word 2
#......... .word 86
что бы получить элемент table_interputs[10], если младшие 9 бит==0 то можно начальный адрес младшие биты установить индексом*scale, вместо более долгой операции сложения
Верно ли рассуждаю
  • Вопрос задан
  • 132 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему нужно 512-356 байт нулями заполнять, почему нельзя продолжить дальше. Ведь следующая после 86*4 байт инструкция(или переменная) будет выровнена

А вот еслы бы ты тупо взял и прочитал документацию на директиву .p2align, то у тебя таких вопросов не было бы. Потому что никто не заполняет 512-356 байт после. .p21lign выравнивает текущий адрес по заданной степени двойки. Обычно для этого есть аппаратные причины, например базовый регистр таблицы векторов прерываний может иметь 9 младших бит зафиксированных в 0. Или вот по границе страницы MMU выравнивают данные в ELF-файлах, чтобы можно было установить отдельно разрешения RX для кода и констант и RW для изменяемых данных.

для получения элемента допустим table[index_nBit] можно применять операцию ИЛИ вместо сложения. Что быстрее. В этом ли дело

Нет, не в этом.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы