Перейти к содержанию
    

Пара вопросов по директивам ассемблера

Всем привет.

Коллеги изучаю стартап файл для RISC-V МК Миландра и кое-что непонятно в директивах к обработчику прерывания. 

  /* Trap vector */
  /*-------------*/
  // trap vector must be aligned on a 4-byte boundary
.section .ramfunc, "ax"
.align 2
.type trap_vector, @function
.globl trap_vector 

В комментариях сказано, что "trap vector must be aligned on a 4-byte boundary", но при этом .align 2

Почему 2 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В gcc ассемблере (хрустальный шар подсказал) в этом месте степень двойку указывается

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо!

Еще в порядке ликбеза...

Что значит  "ax"  и @function ?

Изменено пользователем Zuse

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Сергей Борщ said:

Про директивы придется читать самому, понятно

Тогда вот еще вопрос, уже по существу. В тексте есть такие строчки:

#define PLIC_ICC_ADDR  0x0C200004

...

la s4, PLIC_ICC_ADDR  // s4 = PLIC_ICC_ADDR

...

la s2, interrupt_table

...

interrupt_table:

...

Интересует, как работает псевдоинструкция la (load address). Я посмотрел, как она раскрывается и тут оказывается, что в разных источниках встречаются разночтения:

1)   lui rd, SYMBOL[31:12]

      addi rd, t0, SYMBOL[11:0]

2)  auipc rd, symbol[31:12]

     addi rd, rd, symbol[11:0]

В тексте, как видим, встречается использование псевдоинструкции с использованием в качестве symbol константы и метки. Таким образом выглядит все так, что если вместо symbol указана константа, то в регистр попадает константа, а если метка, то в регистр попадает адрес метки. Я правильно понял? 

Изменено пользователем Zuse

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

константа - она и в африке константа, что конкретно там подставляется gnu-gcc-gas по барабану., возьмет значение из листинга поданного на ассемблирование без вычислений и проверок

если метка - то gnu-gcc-gas вычислит относительный адрес начала конкретной инструкции с меткой , и подставит в команду загрузки. На линковке MAP-таблицы подскажут в какие сегменты что пихать и что относительно чего было сассемблипрованно перед тем как слинковать бинарники в общем адресном пространстве, соответственно все джампы будут скоординированы правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...