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