Zuse 0 29 июня, 2023 Опубликовано 29 июня, 2023 · Жалоба Всем привет. Коллеги изучаю стартап файл для 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 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 29 июня, 2023 Опубликовано 29 июня, 2023 · Жалоба В gcc ассемблере (хрустальный шар подсказал) в этом месте степень двойку указывается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 29 июня, 2023 Опубликовано 29 июня, 2023 · Жалоба .align 1 /* Align to a 2-byte (2^1) boundary */ .align 2 /* Align to a 4-byte (2^2) boundary */ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zuse 0 30 июня, 2023 Опубликовано 30 июня, 2023 (изменено) · Жалоба Спасибо! Еще в порядке ликбеза... Что значит "ax" и @function ? Изменено 30 июня, 2023 пользователем Zuse Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 30 июня, 2023 Опубликовано 30 июня, 2023 · Жалоба .section symbol attributes Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zuse 0 30 июня, 2023 Опубликовано 30 июня, 2023 (изменено) · Жалоба 1 hour ago, Сергей Борщ said: .section symbol attributes Про директивы придется читать самому, понятно Тогда вот еще вопрос, уже по существу. В тексте есть такие строчки: #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 указана константа, то в регистр попадает константа, а если метка, то в регистр попадает адрес метки. Я правильно понял? Изменено 30 июня, 2023 пользователем Zuse Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 1 июля, 2023 Опубликовано 1 июля, 2023 · Жалоба константа - она и в африке константа, что конкретно там подставляется gnu-gcc-gas по барабану., возьмет значение из листинга поданного на ассемблирование без вычислений и проверок если метка - то gnu-gcc-gas вычислит относительный адрес начала конкретной инструкции с меткой , и подставит в команду загрузки. На линковке MAP-таблицы подскажут в какие сегменты что пихать и что относительно чего было сассемблипрованно перед тем как слинковать бинарники в общем адресном пространстве, соответственно все джампы будут скоординированы правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться