lhu
lyszt.net охоплює lhu та інші інструкції RISC-V більш детально.
Формат кодування
Опис
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)
