lh
lyszt.net охватывает lh и другие инструкции RISC-V более подробно.
Формат кодирования
Описание
lh загружает полуслово из памяти. Байт — это 8 бит, и он имеет собственный адрес, что делает его наименьшей адресуемой единицей. Слово — это 4 байта, или 32 бита, а полуслово — половина этого: 2 байта, или 16 бит. lh читает 16 бит там, где lw читает 32. Адресация совпадает с lw: базовый регистр плюс постоянное смещение (см. страницу lw). Форма показана ниже.
lh rd, offset(rs1)
Регистр хранит 32 бита, поэтому 16-битная загрузка должна заполнить оставшиеся 16 бит. lh использует расширение знака. Она читает старший бит 16-битного значения, который обозначает знак числа со знаком, и копирует этот бит во все 16 верхних бит регистра. Значение сохраняет свой знак, поэтому 16-битное -3 приходит как 32-битное -3.
Используйте lh для знаковых 16-битных данных, таких как аудиосэмплы или показания датчиков, которые могут быть отрицательными. Его партнёр lhu, где u означает unsigned (беззнаковый), заполняет верх нулями, что подходит для данных, которые никогда не бывают отрицательными. Битовый шаблон 0x8000, загруженный с помощью lh, становится -32768, а загруженный с помощью lhu — +32768. Биты в памяти остаются теми же, и именно загрузка определяет значение.
Руководство RISC-V определяет lh как загрузку 16-битного значения из памяти и расширение его знаком до 32 бит перед сохранением в rd. Эффективный адрес — это регистр rs1 плюс 12-битное смещение, расширенное знаком. Доступ является естественно выровненным, когда его адрес делится на размер доступа в байтах, поэтому доступ к полуслову выровнен по чётным адресам.
Полуслова занимают 2 байта, поэтому массивы из них располагаются по смещениям 0, 2, 4, а указатель перемещается по ним, добавляя 2.
Пример
.data val: .half -5 .text la t0, val lh t1, 0(t0) # t1 = -5 (sign-extended)
