Современная электроника №3/2026

ИНЖЕНЕРНЫЕ РЕШЕНИЯ 21 WWW.CTA.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА • № 3 / 2026 случае, когда константа по модулю  (!) невелика, для её записи в регистр уда- ётся обойтись одной инструкцией ADDI независимо от знака. Это при- ятный вывод, поскольку чаще всего в программах требуются именно такие «небольшие» константы. Пример 7 Рассмотрим ещё один вариант оптимизации. Существуют числа, содержащие в младшей части много нулей. Если в константе последние 12 бит нулевые, то Cl = 0, и прибав- лять её нет смысла. Пусть, например, нам требуется занести в x6 констан- ту 1000h. Тогда достаточно написать LUI x6, 1. Данная оптимизация, в отличие от предыдущей, встречается доволь- но редко. Но зато если Cl = 0, то вто- рую инструкцию можно пропустить. Подведём некоторые итоги по опи- санным выше примерам. Все возмож- ные варианты формирования значе- ния в регистре R (вместо R можно подставлять любой из регистров от x1 до x31) сведены в таблицу. В вариантах v1 и v2 используется только команда ADDI , в v4 – только LUI , а в общем случае v3 требуются оба слагаемых. Обращаем ваше вни- мание на разницу в инструкции ADDI в вариантах v1 и v3. Псевдоинструкция LI Для удобства программирования в языке ассемблер часто вводят- ся так называемые псевдоинструк- ции. Псевдоинструкция  – это запись некоторой формальной (не существу- ющей в системе команд процессо- ра) инструкции, которая заменяется одной или, реже, несколькими реаль- ными инструкциями. Пусть, напри- мер, требуется скопировать содержи- мое x6 в x7. Инструкция копирования в явном виде отсутствует в RISC-V, но указанное действие может быть лег- ко выполнено как ADDI x7, x6, 0. Записанную специфическую опе- рацию сложения легко понять: к x6 прибавляется константа 0 (т.е. фак- тически значение не меняется!), и результат помещается в x7. Ради удобства программирования и для повышения наглядности можно дого- вориться вместо такой операции вве- сти псевдоинструкцию mv , которая в нашем случае примет вид mv x7, x6. Встречая в тексте псевдоинструк- цию mv , транслятор легко преобра- зует её запись в текст реально суще- ствующей команды ADDI (подобное преобразование исходного текста программы принято называть препро- цессинг , т.е. обработка перед процес- сом трансляции). Примечание . Интуитивное пред- ставление, что сложение будет выпол- няться дольше, чем простое копиро- вание данных, как ни странно, не соответствует действительности. Даже в довольно старой модели про- цессора Intel 80386 команды ADD и MOV уже выполняются за одинако- вое число тактов [20]. К теме нашего обсуждения имеет непосредственное отношение псевдо- инструкция li ( L oad I mmediate). Вот конкретный пример: li x6, 9999h. Эту псевдоинструкцию принци- пиально невозможно заменить на какую-либо одну инструкцию RISC-V, потому что константа «не помещает- ся» в отведённые форматом 12 бит. Поэтому транслятор вынужден подо- брать эквивалентную последователь- ность команд, которая выполнит тре- буемое действие. Вместо раскрытия псевдоопера- ции li в документации стандарта [3, 4] записана «обтекаемая» фраза «Myriad Sequences», что можно пере- вести как «множество последователь- ностей». Очевидно, что речь идёт об отсутствии единого универсального решения для произвольного аргумен- та. В более подробном Атласе [7] име- ется намёк на устройство таких после- довательностей: они используют «как можно меньше инструкций» и рас- ширяются для RV32I как « lui and/or addi » (про RV64I речь пойдёт в сле- дующем разделе). По сути, это такое «архивированное» описание приве- дённой выше таблицы, вполне понят- ное посвящённым. Наличие псевдоинструкции li осво- бождает программиста от необходи- мости следить за особенностями кода констант. Так, в недавно вышедшей книге по ассемблеру RISC-V [21] рас- ширение знака в константах вооб- ще не рассматривается. Тем не менее особенности, связанные с расшире- нием знака в процессоре, от этого не исчезают. Поэтому, по мнению авто- ра, утверждение «введём псевдоин- струкцию li и забудем о деталях зада- ния констант» некорректно: помнить стоит хотя бы потому, что в других операциях, где псевдоинструкции не предусмотрены, программисту тоже будет необходимо грамотно задать непосредственный операнд (при этом, возможно, потребуется моди- фикация по правилам, описанным выше). В частности, именно такая ситуация возникает в логических инструкциях, когда в маске в 11-м бите находится 1. И ещё одно замечание. Препроцес- синг, по своей сути, есть обработка текста. Псевдоинструкция li заметно сложнее: надо выделить в строке тек- стовую запись константы, перевести её в двоичный код, разделить его на части и по получившимся значениям выбрать способ и сформировать под- ходящий к конкретному случаю фраг- мент из одной или двух строк . Меж- ду прочим, перед этим потребуется перевести старшую и младшую части двоичного числа обратно в текстовую форму. Таким образом, действия для псевдоинструкции li выходят дале- ко за рамки задачи преобразования одного текста в другой. Чтобы убедиться в правильности приведённого выше описания меха- низмов формирования констант, можно взять какое-то профессиональ- но написанное программное обеспе- Рис. 3. Реализация примера 5 в симуляторе Venus

RkJQdWJsaXNoZXIy MTQ4NjUy