lh

lh

RISC-V Ассемблер Ссылка

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

Формат кодирования

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Описание

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)