lhu

lhu

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

lyszt.net охватывает lhu и другие инструкции 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

Описание

lhu читает полуслово (16 бит, или 2 байта) из памяти и обрабатывает его как беззнаковое. Он работает в паре с lh, и они различаются тем, как заполняют верхнюю половину регистра назначения. Оба читают 16 бит с одинаковой адресацией. Полуслова и форма адресации описаны на странице lh. Форма lhu показана ниже.

lhu rd, offset(rs1)

Регистр содержит 32 бита, поэтому 16-битная загрузка должна заполнить верхние 16. lh копирует знаковый бит на них, что сохраняет отрицательные числа отрицательными. lhu заполняет их нулями, что называется расширением нулями, поэтому результат всегда неотрицателен, от 0 до 65535. Буква u в названии обозначает беззнаковое чтение.

Данные решают, какой из них использовать. Выбирайте lh для значений, которые могут быть отрицательными, и lhu для значений, которые никогда не бывают отрицательными. Битовый шаблон 0xFFFF, загруженный с помощью lhu, равен 65535, а те же биты, загруженные с помощью lh, равны -1.

Руководство RISC-V определяет lhu как загрузку 16-битного значения из памяти и расширение его нулями до 32 бит перед сохранением в rd. Эффективный адрес — это регистр rs1 плюс 12-битное смещение со знаком.

Большинство 16-битных данных беззнаковые. Коды символов в некоторых текстовых кодировках, номера портов и контрольные суммы в сетевых данных, 16-битные форматы пикселей и поля длины в форматах файлов — примеры. Расширение знака дало бы неверное значение для любого из них, как только установлен верхний бит, поэтому lhu — правильная загрузка. Полуслова расположены на расстоянии 2 байта друг от друга, поэтому циклы по ним сдвигают адрес на 2.

Пример

.data
val: .half 0xffff
.text
la t0, val
lhu t1, 0(t0)   # t1 = 65535 (zero-extended)