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)