Современная электроника №3/2026
ИНЖЕНЕРНЫЕ РЕШЕНИЯ 22 WWW.CTA.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА • № 3 / 2026 чение и убедиться, что для загрузки константы в регистр действитель - но может потребоваться несколько команд. Автору кажется самым про - стым, быстрым и универсальным путем обратиться к онлайн-симуля - тору Venus (https://venus.kvakil.me/) . Работа с ним не потребует никаких дополнительных знаний и предвари - тельной подготовки. Воспользуемся тем, что Venus под - держивает псевдооперацию li . Набе - рём на странице редактора програм - мы ( Editor ) любой из примеров 2…7 в виде строки li x6, const (где const – это требуемое итоговое значение десятичной константы; напомним, что перед шестнадца - теричным значением необходимо добавлять символы 0x ). Изучим пока - занную на странице выполнения ( Simulator ) результирующую програм - му и убедимся в том, что Venus рабо - тает в полном соответствии с постро - енной выше таблицей. Результаты пошагового выполне - ния (режим Step ) для примера 5 при - ведены на рис. 3. Итоговую констан - ту можно посмотреть в правой части окна в регистре x6. Константы 64 бита в RISC-V Стандарт RISC-V предусматривает не только 32-битную, но и 64-битную и даже 128-битную архитектуры. Рас - ширение, как подчёркивается в стан - дарте, делается в основном ради уве - личения адресного пространства ОЗУ, что позволит наращивать его объ - ём. Касательно размера данных 2 32 = = 4 294 967 296 представляет собой вполне достаточную для практики величину (вспомните также первый эпиграф к статье). Если в отдельных задачах потребуется бо́льшая разряд - ность, то программисты умеют с этим справляться. Например, на основе 32-битных данных реализована нео - граниченная целочисленная арифме - тика в языке Python [22]. Кратко рассмотрим формирование 64-битных констант в архитектуре RV64I. Она сохраняет все инструк - ции набора RV32I и добавляет к нему 15 дополнительных инструк - ций. Подчеркнём, что инструкции в RV64I по-прежнему имеют размер 32 бита . Разрядность регистров процессо - ра увеличивается до 64 бит, а зна - чит, нужно иметь механизм загруз - ки констант такого размера. Как уже упоминалось ранее, последователь - ность инструкций при формирова - нии констант «пунктирно намече - на» в Атласе RISC-V [7]. Для 64-битной константы там рекомендована серия из 8 инструкций. Первые две повто - ряют задание 32-битной константы ( LUI и ADDI ), что подробно обсужда - лось выше. Далее предлагается триж - ды повторить пару инструкций SLLI (сдвиг влево) и ADDI . Такой алгоритм позволяет постепенно (за три шага) заполнить оставшиеся 32 бита. При - ятным обстоятельством служит тот факт, что прибавлять за один раз достаточно 10–11 бит, так что знако - вый разряд можно не трогать. Следо - вательно, формирование 64-битной константы не приводит к появлению новых вариантов, связанных с расши - рением знака. В то же время для неко - торых значений констант, особенно при наличии в них большого числа нулей, количество инструкций мож - но сократить. Кроме того, в зависи - мости от конструкции машины, вме - сто выполнения 8 (!) предложенных инструкций может оказаться быстрее прочитать одной командой готовую константу из ОЗУ. Заключение На основе проведённого детального рассмотрения вариантов формирова - ния константы в регистрах процессо - ров стандарта RISC-V можно сформу - лировать следующие выводы. Любая константа заносится в 32-бит - ный регистр по частям; старшая Ch содержит 20 бит, а младшая Cl – 12. Занесение младшей части констан - ты Cl в регистр выполняется с помо - щью инструкции ADDI . Операнд для неё всегда получается «механиче - ским» выделением младших 12 бит (3 последние шестнадцатеричные цифры в константе). Для занесения старшей части кон - станты Ch в регистр используется инструкция LUI , В качестве начально - го значения её операнда берутся стар - шие 20 бит (5 первых шестнадцате - ричных цифр из 8 в полной записи 32-битного числа). Конечное значение зависит от состояния старшего (11-го) бита в Cl . Если в этом бите 1, то Ch приходится корректировать, прибав - ляя к нему 1. В противоположном слу - чае коррекция не требуется. Причиной появления указанной неоднозначности служит обязатель - ность расширения знака непосред - ственного операнда во всех опера - циях, в том числе в ADDI . Из-за этого старшие биты могут стать ненулевы - ми и изменить итоговую сумму. Здесь трудности программирования возни - кают вследствие упрощения аппарат - ной конструкции. В общем случае (вариант v3 в табли - це) константа заносится в регистр двумя инструкциями: сначала LUI , а затем ADDI . Когда значение кон - станты по модулю мало (варианты v1 или v2), то Ch = 0 и команда LUI не нужна (операнд rs1 в ADDI при этом меняется на x0). Это очень важ - ный и часто встречающийся на прак - тике случай. Есть ещё довольно ред - кий вариант v4, в котором Cl = 0; тогда исключается команда ADDI . Подчеркнём, что 11-й бит в млад - шей части константы выделен исклю - чительно форматом инструкций. Все разговоры о знаке Cl носят формаль - ный характер. Более того, бит этот не следует путать с «настоящим» знаком итогового значения константы в 31-м бите. Существует псевдоинструкция li , которая «скрывает» все перечислен - ные выше варианты от программи - ста. Она позволяет написать любую константу и быть уверенным, что компилятор подберёт инструкции, обеспечивающие правильный резуль - тат. По мнению автора, понимать существующие в RISC-V особенности формирования констант всё равно требуется, хотя бы для того, чтобы не ошибиться там, где нет псевдоин - струкций. Литература 1. Касперски К. ПК: решение про - блем. СПб.: БХВ-Петербург, 2003. 560 с. 2. Столлингс В. Структурная орга - низация и архитектура компью - терных систем. М.: Издательский дом «Вильямс», 2002. 896 с. 3. Waterman A., Lee Y., Patterson D.A., Asanović K. The RISC-V Instruction Set Manual, Volume I: User-Level ISA, Version 2.1. Technical Report No. UCB/EECS-2016-118. May 31, 2016. URL: https://www2.eecs . berkeley.edu/Pubs/TechRpts/2016/ EECS-2016-118.pdf. 4. The RISC-V Instruction Set Manual. Volume I: Unprivileged Architecture. Version 20250508. URL: https://docs.riscv.org/
RkJQdWJsaXNoZXIy MTQ4NjUy