li
псевдо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
