liпсевдо

li

псевдо
RISC-V Ассемблер Ссылка

lyszt.net охватывает li и другие инструкции RISC-V более подробно.

Описание

li загружает константное число в регистр. Название означает load immediate (загрузить непосредственное значение), а непосредственное значение — это фиксированное значение, записанное прямо в коде. Следующая строка сохраняет 42 в t0.

li t0, 42

Большинство программ начинается с помещения известных чисел в регистры, включая счётчики, пределы и служебные коды.

Слово load происходит от аппаратного ограничения. Инструкция RISC-V имеет длину 32 бита и должна одновременно содержать операцию, регистры и константу. Одна инструкция не может вместить полную 32-битную константу. Малые константы помещаются, а большие — нет.

li обходит это ограничение. Это псевдоинструкция — имя, которое ассемблер заменяет на реальные инструкции, необходимые для данного значения. Малое значение требует одной инструкции. Большое значение требует двух: одна устанавливает старшую часть, а другая добавляет младшую часть, поэтому следующая строка работает для числа любого размера.

li t1, 0x10010000

Симулятор отображает реальные инструкции, в которые разворачивается li.

Руководство RISC-V описывает lui как инструкцию для построения 32-битных констант. Она помещает 20-битное значение в старшие биты регистра назначения и заполняет младшие 12 бит нулями.

li и la загружают разные вещи. li загружает число, которое вы ввели, а la загружает адрес, который обозначает метка. Пример загружает малое значение и большое, и ассемблер обрабатывает оба одинаково.

Разворачивается в

addi rd, zero, imm          # small constants
lui rd, hi  +  addi rd, rd, lo   # large constants

Ассемблер заменяет эту псевдоинструкцию реальной инструкцией или инструкциями, перечисленными выше.

Пример

li t0, 42
li t1, 0x10010000