laпсевдо

la

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

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

Описание

la загружает адрес чего-либо в регистр. Этот адрес — это ячейка памяти, а значение, хранящееся в этой ячейке, — это нечто отдельное. Название расшифровывается как load address (загрузить адрес).

Когда вы резервируете данные в памяти, вы даёте им имя, например arr или msg, что избавляет вас от отслеживания необработанных чисел-адресов. Это имя — метка, читаемая замена адреса памяти. Следующая строка загружает адрес, помеченный меткой arr, в t0. Она предоставляет местоположение, с которого начинается массив, и не читает содержимое массива.

la t0, arr

Инструкции загрузки и сохранения (lw, sw и остальные) принимают адрес, хранящийся в регистре. Прежде чем вы сможете прочитать или записать именованные данные, их адрес должен находиться в регистре, и la помещает его туда. Чтение значения требует двух инструкций. la находит, где находятся данные, а lw читает то, что там находится.

Руководство по RISC-V описывает auipc как инструкцию для построения адресов относительно pc. В нём сказано, что auipc, за которым следует загрузка или сохранение с 12-битным смещением, может достичь любого 32-битного адреса данных относительно pc.

Адрес и его содержимое различаются так же, как различаются указатель и значение. После того как адрес находится в регистре, вы добираетесь до отдельных элементов, добавляя к нему смещения. В примере адрес фрагмента текста загружается в a0, что требуется службе печати строк. Ей нужно сообщить, где находится текст, и она читает текст оттуда. la — это псевдоинструкция, которую ассемблер строит из пары настоящих инструкций.

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

auipc rd, hi(label)
addi  rd, rd, lo(label)

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

Пример

.data
msg: .string "hi"
.text
la a0, msg     # a0 = address of msg